一、进制与0,1
- 计算机上都是以0,1来存储的
- 一位十六进制数用四位二进制数表示,8位二进制表示一个字节,字节是计算机管理的最小单元,所以2位十六进制数表示一个字节,我们平时用工具打开二进制文件,都是用十六进制显示,2位就是一个字节
- 计算机存储一个数据可以有不同的数据宽度
- 数据宽度:一般常用有Byte(字),Word(字)、Dword(双字)、DDword(四字)。分别为8位、16位,32位,64位
- 八进制的2-3等于多少,详见day02.3-逻辑运算
二、PE文件结构
-
PE文件结构只限于windows操作系统,windows上运行的任何一个可执行的程序都应该遵循的结构。所以PE结构适用于windows上任何可执行程序
-
如果想分析知道别人写的程序,至少应该知道三件事:1.程序从哪里开始执行;2.数据藏在哪里;3.程序藏在哪里
-
如何分析一个PE文件:
-
一堆密密麻麻的十六进制数,从哪位开始的多少长度表示的数值是文件的某些信息,下面举一个例子初步分析一下
-
文件的起始位置:在PE文件的0x3c处开始往后的4字节。注意:windows系统中数据存储方式是低位在前、高位在后,比如一个文件用二进制的方式打开,如果找到表示文件起始位置的数显示为e8 00 00 00,这个显示的格式是按照windows存储方式,但是现实中我们写、读书是从高位到低位,所以这里应该读作00 00 00 e8,即文件的起始位置在0xe8。(由于计算机存储最小单位是1个字节,即2位十六进制,所以每两位十六进制当做一个整体读,即00、e8当做整体,不能写成00 00 00 8e)
-
找到0x3c在哪里的方法:如下有两种方法。进而我们可以找到文件的起始位置
-
注意文件的起点不等于程序运行的起点,只是文件的数据信息存储的起点
-
-
分析PE文件结构的工具:打开工具帮我们分析会大大减少我们的工作量,但是一定要知道PE中的一些关键信息:比如程序的入口点,代码入口点,数据入口点,输入表,输出表,资源表。
-
所以如果PE学好,你给我一个exe文件,我差不多就可以大体的知道它的结构和功能等,接着就可以在特定位置给PE文件注入病毒等操作,或者修改其中的一些信息,所以外挂和注入病毒就是这么来的
-
但是如果给PE文件加壳,可以打乱PE文件的结构和数字,让别人无法直接下手;或者反调试,别人用一些调试工具打开,程序立马退出等
-
注意一点内容:你用工具分析出来的文件的某结构的地址是多少,只是文件还没执行时的相对于文件初识地址的地址,但是如果一旦将程序运行,由于文件将要加载到内存中,所以所有工具显示的地址都会发生变化,实际上的地址应该是文件整体加载到内存中的基地址+文件某结构的基地址。比如工具显示PE文件的代码基址为0x00001000,镜像基址为0x00400000,所以此时代码基址在实际在内存的地址应该为代码基址+镜像基址。
三、硬编码
- 比如用PE查看器–>找到了代码段起始地址–>找到了第一个函数,由很多的二进制,工具显示的是十六进制数构成,那么每一个数字代表什么含义,我们如果把数字转化为我们更容易理解的汇编语言:比如如果显示55,根据硬编码可以知道55如果用汇编语言表示:则是push ebp;再比如8bec用汇编表示为mov ebp,esp。如果学过汇编语言则就知道这段函数是干什么用的
四、逆向的过程
- 二进制–>汇编–>C语言
- 从一堆看不懂的二进制数,转换成可以看懂的汇编语言,再还原成高级代码
五、初级阶段需要完成的项目
-
反汇编引擎(任何逆向分析工具必备模块)
-
PE分析器(外挂、反外挂、破解、病毒、反病毒基础)
-
游戏案例逆向分析或者加密壳
-
商业软件开发模板(登录界面,进程注入,网络验证,隐藏模块,代码加密)