能力值:
( LV2,RANK:10 )
|
-
-
2 楼
额,我想明白了,把函数的返回值作为参数了
void a()
{
return 112
}
b(12,3,a()) ; 这样的,呵呵,不过还是把分结给第一个回帖的人吧
|
能力值:
( LV9,RANK:610 )
|
-
-
3 楼
lz好人。友情接分。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
果断插入
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
额,先说明一下第二个函数的问题,0x18=24=8*3
第二个函数总共入栈三个参数eax,ecx,esi,每个都是一个8位的16进制数,所以函数出栈的其实只是这三个参数而不是像上面说的出栈6个……
然后关于第一个参数没有处理堆栈的问题,大概是他的调用方式吧,使用stdcall调用的函数,被调用的函数会自己处理堆栈平衡,而第二个函数大概是PASCAL方式调用的,要求调用者处理堆栈平衡。
不知讲的对否,欢迎大牛指正。
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
LS 说的对, 和函数调用约定有关
第一个函数应该是__stdcall 调用约定,函数自己平衡堆栈(参数)
第二个可能是c调用约定, 谁调用谁平衡
lz可以调用一个简单的c 库函数比如 printf 和windows api 之后反汇编看区别
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
是这样的,0x18 是24没错,每个地址是8位,也就是说堆栈总共上移 8*0x18个bit ,而堆栈里面的数是32位(从压入的寄存器可以知道),所以从堆栈里面取数是这么取的,ebp+4 , ebp + 8, ebp + C 所以总共是恢复了6个参数是肯定没错的。不应该是调用约定的问题。
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
额,我想说每个每个地址8位这没错,但是每一位只有4Bit,这样一个三十二位的数字才有4*8=32Bit,所以这儿不是8*0x18而是4*0x18=96Bit=32Bit*3 也不知这么说对不?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
说字节呀,
位呀,bit呀,...多麻烦
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
call 0084E390 调用的应该是个无参数的函数
call 005AC550 调用的则是一个带6个参数的函数
用的是C调用约定
C代码应该是这个样子:
fb(x, y, fa(), z, 3, 0);
|
|
|