1、PE可执行文件分析
1.1开发一个源程序 HelloWorld .asm,显示hello world。
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
//数据段
.data
szText db 'HelloWorld',0
//代码段
.code
start:
invoke MessageBox,NULL,offset szText,NULL,MB_OK
invoke ExitProcess,NULL
end start
在命令提示符下输入HelloWord,查看结果。
2、调试软件OllyDBG
2.1、利用OD软件调试PE文件。
问题2.1:从OD反汇编的结果分析,invoke MessageBox,NULL,offset szText,NULL,MB_OK分解成哪几个指令?
push 0
push 0
push hellwor.00403000
push 0
call<JMP.&user32.MessageBoxA>
问题2.2:怎么理解E8 08000000?
使用E8调用Call指令
E8后跟着的是偏移地址,08000000应为高位先读,则应读为0000 0008
Call指令把它下一条指令压栈,00401010+00000008=00401018,随即转到地址00401018执行
问题2.3:F7单步步入和F8单步步过 有什么不同?
单步步入与单步不过的不同在于,单步步入在遇到子程序时,会跳转到子程序内部执行,而单步步过遇到子程序则将该调用当成一条指令执行,并不进入子程序内部。
2.2、修改EXE文件字节码
将messagebox的 HelloWorld 修改成 GoodNight,显示结果。
问题2.4:修改是从文件偏移的什么地方开始的(FOA和VA、RVA分别的多少)?
FOA的800偏移
VA的2000偏移
RVA的400偏移
3、调试软件W32DASM
利用W32DASM查看HelloWorld.EXE的输出。
问题3.1:该函数用到哪几个DLL,分别用到哪几个函数?
使用到user32.dll和kernel32.dll,用到了0个函数。
4、FlexHex 或 Winhex
熟悉十六进制编辑软件的使用。
问题4.1:如何初步判断一个文件是PE文件?
使用Winhex工具
从文件头4D 5A(MZ)开始,跳转3C(即偏移3C)
跳转后可读取到数据为0000 00B0
再跳转到地址0000 00B0
若该地址数据为50 45(即PE)就为PE文件。
5、利用PEditor查看Hellworld,读出其ImageBase的值,并画出节表。
问题5.1:画出节表。
ImageBase=0x00400000
6、破解实例:U盘监控器
U 盘监控器需要注册才能使用全部功能,我们的任务是使得输入任何注册码均能注册成功 。通常在注册时,程序会读取注册码,然后对注册码进行判 断: 正确则显示注册成功,转到正常的程序运行状态:错误则显示注册失败 ,转到未注册运行状态。
如果我们将判断转移条件更改一下,错误则转到正常的运行状态,反之则转到来注册的运行状态 。这样,如果我们输入了错误的注册号,程序也会像输入了正确的注册号一样运行,流程 如图所示。
利用OllyDBG、W32DASM、WinHex破解U盘监控器的注册流程
(1)运行USE监控器软件,发现在未知注册码的情况下注册是失败的
(2)使用WinHex打开USE监控器软件,找到“注册失败”字符串的文件偏移地址,偏移地址为0x81A79。
(注:若WinHex右侧显示的不是文字,则需要在相关设置中修改,点击选项->常规->取消选中“Display byte as text one by one”)
(3)使用OllyDBG获取引用该字符串的指令在内存中的地址。
内存地址=0x0400000+偏移地址=0x0400000+0x81A79=0x00481A79;
在OllyDBG中搜索0x00481A79,查找到指令所在的内存地址为0x00405D2D.
(4)使用W32DASM获取判断语句的位置,通过分析静态代码,可找到调用错误下信息的代码,找到位置0x00405D2D。
(5)使用OllyDBG更该指令字节码。
(6)再次运行USB监控器进行注册。
问题6.1:破解是将指令代码更改为什么?并加以说明。
将JG 00405D11中的JG修改为JL,即JL 00405D11。
JG在汇编语言里的意思是:如果大于则跳转。其相反的指令为JL,其判断条件正好相反。