-
-
VC++调用win32汇编DLL由于ESI寄存器使用不当导致的问题
-
发表于:
2021-3-30 10:30
4096
-
VC++调用win32汇编DLL由于ESI寄存器使用不当导致的问题
老夫N久前用win32汇编写的一个与读卡器硬件交互的DLL供上层应用(C#)调用,上线运行一来一直相安无事。
直到昨日,该功能需要提供微型HTTP服务,老夫用C++进行调用win32汇编DLL中的一个导出函数,很简单很简单,但是·一运行,砰,嗝屁,debug下报错如图:
releas下虽不报错但得到的返回数据也会出现莫名问题,不完整,偶尔还直接驾崩,
出现这个问题无外乎想到2个原因:
1、被调用函数本身问题,函数体内出现某些异常导致堆栈平衡被破坏。
2、函数调用约定问题。
先是检查了下调用约定,也确实存在问题,我申明的是:
typedef int(FUN_xxxxxxx)(char);
这样一来VS默认的是cdecl方式,看了下当时汇编的源码是:
.model flat,stdcall
stdcall和cdecl区别这里就不多废话了╮(╯▽╰)╭;就是个由谁来扫尾的区别
随后改成typedef int(stdcall FUN_xxxxxxx)(char);
在编译运行,卧槽·问题依旧,╮(╯▽╰)╭,当时老夫坐在办公椅上背靠着思索勒许久。
随后打开VS反汇编模式进行调试,一通调试后,最后偶然发现一个细节处
DEBUG模式下注意到有这么一句:
比较之前保存在ESI中的原始ESP进行比较,要是不同进行CheckEsp检查就完蛋。
至此明白了,由于老夫在汇编代码中使用结构体时用了ESI寄存器
随后修正如下:
就是在使用ESI之前和之后分别加入PUSH ESI POP ESI来保存恢复ESI
至此,问题解决重新提交版本,通知更新,╮(╯▽╰)╭。
也是提醒,在汇编下使用某些特殊寄存器使用前最好还是push,pop下,以免跨语言使用出现莫名其妙的问题,╮(╯▽╰)╭
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)