由于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错误,例如弄乱导致异常的顺序?