本文最后更新于:2025年3月1日 中午
逆向分析实验2 OllyDbg的使用
查找main()函数
单步跟踪
先一直使用F8单步步过,发现运行了401144
处的函数调用后出现弹窗:

重新运行,并用命令bp 401144
在目标函数位置打上断点
运行到断点后F7单步步入

此函数中调用了MessageBox()
函数,并且存在MessageBox()
函数中出现的Hello World!
和www.reversecore.com
字符串
因此可以确定此函数为main
函数,位置为401144
字符串检索
单击右键->查找->所有参考文本字串,找到引用“Hello World!”的地址

双击定位到main()
函数中调用MessageBox()
函数的代码处,F2设置断点,F9命令运行到该处

在断点窗口查看设置的断点信息

在数据窗口中使用Ctrl+G
,输入反汇编代码中的地址4092a0
,查看该地址处的字符串

API检索
单击右键->查找->所有模块间的调用,列出程序调用的所有API,找到MessageBoxW()
的地址

双击后,定位到main()
函数中调用MessageBox()
函数的代码处

修改“Hello World!”字符串
直接修改字符串缓冲区
用上面“字符串检索”中的方法找到Hello World!
字符串保存的地址,在数据窗口直接编辑修改该段缓冲区的内容为Hello Reversing!

运行程序后,弹出消息窗口,可以看到显示出新的字符串

在其他内存区域新建字符串并传递给消息函数
在程序未使用的NULL填充区域找到一个适当位置,写入新字符串Hello Reversing World!!!
,并把新建的缓冲区的地址作为参数传递给MessageBoxW()
函数

运行程序后,弹出消息窗口,可以看到显示出新的字符串

破解abexcm1-voiees.exe程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 00401000 >/$ 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL 00401002 |. 68 00204000 push abexcm1-.00402000 ; |Title = "abex' 1st crackme" 00401007 |. 68 12204000 push abexcm1-.00402012 ; |Text = "Make me think your HD is a CD-Rom." 0040100C |. 6A 00 push 0x0 ; |hOwner = NULL 0040100E |. E8 4E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA 00401013 |. 68 94204000 push abexcm1-.00402094 ; /RootPathName = "c:\" 00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA 0040101D |. 46 inc esi 0040101E |. 48 dec eax 0040101F |. EB 00 jmp short abexcm1-.00401021 00401021 |> 46 inc esi 00401022 |. 46 inc esi 00401023 |. 48 dec eax 00401024 |. 3BC6 cmp eax,esi 00401026 |. 74 15 je short abexcm1-.0040103D 00401028 |. 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL 0040102A |. 68 35204000 push abexcm1-.00402035 ; |Title = "Error" 0040102F |. 68 3B204000 push abexcm1-.0040203B ; |Text = "Nah... This is not a CD-ROM Drive!" 00401034 |. 6A 00 push 0x0 ; |hOwner = NULL 00401036 |. E8 26000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA 0040103B |. EB 13 jmp short abexcm1-.00401050 0040103D |> 6A 00 push 0x0 ; |/Style = MB_OK|MB_APPLMODAL 0040103F |. 68 5E204000 push abexcm1-.0040205E ; ||Title = "YEAH!" 00401044 |. 68 64204000 push abexcm1-.00402064 ; ||Text = "Ok, I really think that your HD is a CD-ROM! :p" 00401049 |. 6A 00 push 0x0 ; ||hOwner = NULL 0040104B |. E8 11000000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA 00401050 \> E8 06000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
|
运行源程序后会弹出消息窗口Make me think your HD is a CD-Rom
消息,点击确定后,弹出Error消息Nah…This is not a CD-ROM Drive!
。
我们的目的是尝试破解这个程序,使得点击确定后,弹出正确的输出。
我注意到0040101F
有一个无意义的跳转指令(跳转到下一行指令):
1
| 0040101F |. EB 00 jmp short abexcm1-.00401021
|
这个跳转指令是在第一次弹窗点击确定后、第二次弹窗之前执行的
或许可以更改跳转地址,使其直接转到弹出正确的输出的代码
更改其跳转地址为0040103D
(弹出正确输出的代码)
成功
