返回时C ++内联ASM异常

时间:2016-03-19 00:08:18

标签: c++ assembly x86

由于WPO补丁,我通过注入的DLL调用的函数的方式发生了变化。 该函数是__fastcall

原始功能看起来像

PUSH EAX
MOV EAX,DWORD PTR SS:[ESP]
PUSH EAX
LEA EBX,[ARG.22]
LEA EDI,[ARG.23]
CALL Function

所以我可以通过以下方式调用它:

Push ebx
Push edi
Push 0  
Push 0  
lea ebx,dword ptr ss:[ecx]
lea edi,dword ptr ss:[edx]
call Function
Pop edi
Pop ebx
retn

该功能只需要2个ascii字符串。

现在在WPO之后,功能变为

PUSH 0
LEA EDX,[LOCAL.22]
PUSH EDX
LEA EDX,[LOCAL.23] 
XOR ECX,ECX   
CALL Function

常见的快速呼叫,看起来更简单。但是问题开始时ebp寄存器带有一个数字,而esi和edi带有相同的字符串但是用Unicode。

虽然调用仍然只需要2个参数,但寄存器包含所需的附加信息。

因此,我不是通过ecx和edx上的2 Ascii调用函数,而是编写了一个包含ascii和unicode字符串的结构。

我尝试解决它看起来像

pushad
push 0
lea edi,dword ptr ss:[ecx+0x20]
lea esi,dword ptr ss:[ecx]
mov ebp, 100    

lea edx,dword ptr ss:[ecx+0x50]
push edx
lea edx,dword ptr ss:[ecx+0x40]
xor ecx, ecx
call Function
pop edx
popad
retn

我在调试器中跟着它,并且调用按原样处理,但是在函数返回到我的asmstub并返回到我的c ++代码之后,我的代码在写入时创建了一个异常。

我是否犯了一个基本的asm错误,例如弄乱导致异常的顺序?

0 个答案:

没有答案