这是一段韩国的xTrap的驱动装载程序,本身很简单
seg000:4041486D push eax
seg000:4041486E push offset a??S ; "\\??\\%s"
seg000:40414873 push ecx ; char *
seg000:40414874 mov [esp+23Ch+phkResult], ebx
seg000:40414878 mov [esp+23Ch+var_20C], 2
seg000:40414880 mov [esp+23Ch+var_210_length], 104h
seg000:40414888 call ds:sprintf
seg000:4041488E add esp, 0Ch
seg000:40414891 lea edx, [esp+
230h+phkResult] //<---这里,在call sprintf之后,已经调整了堆栈,esp对栈上临时变量寻址正确
seg000:40414895 push edx ; phkResult
seg000:40414896 push offset SubKey ;
seg000:4041489B push 80000002h ; hKey
seg000:404148A0 call ds:
RegOpenKeyA //<--call之后esp寻址应该被解释为 [esp+230h+var_xx]才对
seg000:404148A6 test eax, eax
seg000:404148A8 jnz short loc_40414929
seg000:404148AA lea eax, [esp+
23Ch+cbData] //<---但这里确解释为[esp+23Ch+var_xx],那个0x0C的空间在RegOpenKeyA中已经释放掉了,而且IDA也正确识别出RegOpenKeyA是stdcall,这里为什么却没有修改对临时变量的寻址的基址
seg000:404148AE lea ecx, [esp+
23Ch+Data]
seg000:404148B5 push eax ; lpcbData
seg000:404148B6 mov eax, [esp+240h+hKey]
seg000:404148BA lea edx, [esp+240h+Type]
seg000:404148BE push ecx ; lpData
不过那个RegOpenKeyA并不是FF15到IAT中的,是程序自己直接GetProcAddress来的,不知道是否是这个原因
另外,好像IDA对这个程序里所有的自己GetProcAddress来的API的调用都没有按照stdcall来修改堆栈。我是根据代码把相应的DWord改为API的name,然后IDA就自动给这些name加上stdcall和参数名称了。
IDA的版本是5.0的英文版
我不知道能否手工修改那个esp对临时变量寻址的基址,请高手指教
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法