找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6621|回复: 0

[交流] 【汇编】再继续动态调用子程序(支持_CDECL和_stdcall)

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-1-25 19:48:20 | 显示全部楼层 |阅读模式
个源,动态调用子程序,支持_CDECL和_STDCALL(WinAPI)调用方式,无需选择调用方式,史无前"例"

本代码有堆栈平衡.
代码:
'----------------以下是E代码---------------------
.版本 2
.子程序 CZQ动态调用子程序_, 整数型, , By CZQZRY
.参数 地址, 整数型, , 可以为_CDECL和_stdcall
.参数 缓存区1, 整数型, 参考 可空, 一定要为参考,无需输入,为缓冲区(用来备份堆栈,以方便平衡栈)
.参数 缓存区2, 整数型, 参考 可空, 一定要为参考,无需输入,为缓冲区(用来备份EAX,以方便返回内容,如果在此处填写变量地址则改变量会变为调用子程序的返回值)
.参数 参数1, 整数型, 可空
.参数 参数2, 整数型, 可空
.参数 参数3, 整数型, 可空
.参数 参数4, 整数型, 可空
.参数 参数5, 整数型, 可空
.参数 参数6, 整数型, 可空
.参数 参数7, 整数型, 可空
.参数 参数8, 整数型, 可空
.参数 参数9, 整数型, 可空
.参数 参数10, 整数型, 可空
.参数 参数11, 整数型, 可空
.参数 参数12, 整数型, 可空
.参数 参数13, 整数型, 可空
.参数 参数14, 整数型, 可空
.参数 参数15, 整数型, 可空
置入代码 ({ 137, 101, 248, 86, 81, 51, 201, 81, 198, 193, 15, 139, 245, 129, 198, 152, 0, 0, 0, 131, 238, 8, 139, 198, 139, 0, 133, 192, 116, 8, 139, 70, 252, 80, 131, 69, 244, 4, 226, 235, 199, 192, 0, 0, 0, 0, 255, 85, 8, 139, 216, 139, 141, 20, 0, 0, 0, 137, 1, 139, 195, 41, 165, 248, 255, 255, 255, 3, 165, 248, 255, 255, 255, 201, 195 })
返回 (0)
'-------------以上是E代码----------------
'---------以下是汇编代码(只有重要的有注解,其他自己分析,改代码不是MASM源码,是OD反汇编的,因为源码不只这些,编译后要"提存"很麻烦)----- -

MOV DWORD PTR SS:[EBP-8],ESP '备份当前堆栈
PUSH ESI
PUSH ECX
XOR ECX,ECX
PUSH ECX
MOV CL,0F
MOV ESI,EBP
ADD ESI,98
SUB ESI,8
MOV EAX,ESI
MOV EAX,DWORD PTR DS:[EAX]
TEST EAX,EAX '测试EAX是否为0
JE SHORT a.004013C9 '根据测试结果来跳转
MOV EAX,DWORD PTR DS:[ESI-4]
PUSH EAX
ADD DWORD PTR SS:[EBP-C],4
LOOPD SHORT a.004013B6
MOV EAX,0
CALL DWORD PTR SS:[EBP+8] '调用地址
MOV EBX,EAX '把EAX COPY 到 EBX(备份,其实没必要,这是为了保证返回值正确)
MOV ECX,DWORD PTR SS:[EBP+14] '将堆栈[EBP+14] COPY到ECX
MOV DWORD PTR DS:[ECX],EAX '然后将EAX COPY到ECX的地址对应的数据
MOV EAX,EBX '把EBX COPY 到 EAX(还原,其实没必要,这是为了保证返回值正确)
SUB DWORD PTR SS:[EBP-8],ESP '计算当前堆栈与开头备份堆栈的差值
ADD ESP,DWORD PTR SS:[EBP-8] '平衡堆栈LEAVE 'POP掉堆栈
RETN '返回
'-------------以上是汇编代码---------------
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表