首页
社区
课程
招聘
求解一个反汇编的问题
发表于: 2011-5-24 23:10 5151

求解一个反汇编的问题

2011-5-24 23:10
5151
看一段程序反汇编出来的代码如下。

上面还有一堆。。。。这里不是一个函数开始的地方,出现的数字都是16进制

.....

push    0
push    3
push    edi
call    0084E390
push    eax
lea     ecx, dword ptr [ebp-8]
push    ecx
push    esi
call    005AC550
add     esp, 18

.....

问题:  第一个call的时候push进去了参数但是为什么出来的时候没有恢复堆栈,再第二个call的时候直接把两个函数的堆栈都恢复了,直接 + 0x18  也就是加了 6个,正好都恢复了。

想问什么情况下会出现这种情况,嵌套?递归?或者是其他什么,最好能附上一段C代码解释一下,源程序应该是VC写的。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
额,我想明白了,把函数的返回值作为参数了
void a()
{
   return 112
}

b(12,3,a()) ;   这样的,呵呵,不过还是把分结给第一个回帖的人吧
2011-5-24 23:18
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
lz好人。友情接分。。。
2011-5-24 23:32
0
雪    币: 175
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
果断插入
2011-5-24 23:33
0
雪    币: 81
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
额,先说明一下第二个函数的问题,0x18=24=8*3
第二个函数总共入栈三个参数eax,ecx,esi,每个都是一个8位的16进制数,所以函数出栈的其实只是这三个参数而不是像上面说的出栈6个……
然后关于第一个参数没有处理堆栈的问题,大概是他的调用方式吧,使用stdcall调用的函数,被调用的函数会自己处理堆栈平衡,而第二个函数大概是PASCAL方式调用的,要求调用者处理堆栈平衡。
不知讲的对否,欢迎大牛指正。
2011-5-25 01:54
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
LS 说的对, 和函数调用约定有关
第一个函数应该是__stdcall 调用约定,函数自己平衡堆栈(参数)
第二个可能是c调用约定, 谁调用谁平衡

lz可以调用一个简单的c 库函数比如 printf  和windows api 之后反汇编看区别
2011-5-25 09:45
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是这样的,0x18 是24没错,每个地址是8位,也就是说堆栈总共上移 8*0x18个bit ,而堆栈里面的数是32位(从压入的寄存器可以知道),所以从堆栈里面取数是这么取的,ebp+4   , ebp + 8, ebp + C  所以总共是恢复了6个参数是肯定没错的。不应该是调用约定的问题。
2011-5-25 10:16
0
雪    币: 81
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
额,我想说每个每个地址8位这没错,但是每一位只有4Bit,这样一个三十二位的数字才有4*8=32Bit,所以这儿不是8*0x18而是4*0x18=96Bit=32Bit*3也不知这么说对不?
2011-5-25 12:50
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
说字节呀,

位呀,bit呀,...多麻烦
2011-6-5 22:14
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
call 0084E390 调用的应该是个无参数的函数
call 005AC550 调用的则是一个带6个参数的函数
用的是C调用约定

C代码应该是这个样子:
fb(x, y, fa(), z, 3, 0);
2011-6-6 19:30
0
游客
登录 | 注册 方可回帖
返回
//