个源,动态调用子程序,支持_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 '返回
'-------------以上是汇编代码--------------- |