先找到OEP。停下来后。看IAT起始位置。
校验
0F 82 ?? ?? ?? ??
在无加密入口前面345A左右(左右)可以在| F3:A4 | rep movsb |三次断下后,进行F7,直到走到校验
无加密入口
因为第一个肯定是加密的。我们在这个加密iat下一个硬件写入断点。
来到一个典型的 | F3:A4 | rep movsb |
F7 F8 F9
然后查看堆栈,看哪个引用的。回到引用地址。就是加密入口了。
往前33df左右的。搜索(0f 82 ?? ?? ?? ??)找到jb 0x?????的地方。(注意这里的jb要远一点。如果是很近的那种花指令是不对的)就是校验了。
在加密入口上面,找到一个超长jne (夹在1 0 1的0下面)点击这个,进去就是无加密入口。
无加密CallAPI地址获取这里。api看ecx
普通无加密api地址,api看eax
无加密api获取
eax是iat入口地址。
无加密iat获取
无加密iat获取,程序来到这里的时候。edi的地址是指向这个iat函数入口地址的。而EAX指向的是他要填充到哪个地址,也就是IAT表真实地址。
也就是说,记录此时的EDI和EAX。把此时的edi数据填充到eax地址里就对了。
无加密call api获取
此时ecx就是指向无加密函数地址。同时看EDI地址,此时EDI地址就是原来call api(反编译)的地址。
然后注意。因为一个函数。他填充完普通的就接着填充call,所以我们之前获取的这个函数入口地点。就是call IAT的了。
加密API获取
来到这里。eax就是iat函数入口地址。同样的edi就是iat地址。
加密iat获取
这里,EDX地址里的数据就是要填充的iat表的地址。
检查此时的基址。看看和ebx进行对比是不是一样的。就是看ebx是不是0x400000
然后我们看EDX寄存器的数据里面的地址也就是[]里面,这个数是不是IAT表范围内。如果是,就继续进行。
看 edx
寄存器指向的内存地址读取一个双字(32位)数据(也就是看他的地址)是不是在我们的IAT表范围内。
加密IAT填充完毕
此时我们看exc,他这里显示的是加密的iat地址。ebx显示的是IAT填充的地址(EBX地址就是这个函数的iat表了)。也就是说,他会把加密的地址(EXC)填充到(EBX)里
到这里,我们就可以把(加密api)的eax的真实iat地址,填进EBX(IAT表)里了。
alpharome里
mov nowIATAddr, ReadDword(edi+4) //这里我们的edi再+4就是填充到IAT表的伪地址了。然后看具体命令。这里我是pop dword ptr ds:[edx]
所以我们看edx,他显示的地址就是iat表的地址。
加密 call api获取
这里看ebx(但是不一定的,大概率是ebx) 这个ebx的地址就是原来call xxxx的反汇编地址。(到OEP后可以搜索查看跨域调用的)
006457F4
加密 call iat填充完毕
这个时候还是一样的,因为之前的没call之前是同一个iat,所以这里我们直接把call xxxx修改成正确的。
循环。直到完成所有修复
来到OEP,进行dump
赋值,直接就是mov XXX,#909090#(这里的##里面的内容就是机器码)
暂无评论内容