首页
社区
课程
招聘
[旧帖] [求助]esp对栈上临时变量寻址,IDA在一个stdcall后面没有调整没有调整esp+xxx 0.00雪花
发表于: 2008-6-2 10:37 3704

[旧帖] [求助]esp对栈上临时变量寻址,IDA在一个stdcall后面没有调整没有调整esp+xxx 0.00雪花

2008-6-2 10:37
3704
这是一段韩国的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对临时变量寻址的基址,请高手指教

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
上面没任何奇怪的地方
这只是 IDA 的表示方式.
cbData 是固定的, IDA得配合他.
假设 cbData=8  ,  +8 是固定的, 他当然得变前面的 +????h 啰
你再想一想就了解了.
啊我不会讲啦.
2008-6-2 10:56
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
哈哈,可以手工调整,在调用API的那一行右键选“change stack pointer"就可以
不过还是不知道为什么IDA没有自动识别出来,象这种大部分API都是自己GetProcAddress来的程序,要是手工调整,会累死人的。
2008-6-2 11:13
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
多谢。
我明白是要加 +xxxh的,不过我问的是为什么IDA没有自动把这个+XXXh调整好。因为没有调整好,栈上的变量根本就对不上,阅读起来很困难
2008-6-2 11:16
0
游客
登录 | 注册 方可回帖
返回
//