逆向工程核心原理-第十九章-Upack调试寻找OEP
19.1 OD运行错误
因为修改了NumberOfRvaAndSize = A, 所以会报错, 但是能正常调试
在进入以后, EP会停留在ntdll.dll区域
该现象为OD的Bug引起的, 所以需要强制设置EP. 在设置之前我们需要直到EP在哪里
使用Stud查看
我们直到了EP的虚拟地址为 = 401018地址处
我们右键点击, 设置为新的EIP
上面的是我们自己Upack加壳后的notepad, 运行不了, 所以直接使用了书中给的程序, 入口点变成 了0x1001018
19.2 解码循环
我们先看EP前面的两条指令: 从10011B0地址处读取值, 然后保存到EAX(LODS比较少见, 是将值传入EAX)
EP第三条时间EAX中的值100739D压入栈中, 那个其实就是我们要找的OEP地址, 所以我们之后可以在栈中下硬件断点, 直接跳到OEP, 这里我们先继续跟进
来到了这个位置, 下面的101FD18调用的就是我们的decode()函数.
我们接着跟进decode函数
我们继续调试
两个红框中都是对EDI所指向的地址接入内容, EDI指向第一个节区. 这里就是我们的解压缩了
19.3 设置IAT
执行完上面的解码循环后, 根据源文件重新组织IAT(导入地址表)
第一个调用了LoadLibraryA, 第二个调用了GetProcAddress
UPack会使用导入的函数变执行循环变构建原本的notepad的IAT(过程是获取导入函数实际地址, 再写入原IAT区域)
第三个retn就是回到我们的OEP处
可以看到当前栈状态中的栈顶就是我们上面说的可以设置硬件断点的位置.