首页
社区
课程
招聘
请教参数是如何传送的?
发表于: 2005-8-25 12:59 4155

请教参数是如何传送的?

2005-8-25 12:59
4155
研究一个VB程序,跟踪到要比较两个字符串。要进行MSVB60.DLL中的函数调用。但不明白参数是如何传送的:

主程序代码:
0066AFB2    >  8D45 9C     lea eax,dword ptr ss:[ebp-64]
0066AFB5    .  8D4D AC     lea ecx,dword ptr ss:[ebp-54]
0066AFB8    .  50          push eax
0066AFB9    .  51          push ecx
0066AFBA       FF15 F81040>call dword ptr ds:[<&MSVBVM60.__vbaVarTstEq>]       ;  MSVBVM60.__vbaVarTstEq

MSVBVM60.__vbaVarTstEq:
7349BBE6 M>  FF7424 08     push dword ptr ss:[esp+8]
7349BBEA     FF7424 08     push dword ptr ss:[esp+8]
7349BBEE     6A 00         push 0                     
7349BBF0     E8 2254FFFF   call MSVBVM60.73491017

MSVBVM60.73491017:
73491017     55            push ebp
73491018     8BEC          mov ebp,esp
7349101A     83EC 38       sub esp,38
7349101D     8B55 10       mov edx,dword ptr ss:[ebp+10]
73491020     8B4D 0C       mov ecx,dword ptr ss:[ebp+C]
73491023     53            push ebx
73491024     56            push esi
73491025     66:8B31       mov si,word ptr ds:[ecx]
73491028     57            push edi
73491029     66:8B3A       mov di,word ptr ds:[edx]
7349102C     B8 FF7F0000   mov eax,7FFF
73491031     23F8          and edi,eax
73491033     23F0          and esi,eax

调用前都有PUSH,是不是将参数入堆栈,以便传送。但调用的函数中并没有发现POP语句。

请问参数是如何传送的呢?
谢谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用ret x平衡堆栈就ok了。
2005-8-25 13:06
0
雪    币: 200
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
你最好买本罗云彬的 WIN下32位汇编程序设计

参数肯定是PUSH 压进堆栈里然后用函数处理的
至于没有POP 那是因为他这个函数内部返回的时候肯定已经平衡堆栈了
比如说  PUSH EAX
     PUAH ECX
     CALL XXXX
那么你跟入这个XXX的调用里返回的时候肯定会有 RET 8 的语句,这句就把压进的EAX和ECX弹出堆栈了,这就平衡了..不一定非要用POP
2005-8-25 14:03
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
谢谢。知道了
我的理解是:
   PUSH EAX
  PUAH ECX
   call yyyyyy

   在yyyyy中有RET X,
   相当于
   POP EXA
   POP EAX

但是对于:
7349BBE6 M>  FF7424 08     push dword ptr ss:[esp+8]
7349BBEA     FF7424 08     push dword ptr ss:[esp+8]
7349BBEE     6A 00         push 0                     
7349BBF0     E8 2254FFFF   call MSVBVM60.73491017

入栈的是一个内存中的数据和0,retn 时,不是寄存器内容。它是如何弹出栈的呢?特别是push 0,它弹出的又是什么?

但还要请教一下: retn X  中后面的数字代表什么?

太迷糊了,请大家再指教指教。
谢谢!
2005-8-25 15:29
0
雪    币: 200
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
堆栈的顶是用ESP来表示的,采用先进后出,高端内存向低断内存方向压和弹.
就象你象杯里放冰块,最先放进去的要最后才能拿出来~

调用了函数必然要恢复原来的ESP值,因为你用了PUSH一次, ESP就减了4,因为32位操作的都是DWORD类型.刚刚压了俩次PUSH ,那就是说减了8,你若只恢复ESP 而不做POP,那么一般就用RET 8 了, 若你压了三次,那就要 RET C 了  这时候ESP就恢复了,而原来那些ESP地址上面的数据就是垃圾了,没用了.
你若要弹出的直要赋予寄存器, 那就要用类似POP EAX,操作后相当于:
MOV eax,[esp]  堆栈顶的数据给EAX
add esp,4      ESP直加4

建仪你看书吧,这么简单的问题问来问去的~~
汗!!
2005-8-25 15:46
0
雪    币: 1267
活跃值: (567)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不是每个的人启点都是高的。
2005-8-26 00:48
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这些东西自己想可能会好久,经高人指点会事半功倍,看你们一问一答我也学到不少东西,真好!
2005-8-26 10:15
0
雪    币: 221
活跃值: (137)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
自己看书一种办法,但有的东西自己看有时确实不易理解。
2005-8-26 12:05
0
游客
登录 | 注册 方可回帖
返回
//