标签 - 逆向工程

? 逆向工程 ?    2020-07-01 14:07:20    842    0    0

0x01 运行

title

点击确定之后:

title

title

title

根据提示,破解的目标为:

  • 删掉所有的废话(去除 Nag Screen)
  • 找到正确的注册码

0x02 去除消息框

x32dbg 打开程序。这个是一个 VB 代码文件,从其依赖的 MSVBVM50.dll 就可以看出。或者从地址 0040116D 处的指令 call ThunRTMain() 也可以看出这是 Visual Basic 代码写的程序。

title

找到了 EP,打一个断点。从地址 0040116D 处的指令 F8 步过(不能 F7 步进,不然就进入了 ThunRTMain() 函数内部,分析的不是程序代码,而是 VB 引擎代码了):

title

指令 00402C17 和指令 00402C18 处,是典型的栈帧结构,函数的开头。
指令 00402C85 和指令 00402CBE 处,是把 MessageBox 的两个参数以逆序方式压入栈。

title

地址 00402CFE 处,调用了 rtcMsgBox() 函数,这是 VB 的消息框函数。在此处下断点。F9 运行程序,此处调用的是这个刚打开程序时候的 Nag Screen:

title

点击确定回到主页面,然后点击 Nag? 按钮。

title

EIP 跳到了 ThunRTMain() 函数的头部,栈帧结构的地方。

title

继续运行,发现同样是跳到地址 00402CFE 处的指令,调用 rtcMsgBox 函数:

title

查看程序所有调用的所有 API 目录。

title

有4处代码调用了 rtcMsgBox() 函数,给它们全都打上断点:

title

运行发现,弹出 Nag Screen 的多处代码具有相同的运行代码,也就是地址 00402CFE 处的 call rtcMsgBox。所有只需要对这一处打补丁即可。

0x03 打补丁:去除消息框

需要修改地址 00402CFE 处的 call 命令:

  1. 00402CFE | E8 1DE4FFFF | call <JMP.&rtcMsgBox> |

上面的 CALL 指令,大小为5字节(E8 1D E4 FF FF)。

修改为如下代码:

title

title

其中:add 指令大小为3字节(8

? 逆向工程 ?    2020-07-01 13:34:46    732    0    0

0x01 运行

title

title

title

title

0x02 开始调试

启动代码

使用 x32dbg 查看 abex' crackme#2 文件的反汇编代码:

title

EP 的地址为 00401238。
title

地址 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。
title

此命令用于把 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)。属于编译器的启动代码特征。

RT_MainStruct 结构体

ThunRTMain() 函数的参数为 RT_MainStruct 结构体。RT_MainStruct 结构体位于地址 00401E14 处。

title

title

微软尚未公开

? 逆向工程 ?    2020-06-24 16:57:54    1245    0    0

0x01 运行

待破解程序:abex' crackme #1.exe

title

点击确定之后:

title

再次点击确定退出。

0x02 调试

先运行 x32dbg 载入exe,代码窗口中查看程序的汇编代码:

title

EP 代码很短,没有之前看到的 VS 2009 编译出来的那么多启动函数。判断这是一个直接用汇编语言编写的程序。

0x03 分析汇编代码

title

逐行分析:

第 1 段:调用 MessageBoxA() 函数

title

title

第 2 段:调用 GetDriveTypeA() 函数

title

GetDriveTypeA function

title

如图:GetDriveTypeA 这个函数功能为判断驱动器的类型。传入参数是磁盘的根目录。

如下二图可以看到 GetDriveTypeA 函数的返回值为3(寄存器 EAX)。

title
title

根据 GetDriveTypeA function

DRIVE_FIXED
3
The drive has fixed media; for example, a hard disk drive or flash drive.

第 3 段:条件分支(401028 或 40103D)

title

如上可以看到,EAX 和 ESI 两值不等,所以从 00401028 继续往下执行。

第 4 段:401028

title

title

第 5 段:40103D

title

并未执行的条件分支,其内容为调用 MessageBoxA() 函数,弹出一个 title 为 "YEAH!",text 为 "Ok, I really think that your HD is a CD-ROM! :p" 的弹窗。

第 6 段:终止进程

title

0x04 破解

破解的目的是:改变程序的执行结果,使其执行 40103D 分支的代码。

思路:

  1. 把条件分支语句 je 0x0040103D 改为 jmp 0x0040103D(不作判断直接跳)。

  2. 把条件分支语句 je 0x0040103D 改为 jne 0x0040103D(Jump if Not Equal)。

如图修改为了 jne:

title

打补丁给