点击确定之后:
根据提示,破解的目标为:
x32dbg 打开程序。这个是一个 VB 代码文件,从其依赖的 MSVBVM50.dll 就可以看出。或者从地址 0040116D 处的指令 call ThunRTMain() 也可以看出这是 Visual Basic 代码写的程序。
找到了 EP,打一个断点。从地址 0040116D 处的指令 F8 步过(不能 F7 步进,不然就进入了 ThunRTMain() 函数内部,分析的不是程序代码,而是 VB 引擎代码了):
指令 00402C17 和指令 00402C18 处,是典型的栈帧结构,函数的开头。
指令 00402C85 和指令 00402CBE 处,是把 MessageBox 的两个参数以逆序方式压入栈。
地址 00402CFE 处,调用了 rtcMsgBox() 函数,这是 VB 的消息框函数。在此处下断点。F9 运行程序,此处调用的是这个刚打开程序时候的 Nag Screen:
点击确定回到主页面,然后点击 Nag?
按钮。
EIP 跳到了 ThunRTMain() 函数的头部,栈帧结构的地方。
继续运行,发现同样是跳到地址 00402CFE 处的指令,调用 rtcMsgBox 函数:
查看程序所有调用的所有 API 目录。
有4处代码调用了 rtcMsgBox() 函数,给它们全都打上断点:
运行发现,弹出 Nag Screen 的多处代码具有相同的运行代码,也就是地址 00402CFE 处的 call rtcMsgBox。所有只需要对这一处打补丁即可。
需要修改地址 00402CFE 处的 call 命令:
00402CFE | E8 1DE4FFFF | call <JMP.&rtcMsgBox> |
上面的 CALL 指令,大小为5字节(E8 1D E4 FF FF)。
修改为如下代码:
其中:add 指令大小为3字节(8
使用 x32dbg 查看 abex' crackme#2 文件的反汇编代码:
EP 的地址为 00401238。
地址 00401232 处的指令为 jump 到 ThunRTMain() 函数,就是在调用 VB 引擎的主函数 ThunRTMain()。
此 EXE 程序是 VB 代码编译出来的。VB 文件使用名为 MSVBVM60.dll(Microsoft Visual Basic Virtual Machine 6.0)的 VB 专用引擎(也称为 The Thunder Runtime Engine)。
地址 00401238 处的指令为 push 401E14。
此命令用于把 RT_MainStruct 结构体的地址(push 401E14)压入栈。
VB 中使用的各种信息(Dialog、Control、Form、Module、Function 等)以结构体形式保存在文件内部。微软尚未公开这种结构体信息。
地址 0040123D 处的指令为调用 00401232 处的 jmp dword ptr ds:[<&ThunRTMain>] 指令。该 JMP 指令会跳转至 VB 引擎的主函数 ThunRTMain(),而在上一条 PUSH 指令中压入栈的 401E14 的值会作为 ThunRTMain() 函数的参数。
以上 3 条指令(JMP、PUSH、CALL)就是 VB 文件的全部启动代码。
地址 0040123D 处没有直接 JUMP ThunRTMain(),而是通过 00401232 处的 JUMP 指令间接调用了 MSVBVM60.dll 里的 ThunRTMain() 函数。
这是 VC++、VB 编译器中常见的间接调用法(Indirect Call)。属于编译器的启动代码特征。
ThunRTMain() 函数的参数为 RT_MainStruct 结构体。RT_MainStruct 结构体位于地址 00401E14 处。
微软尚未公开
待破解程序:abex' crackme #1.exe
点击确定之后:
再次点击确定退出。
先运行 x32dbg 载入exe,代码窗口中查看程序的汇编代码:
EP 代码很短,没有之前看到的 VS 2009 编译出来的那么多启动函数。判断这是一个直接用汇编语言编写的程序。
逐行分析:
第 1 段:调用 MessageBoxA() 函数
第 2 段:调用 GetDriveTypeA() 函数
如图:GetDriveTypeA
这个函数功能为判断驱动器的类型。传入参数是磁盘的根目录。
如下二图可以看到 GetDriveTypeA 函数的返回值为3(寄存器 EAX)。
DRIVE_FIXED
3
The drive has fixed media; for example, a hard disk drive or flash drive.
第 3 段:条件分支(401028 或 40103D)
如上可以看到,EAX 和 ESI 两值不等,所以从 00401028
继续往下执行。
第 4 段:401028
第 5 段:40103D
并未执行的条件分支,其内容为调用 MessageBoxA() 函数,弹出一个 title 为 "YEAH!",text 为 "Ok, I really think that your HD is a CD-ROM! :p" 的弹窗。
第 6 段:终止进程
破解的目的是:改变程序的执行结果,使其执行 40103D 分支的代码。
思路:
把条件分支语句 je 0x0040103D
改为 jmp 0x0040103D
(不作判断直接跳)。
把条件分支语句 je 0x0040103D
改为 jne 0x0040103D
(Jump if Not Equal)。
如图修改为了 jne:
打补丁给