逆向工程核心原理-19

逆向工程核心原理-第十九章-Upack调试寻找OEP

19.1 OD运行错误

因为修改了NumberOfRvaAndSize = A, 所以会报错, 但是能正常调试

Untitled

在进入以后, EP会停留在ntdll.dll区域

Untitled

该现象为OD的Bug引起的, 所以需要强制设置EP. 在设置之前我们需要直到EP在哪里

使用Stud查看

Untitled

我们直到了EP的虚拟地址为 = 401018地址处

Untitled

我们右键点击, 设置为新的EIP

Untitled

上面的是我们自己Upack加壳后的notepad, 运行不了, 所以直接使用了书中给的程序, 入口点变成 了0x1001018

Untitled

19.2 解码循环

我们先看EP前面的两条指令: 从10011B0地址处读取值, 然后保存到EAX(LODS比较少见, 是将值传入EAX)

Untitled

EP第三条时间EAX中的值100739D压入栈中, 那个其实就是我们要找的OEP地址, 所以我们之后可以在栈中下硬件断点, 直接跳到OEP, 这里我们先继续跟进

来到了这个位置, 下面的101FD18调用的就是我们的decode()函数.

Untitled

我们接着跟进decode函数

Untitled

我们继续调试

Untitled

两个红框中都是对EDI所指向的地址接入内容, EDI指向第一个节区. 这里就是我们的解压缩了

19.3 设置IAT

执行完上面的解码循环后, 根据源文件重新组织IAT(导入地址表)

Untitled

第一个调用了LoadLibraryA, 第二个调用了GetProcAddress

UPack会使用导入的函数变执行循环变构建原本的notepad的IAT(过程是获取导入函数实际地址, 再写入原IAT区域)

第三个retn就是回到我们的OEP处

Untitled

可以看到当前栈状态中的栈顶就是我们上面说的可以设置硬件断点的位置.

文章作者: LamのCrow
文章链接: http://example.com/2022/03/28/逆向核心工程原理-第 e8d4e/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LamのCrow