【php精品源码栏目提醒】:网学会员为广大网友收集整理了,软件逆向工程教程 - 其它资料,希望对大家有所帮助!
第一课 逆向分析基础知识1.1 调用约定在分析汇编代码时总是要遇到无数的 Call,对于这些 Call,尽量要根据 Call 之前传递的参数和 Call 的返回值来判断 Call 的功能。
传递参数的工作必须由函数调用者和函数本身来协调,计算机提供了一种被称为栈的数据结构来支持参数传递。
当参数个数多于一个时,按照什么顺序把参数压入堆栈。
函数调用后,由谁来把堆栈恢复。
在高级语言中,通过函数调用约定来说明这两个问题。
常见的调用约定有:【例】按__stdcall 约定调用函数 test2Par1 Par2push par2 参数 2push par1 参数 1call test2push ebp 保护现场原先的 EBP 指针mov ebp esp 设置新的 EBP 指针,指向栈顶mov eax ebp0C 调用参数 2mov ebx ebp08 调用参数 1sub esp 8 若函数要用局部变量,则要在堆栈中留出点空间…add esp 8 释放局部变量占用的堆栈pop ebp 恢复现场的 ebp 指针ret 8 返回(相当于 ret add esp8)其堆栈调用示意图:资料函数调用堆栈变化分析1.2 局部变量在子程序内部说明的变量称为局部变量,局部变量的作用域是其所在的子程序。
从汇编角度来看,局部变量就是一个临时堆栈缓存,用完释放。
例如这个实例:附件:local.zip其反汇编代码如下(红体字为局部变量):00401000 gt/ 6A 04 push 4 /Arg2 0000000400401002 . 6A 03 push 3 Arg1 0000000300401004 . E8 16000000 call 0040101F Add.0040101F00401009 . 8BD8 mov ebx eax0040100B . 6A 00 push 0 /ExitCode 00040100D . FF15 00204000 call ltampKERNEL32.ExitProcessgt ExitProcess0040101F / 55 push ebp 保护现场原先的 EBP 指针00401020 . 8BEC mov ebp esp 设置新的 EBP 指针,指向栈顶00401022 . 83EC 04 sub esp 4 分配局部变量所有空间00401025 . 8B45 0C mov eax ebpC 调用参数 200401028 . 8B5D 08 mov ebx ebp8 调用参数 10040102B . 895D FC mov ebp-4 ebx 参数 1 放局部变量里0040102E . 0345 FC add eaxebp-4 参数 2 与局部变量相加00401031 . 83C4 04 add esp 4 释放局部变量所有空间00401034 . 5D pop ebp 恢复现场的 ebp 指针00401035 . C2 0800 retn 81.3 返回值在调试程序时,不要见 Call 就跟进,在 Call 之前所做的所有 PUSH 动作以及对寄存器的操作都可能是在给函数传递参数,而函数的返回值一般都放在 EAX 里面,当然这个值可能是一个指针,指向一个数据结构。
从汇编角度来看,主要有如下形式:1通过寄存器返回函数值;2通过参数按引用方式返回函数值;3通过全局变量返回函数值;4通过处理器标志返回函数值;一般情况下,由 retrun 操作符返回的值放在 EAX 寄存器之中,如果结果超过这个寄存器的位容量,那么该结果的高 32 位会加载到 EDX寄存器中。
如果返回一个含有几百个字节的结构或者一个近似大小的对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。
1.4 启动函数在编写 Win32 应用程序时,都必须在
源码里实现一个 WinMain 函数。
但 Windows 程序执行并不是从 WinMain 函数开始的,首先被执行的是启动函数相关代码,这段代码是编译器生成的。
启动代码完成初始化进程,再调用 WinMain。
标准编译器通常包含启动代码在内的库文件
源码,例如 Visual C中,启动代码存放在 CRTSRCcrt0.c 文件中。
所有的 C/C运行时启动函数的作用基本都是相同的:检索指向新进程的命令行指针,检索指向新进程的环境变量指针,全局变量初始化,内存堆栈初始化等。
当所有的初始化操作完毕后,启动函数就调用应用程序的进入点函数。
调用 WinMain 如下所示:GetStartupInfo ampStartupInfoInt nMainRetVal WinMainGetModuleHandleNULLNULLpszCommandLineAnsiStartupInfo.dwFlagsampSTARTF_USESHOWWINDOWStartupInfo.wShowWindow:SW__SHOWDEFAULT当进入点返回时,启动函数便调用 C 运行库期的 exit 函数,将返回值(nMainRetVal)传递给它,进行一些必要处理,最后调用系统函数 ExitProcess 退出。
其他一些编译器,如 Delphi、BorLand C开发包中都有相应的启动代码。
在绝大数情况下,我们对启动代码并不需要关心。
对于逆向分析人员来说,首要的任务是找到 Winmain 函数。
WinMain 函数原型如下:int WINAPI WinMainHINSTANCE hInstance // 当前实例的句柄HINSTANCE hPrevInstance // 前一个实例的句柄LPSTR lpCmdLine // 命令行的指针int nCmdShow // 窗口的显示状态其中参数 hInstance 一般通过 GetModuleHandleA 函数进行获取的,这对识别 WinMain 函数有些帮助。
另外,对 WinMain 的调用通常放在启动函数代码结尾部分,后面通常跟着诸如 exit 或 XcptFilter 之内的两、三个函数。
例如下面这段代码:.text:004010DC push eax nShowCmd.text:004010DD push ebplpCmdLine lpCmdLine.text:004010E0 push esi hPrevInstance.text:004010E1 push esi lpModuleName.text:004010E2 call ds:GetModuleHandleA.text:004010E8 push eax hInstance.text:004010E9 call WinMainxxxx.text:004010EE mov ebpvar_60 eax.text:004010F1 push eax int.text:004010F2 call _exit许多开发人员可以得到启动源代码的情况下对启动代码进行修改,这样,程序的执行可能不是从 WinMain 开始,而是从任何其他的函数开始。
1.5 API 函数 对现在很多讲 Windows 程序设计的书都是讲基于 MFC 库和 OWL 库的 Windows 设计, Windows 实现的细节都鲜有讨论,而调试程序都是和系统底层打交道,所以有必要掌握一些 Win32 API 函数的知识,这样我们可快捷地找出程序调用错在哪?是哪个参数出了问题。
Windows 程序模块包括 KERNEL、USER 和 GDI,其中 KERNEL 完成内存管理、程序的装入与执行和任务调度等功能,它需要调用原 MSDOS中的文件管理、磁盘输入输出和程序执行等功能;USER 是一个程序库,它用来对声音、时钟、鼠标器及键盘输入等操作进行管理;GDI是一功能十分丰富的子程序库,它提供了图形与文字输出、图象操作和窗口管理等各种与显示和打印有关的功能。
上述 KERNEL、USER和 GDI 模块中的库函数可被应用程序调用,也可被其他程序模块调用。
把包含库函数的模块称为输出者(export)。
你应明白为什么跟踪软件时经常在 KERNEL32.text 和 USER32.text 等系统领空转的问题吧。
这里列出几个经常碰到的 Win 32 API 函数,它们都是存在 Windows 系统核心文件 KERNEL32.DLL 中和视窗管理文件 USER32.DLL 中。
Windows 函数是区分字符集的:A 表示 ANSI,W 表示 Wide,即 Unicode Wide character-set,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。
而后者是双字节方式,方便处理双字节字符。
Windows 的所有与字符有关的函数都提供两种方式的版本。
尽管你编程时使用 GetWindowText,但实际上编译程序会根据设置自动调用 GetWindowTextA 或 GetWindowTextW。
函数的最后一个字母告诉我们函数是使用单字节还是双字节字符串。
1、 Hmemcpy 函数void hmemcpyhpvDest hpvSource cbCopyvoid _huge hpvDest // 目的数据地址const void _huge hpvSource // 源数据地址long cbCopy // 数据大小 Bytes这个函数在 KERNEL32.DLL 中,它很常用,俗称万能断点,但一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。
但的确它是很有用的!有意思的是它执行的操作很简单,只是将内存中的一块数据拷贝到另一个地方。
注意:此函数只在 Windows 9x 系统上有效,在 Win NT/2K 系统上相关的函数是 memcpy,但在 Win NT/2K 上不同于 Windows 9x 上,很少再调用 memcpy 来处理数据了,用此函数设断基本上什么也拦不住。
2、 GetWindowText 函数此函数在 USER32.DLL 用户模块中,它的作用是复制指定窗口中的字符到缓冲区。
函数原型:int GetWindowTextHWND hWnd//欲获取文字的那个窗口的句柄LPTSTR lpString //预定义的一个缓冲区,至少有 cch1 个字符大小;随同窗口文字载入int nMaxCount//lpString 缓冲区的长度16 位:GetWindowText32 位:GetWindowTextA,GetWindowTextW3、 GetDlgItemText此函数在 USER32.DLL 用户模块中,它的作用是返回对话框中某一个窗口的标题或文字。
函数原型:UINT GetDlgItemTextHWND hDlg // 对话框句柄int nIDDlgItem //控制标识符LPTSTR lpString / 预定义的一个字符缓冲区int nMaxCount// 字符缓冲区的长度16 位:GetDlgItemText32 位:GetDlgItemTextA,GetDlgItemTextW4、 MessageBox 函数此函数是在 USER32.DLL 用户模块中,它的作用创建、显示和操作信息框。
函数原型:int MessageBoxHWND hWnd //窗口句柄LPCTSTR lpText // 信息框中文字的地址LPCTSTR lpCaption // 信息框标题地址UINT uType // 信息框类型16 位:MessageBox32 位:MessageBoxA,MessageBoxW学习 API 函数最好的资料就是《Windows 程序设计》这本书,下面列出其他一些参考资料:API 函数资料Win32 API reference(推荐)Windows API 函数手册(774 个 Win32 函数,中文)常见断点列表其他资料Win32 头文件公告请注意言行举止,不要让大家觉得不适!kanxue 4 2006-09-13 20:53:33 第三课 动态分析技术 所谓动态分析是利用调试器,如 OllyDBG 一步一步地单步执行软件。
常见的调试器有 SoftICE,OllyDBG(简称 OD) 等。
SoftICE 是一款经典的调试工具,运行在 Ring0 级,可以调试驱动。
但平时调试的程序都是 Ring3 级,因此推 荐大家用 OllyDBG,这款工具上手容易,功能十分强大,现在论坛上的文章基本都是用 OllyDBG 来讲解的。
3.1 OllyDBG 调试器 坛主资 料:注册日期: Apr OllyDBG 工具下载2004 点击此处下载 OD帖子: 10663精华: 7现金: 3393 Kx致谢数: 26 CCDebuger 的 OllyDBG 入门教学获感谢文章数:24 OllyDBG 入门系列(一)-认识 OllyDBG获会员感谢数:185 OllyDBG 入门系列(二)-字串参考 OllyDBG 入门系列(三)-函数参考 OllyDBG 入门系列(四)-内存断点 OllyDBG 入门系列(五)-消息断点及 RUN 跟踪 名词解释 1.所谓领空,实际上是指:在某一时刻,CPU 的 CS:IPEIP 所指向的某一段代码的所有者所在的区域。
3.2 Olldbg 常见问题 Q: OD 中如何运行到光标所在处? A: 将光标移到目标位置,按 F4. Q: 如何用 OD 修改可执行程序? A:直接在反汇编代码区更改这时可以使用汇编代码更改然后选中修改后的汇编代码,右击--gt复制到可执行文 件--gt保存文件. Q:OD 中的代码乱码,如: 004365E0 gtdb 68 CHAR h 004365E1 gtdb A4 004365E2 gtdb 7A CHAR z 004365E3 gtdb E5 004365E4 gtdb B8004365E5 gtdb E8004365E6 gtdb BBA:OD 右键,quot分析/从模板中删除分析quot,如不行,按 CtrlA 重新分析Q:OD 为什么删除了断点,重新加载的时候,这些断点都会重新出现A:设置 ollydbg.ini,将配制文件里改成如下:Backup UDD files1 by kanxueQ:如何还原到 OD 到分析前的状态A:右键 分析/从模块中删除扫描Q:什么是 UDD?A:OllyDbg 把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加载时继续使用。
这些信息包括了标签、注释、断点、监视、分析数据、条件等等Q:OD 的数据窗口显示一个下划线,是什么意思?A:重定位加下划线〔Underline fixups〕,几乎所有的 DLL 和一部分程序都包含重定位,这样就可以在内存中的不同基地址加载模块了。
当该项开启时,CPU 反汇编窗口或 CPU 数据窗口中的重定位地址都将添加下划线。
(xing_xsz)Q:如果已经知道某一 CALL 的具体作用能否把后面所有相同的 CALL 都改成函数名形式A:比如 CALL 110000 此中已经知道 110000 是一个核心计算则如下操作让光标停在 CALL 110000 这个语句上按回车键会跳到 110000 的地址上去显示之后让光标停在 110000 上按shift 和 分号 其实就是完成一个:冒号的动作输入名称这回所有的调用 110000 处都会显示 CALL 你刚才输入的名称了.nig 回答Q:用 OD 调试一些加壳程序,如 Themida 等,可能你会发现下断后(包括硬件断点),程序跑到断点时,OD 会出现假死现像。
A:打开 OD 配置文件 ollydbg.ini,你会发现:Restore windows 123346 //这个 Restore windows 可能会是一个很大的值现在只需要将 Restore windows=0,重新用 OD 调试程序,假死问题就消失了。
kanxueQ:ollydbg 中如何调用 pdb 文件?A:pdb 文件是 VC调试编译生成的文件。
由编译器直接生成。
pdb 文件要配合源文件使用。
不同的源文件 pdb 文件不同。
用 OD 装入可执行文件后,点击 CPU 窗口中的注释段可出现
源码。
不过不是所有的
源码都可以显示的。
VC6.0 以下都可以显示。
还有一种不显示的原因是缺少路径。
点击 OD 主菜单的查看-gt源文件如果
源码段出现缺少字样的话,说明此路径的
源码是看不了的。
设置正确的路径就可以了。
(nantz 回答)Q:运行 A.exe,其会调用 B.exe,如果用 OD 再附加 B.exe,OD 会死掉A:1.OD 菜单,设置 OD 为即时调试器;2.将 B.exe 的入口改成 CC,即 INT 3 指令,同时记下原指令3.运行 A.exe,其调用 B.exe,会导致异常,OD 会自动启动加载 B.exe,此时你将 INT 3 指令恢复原指令。
4.到这步,你己可以任意调试 B.exe 了kanxueQ:用 ollydbg 调试的时候,断住 kernel32.dll 系统函数,然后”执行到用户代码“,就可以回到被调程序的代码。
但有时候却回不来,不知道这又是为什么?A:多半是杀毒软件(如卡巴对 LoadLibraryA)Hook API 入口代码进入 ring 0 了,OllyDbg 不能单步跟踪,这种情况下只要看堆栈返回地址,在返回地址上下端点,F9 执行就可以了。
(cyclotron 回答)Q:OD 的“复制可执行文件”后面没有 “所有修改”的菜单A:OD 识别代码段范围失败后 没有复制 all modifications 的选项 因为这个是复制代码段内的修改的。
(曾半仙回答)Q:OD 里的 patch 窗口怎么用?A:patch 窗口用来保存你在调试的程序中修改过的代码的。
在 比如你前面调试了一个程序, OD 中把某处的 JE 改成了 JMP,OD 会在 patch 中记录这个修改,你下次再重新载入程序时,就能在 OD 的 patch 窗口中看到你原来改动的代码。
按空格键就可以激活 patch,就是在 OD 中还把原来位置的 JE 改成 JMP。
这个只是在 OD 中作更改,并没有实际保存到文件,主要是比较方便在 OD 中修改程序时测试。
CCDebuger 回答OllyDBG 技巧汇集OllyDBG 的命令行解释OllyDBG 里 SHIFTF4 条件断点用法篇OllyDbg 实用技巧六则OllyDBG 的教学-Run trace3.3 Olldbg 脚本教学这部分有点难度,新手可以跳过,等水平提高后回头再学习。
OD 脚本教学认识 ODbgScriptODbgScript 的命令ODbgScript 的脚本命令2ODbgScript 的 注意事项和使用技巧OllyScript v0.92 中文帮助文档也谈写 OllyScript 脚本之 Career 和心声 公告如果你觉得有人语言挑衅,请点每帖右上角的“举报”按钮!kanxue 5 2006-09-13 20:53:55 第四课 静态分析技术 所谓静态分析即从反汇编出来的程序清单上分析,从提示信息入手进行分析。
目前,大多 数软件在设计时,都采用了人机对话方式。
所谓人机对话,即在软件运行过程中,需要由 用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。
而在执行完某一段 程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现 错误,或者提示用户进行下一步工作的帮助信息。
为此,如果我们对静态反汇编出来的程 坛主 序清单进行阅读,可了解软件的编程思路,以便顺利破解。
常用的静态分析工具有 W32D ASM、C32Asm 和 IDA Pro 等。
资 料:注册日期: Apr 4.1 认识 PE 格式2004帖子: 10663 在 Win32 平台上(包括 Windows 95/98/ME/NT/2000/XP/2003/CE),可执行文件是 PE(P精华: 7 ortable Executable)格式。
PE 文件使用的是一个平面地址空间,所有代码和数据都被现金: 3393 Kx 合并在一起,组成一个很大的结构。
文件的内容被分割为不同的区块(Section,又称区致谢数: 26 段、节等),块中包含代码或数据。
获感谢文章数:24获会员感谢数:185刚接触这块的朋友只需要简单了解一下 PE 格式,更具体的 PE 格式请参考脱壳基础知识入门(2006 年版)PE 相关名词解释如下:1.入口点(Entry Point)程序在执行时的第一行代码的地址应该就是这个值。
2.文件偏移地址(File Offset)PE 文件在磁盘上储存时,各数据的地址称文件偏移地址(File Offset)。
用十六进制工具(例如 Hex Workshop、WinHex 等)打开文件显示的地址就是文件偏移地址。
3.虚拟地址(Virtual Address,VA)由于 Windows 程序是运行在 386 保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。
与实地址模式下的分段地址类似,虚拟地址也可写成quot段:偏移量quot的形式,这里的段是指段选择器。
4.基地址(ImageBase)文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。
在Windows NT 中,缺省的值是 10000h;对于 DLLs,缺省值为 400000h。
在 Windows 9x 中,10000h 不能用来装入 32 位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此 Microsoft 将 Win32 可执行文件的缺省基地址改变为 400000h。
5.相对虚拟地址相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。
即:相对虚拟地址RVA虚拟地址(VA)-基址(ImageBase)。
4.2 虚拟地址和偏移量转换 在 OllyDBGIDA 和 W32Dasm 下显示的地址值是虚拟地址(Virual Address,VA)。
而十六进制工具里,如:Hiew、Hex Workshop 等显示的地址就是文件地址,称之为偏移量(File offset 。
其转换原理是因为 PE 文件在磁盘上的数据结构与在内存中的结构是一致的,如下图:具体见:http://bbs.pediy.com/showthread.phpsampthreadid18022 在实际操作时,使用 LordPE 等工具很容易进行 File offset 与 VA 的转换。
LordPE打开目标文件,点击 FLC 按钮,打开如下图的对话框,填入相应地址,点击 DO 按钮即可转换:4.3 文件类型分析 文件分析是静态分析程序的第一步,通过相关工具显示欲调试文件的信息,如它是用什么语言写的,是否加壳等。
常用的文件分析工具有 PEID,FileInfo 等。
有关壳的相关知识等入门后,再参考相关教学,如 脱壳基础知识入门(2006 年版) 。
如果查到文件有壳,此时静态分析是没意义的,但可以用 OD 动态调试,分析程序算法。
1.PEiDPEiD 的 GUI 界面操作非常方便直观。
它的原理是利用查特征串搜索来完成识别工作的。
各种开发语言都有固定的启动代码部分,利用这点就可识别出是何种语言编编译的。
同样,不同的壳也有其特征码,利用这点就可识别是被何种壳所加密。
下面 PEiD 识别出这个软件是用 Asprotect 1.2x 加的壳。
2.FileInfoFileInfo(简称 Fi)另一款不错的文件检测工具。
FI 的具体用法4.4 W32Dasm 简介W32Dasm 简介4.5 IDA pro 操作IDA 简易教程IDA 里的中文字串4.6 keymaker 内存注册机Q:什么是某个软件的中段地址,指令长度,第一字节,这些数据怎么得到,这些数据在 内存注册机中怎么应用? A: 青色代表着注册码的保存模式 绿色的是中断地址,中断地址一般选择注册码保存模式的下一句,或下几句地址,但必须 保证程序中断到这个地址时注册码保存的值没有被任何东西修改或改变。
如下面的例子, 中断地址可以选在 00401205 和 00401207,但不能选在 0040120C 这个地址,因为 004012 07 这个 Call 过后会修改 .
上一篇:
操作系统类培训书籍
下一篇:
2012邮政局信息公开总结