专题6-二进制代码分析a2z

上传人:ji****72 文档编号:48523524 上传时间:2018-07-16 格式:PPT 页数:128 大小:2.26MB
返回 下载 相关 举报
专题6-二进制代码分析a2z_第1页
第1页 / 共128页
专题6-二进制代码分析a2z_第2页
第2页 / 共128页
专题6-二进制代码分析a2z_第3页
第3页 / 共128页
专题6-二进制代码分析a2z_第4页
第4页 / 共128页
专题6-二进制代码分析a2z_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《专题6-二进制代码分析a2z》由会员分享,可在线阅读,更多相关《专题6-二进制代码分析a2z(128页珍藏版)》请在金锄头文库上搜索。

1、二进制代码分析2012.3关于 那些盗版、破解软件,那些外挂程序,都 是什么人、怎么做的,用的什么技术和方 法啊? 我和你一样好奇。 本文向你解释他们怎么做的。 虽然本文的示例程序一般从C源程序开始, 但是他们显然没有。 事实上,他们直接拿二进制程序开刀。From the very begin:文件格式 数据文件 纯文本 格式文本 带指令的文本(word宏) 脚本文件 程序文件 EXE,ELF,a.out 静态lib DLL,SO 驱动文件,modules in linuxWindows的系统文件 Exe、dll、sys 配置文件 C:WINDOWSsystem32configsystem C

2、:WINDOWSsystem32configsam C:WINDOWSrepairsam Windows的系统文件de自我保护内存、地址 物理内存 分段:CS DS ES SS FS GS 分页,页表,non-page 进程逻辑地址空间物理内存 存储器分为CPU缓存(1/2/3级)、主存、外存(磁盘等)。主 机板上能够插放的物理内存条的个数和容量是有限制的。 PC机上许多设备拥有自己的设备内存,这些设备内存会 映射到PC机的物理内存地址上,读写这段物理地址其实 会访问设备内存。 Windows各系列支持的物理内存上限是不一样的,从2G 到64G不等。理论上32位CPU硬件上只能支持4G内存的

3、寻址,超过4G的内存只能靠其他技术来弥补。 比如Windows Server/32企业版即可使用超过4G物理内存 (虽然单进程地址空间仍限制是4G)。 物理内存分配的最小单位是页4K或4M(或者是其他值)。 8086开始支持的分段机制在i386之后被淡化。32bit 4GB x86 i386 x86-64 IA-64 Itanium 32位地址 4G地址空间Windows内存划分 32位系统上进程地址空间是232=4G,范 围从0x0000 00000xFFFF FFFF。 0x00000000-0x0000FFFF(0k-64k)为 NULL指针范围,如果访问该范围(以及其他 未经映射的页面

4、)会报告非法访问。另外, DOS程序还使用这个区域。 0x00010000-0x003FFFFF (64k-4M)为 DOS程序保留,在某些条件下可以读写。Windows内存划分 0x00400000-0x7FFEFFFF(4M-2G)为独享用 户分区,这将近2G的空间是进程独享的。如果在 boot.ini上设置了/3G,这个区域的范围即从2G扩 大为3G:0x00010000-0xBFFE-FFFF。系统dll在 这个区域,比如是0x7xxxxxxx。 0x80000000-0xFFFFFFFF这个空间是供操作系 统内核代码、设备驱动程序、设备I/O高速缓存、 非页面内存池的分配、进程目表和

5、页表等使用。 这段地址各进程是可以共享的。 如果在boot.ini上设置了/3G,这个区域的范围从 2G缩小为1G:0xC0000000-0xFFFFFFFF。内存区域 区域指的是地址空间中的一片连续地址。区域的 必须是最小单位(一般是64k)的整数倍。区域的状 态有空闲、私有、映射、映像。 进程可以用VirtualAlloc/ VirtualFree申请/删除区 域,这时候的区域状态是私有,但是还不可以存 取数据,因为还需要和物理内存关联。 当exe或DLL文件被映射进了进程空间后,区域状 态变成映像;当一般数据文件被映射进了进程空 间后,区域状态变成映射。页面属性物理页面的访问属性指的是对

6、页面进行的具体操作:可 读、可写、可执行。CPU一般认为可读就是可执行,操 作系统细分组合【备注行】。其中最后两个属性在运行 同一个程序的多个实例时非常有用,它使得程序可以共 享代码段和数据段。一般情况下,多个进程可以共享只 读或执行页面,如果要写的话,将会Copy页面到新的页 面(copy-on-write)。 属性PAGE_NOCACHE、PAGE_WRITECOMBINE是 开发设备驱动的时候需要的。 PAGE_GUARD属性,当往页面写入一个字节时,应用 程序会收到堆栈溢出通知,在线程堆栈时有用。映射过程进程地址空间的地址是虚拟地址,当取到指令时,需要把 虚拟地址转化为物理地址才能够存

7、取数据。这个工作通过 页目和页表进行。 映射过程:逻辑地址高10位用来找到1024个页目项中的 一项,取出页表的物理地址后,利用中10位来得到页表项 的值,根据这个值得到物理页的地址,由于一页有4K大 小,利用低12位得到单元地址,这样就可以访问这个内存 单元了。 CPU的CR3寄存器会保存当前进程的页目物理地址。 当进程被创建时,同时需要创建页目和页表,一共需要 4.4M。在进程的空间中,0xC030 00000xC030 0FFF是 用来保存页目的4k空间。0xC000 00000xC03F FFFF是 用来保存页表的4M空间。也就是说程序里面访问这些地 址你是可以读取页目和页表的具体值的

8、(要工作在内核方 式下)。PT 交换文件交换文件是存在硬盘上的系统文件,它的大小 可以在系统属性里面设置,它相当于物理内存 ,所以称为虚拟内存。它的大小是影响系统快 慢的关键因素之一,尤其是物理内存不多的情 况下。 分页内存Paged Pool和非分页内存Nonpaged Pool区别:分页内存是指可以被交换到硬盘上 的内存页,非分页内存是指不能被换出的内存 页,即他只能存在于物理内存内,不会被交换 到硬盘上。 代码、数据、堆栈 CS IP DS ES SS SP EIP ESP 访问非法地址寄存器 AL,AH,AX,EAX,RAX AX,BX,CX,DX,BP,SP,SI,DI CS,DS,

9、SS,ES,FS,GS FLAGS,IP CR0,CR1,CR2,CR3 调试寄存器 测试寄存器 CRx EXE文件(DLL也一样) exe文件有自己的格式,有若干节(section ): .text用来放二进制代码(exe或dll); .data用来放各种全局数据。 .rsrc .rdata .idata观察EXE文件 用OllyDbg看节 用ida静态分析 入口地址 引用的dll函数库 函数名/地址Exe和dll 系统DLL kernel32.dll user32.dll ntdll.dll shell32.dll GDI32.dll OLE32.dll comctl32.dll , ms

10、vcr71.dll msvcr90.dll mfc42.dll mfc71.dll mfc80.dll mfc90.dll WS2_32.dll / Winsock.dlltasklist /m 观察重要的DLL 重要的dll函数 bind send recv connect hmemcpy (in win9x) GetWindowText GetDlgItemText MessageBox 用IDA查看系统DLL:导出函数Exe文件:visual studio角度 main.c main.exe 观察:汇编、机器码 观察:函数、地址 观察:局部变量和BP 观察:参数和堆栈 观察:函数返回时参

11、数ESP调整用vc看函数调用过程 int f1(int a , int b) int c; c=a+b; return c; main() int s = f1(0x11223344,0x55667788); printf jmp表ILT+635(_bind12): 00411280 jmp bind (411EF2h) ILT+640(_msize_dbg): 00411285 jmp _msize_dbg (415320h) ILT+645(_fcloseall): 0041128A jmp _fcloseall (416CA0h) ILT+680(_OutputDebugStringA4

12、): 004112AD jmp OutputDebugStringA (42598Ah) ILT+685(?f1YAHHHZ): 004112B2 jmp f1 (411C20h) ILT+690(_WriteFile20): 004112B7 jmp WriteFile (425978h) 函数调用约定风格 _cdecl 是C Declaration的缩写,C语言默认的函 数调用方法:所有参数从右到左依次入栈,参数 由调用者清除。 _stdcall 是Standard Call的缩写,是C+的标准调 用方式:所有参数从右到左依次入栈(调用类成 员时,最后一个入栈的是this指针)。参数由被调

13、 用的函数在返回后清除,使用的指令是 retn X,X 表示参数占用的字节数。 _fastcall 是编译器指定的快速调用方式。由于大 多数的函数参数个数很少,使用堆栈传递比较费 时。因此_fastcall通常规定将前两个(或若干个 )参数由寄存器传递,其余参数还是通过堆栈传 递。不同编译器编译的程序规定的寄存器不同。 返回方式和_stdcall相当。- _thiscall 是为了解决类成员调用中this指针传递而 规定的。_thiscall要求把this指针放在特定寄存器 中,该寄存器由编译器决定。VC使用ecx, Borland的C+编译器使用eax。返回方式和 _stdcall相当。 P

14、ASCAL 是Pascal语言的函数调用方式,也可以 在C/C+中使用,参数压栈顺序与前两者相反。 C中不加说明默认函数为_cdecl方式(C中也只能 用这种方式),C+也一样,但是默认的调用方 式可以在IDE环境中设置。装载exe 装载一个exe文件时,系统不会将整个exe 文件和所有的DLL文件装载进物理内存中, 同时它也不会装载进页面文件中。相反, 它会建立文件映射,也就是利用exe本身当 作页面文件。系统将部分二进制代码装载 进内存,分配页面给它。 Exedll在一起:内存布局 系统DLL起始逻辑地址一般大于0x5* Copy-on-write机制 用OllyDbg查看布局阅读exe代

15、码 静态分析:IDA 动态调试:ollydbg用IDA查看EXE/DLL 二进制、汇编、伪代码、调用图 Section/segment 函数:导入和导出 起始地址 函数/代码调用关系图 伪代码:F5IDA:汇编代码和流程图 P-code if ( v2 = 267 ) if ( *(_DWORD *)(v1 + 116) 0xEu ) v3 = 0; v4 = *(_DWORD *)(v1 + 232) = 0; goto LABEL_10; LABEL_5: v20 = 0; goto LABEL_11; 【备注行】Ollydbg(od)的使用 汇编/寄存器/栈/数据窗口 内存地图 使用断点 在当前某行 在某地址、在某个地址范围 某个条件触发 当执行、读、写时 某个系统dll函数演示bp bind 使用bp bind

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号