我有这个asm函数调用
push ebx | Lenght Of Buf
lea eax,dword ptr ss:[ebp] |
push eax | Address To Write Crypted Buf
push dword ptr ss:[ebp-18] | Address Of Orignal Buf
mov ecx,edi |
call 0x008EC40E | crypter function
我需要从注入目标的Dll(C ++)中调用此函数 诸如此类的东西不起作用
typedef int func(void* Source, void* Dest, int len);
func* f = (func*)(base + 0x341E38);
int i = f(Src, Dst, sizeof Dst);
我不知道我的C ++是否正确,所以请帮忙。 运行此代码目标进程崩溃后,我需要更正c ++调用
那是我的功能主体
push ebp
mov ebp,esp
xor eax,eax
cmp byte ptr ds:[ecx+C],al
je lordsco.8EC44E
cmp dword ptr ds:[ecx],eax
je lordsco.8EC44E
cmp dword ptr ss:[ebp+C],eax
je lordsco.8EC44E
cmp dword ptr ss:[ebp+8],eax
je lordsco.8EC44E
cmp dword ptr ss:[ebp+10],eax
jle lordsco.8EC44E
push 1
lea eax,dword ptr ds:[ecx+8]
push eax
lea eax,dword ptr ds:[ecx+15]
push eax
add ecx,20
push ecx
push dword ptr ss:[ebp+10]
push dword ptr ss:[ebp+C]
push dword ptr ss:[ebp+8]
call lordsco.996560
add esp,1C
mov al,1
jmp lordsco.8EC450
xor al,al
pop ebp
ret C
以及IDA Pro声明的功能
char __thiscall CaypterFunc(int this, int a2, int a3, int a4)
那个Func叫这个func
int *__cdecl CaypterFunc2(int a1, int a2, int a3, int a4, int a5, int *a6, int a7)
这是用于发送功能之前用于游戏的加密缓冲区 所以我需要加密我的自定义缓冲区,并在发送函数中将其发送给我们
那么,你看到了什么??
答案 0 :(得分:1)
您的功能签名:
typedef int func(void* Source, void* Dest, int len);
完全是错误的,或者说不足以要调用的函数。 IDA将其标识为__thiscall
,因此(很可能是)C ++成员函数。这意味着调用需要在堆栈上传递参数,并将this
指针放入ecx
:
push ebx | Lenght Of Buf
lea eax,dword ptr ss:[ebp] |
push eax | Address To Write Crypted Buf
push dword ptr ss:[ebp-18] | Address Of Orignal Buf
mov ecx,edi | <<< "this" pointer set here
call 0x008EC40E
所以C ++声明将更接近
class Something;
typedef int (Something::*func)(void* Source, void* Dest, int len);
您仍然需要找出什么是“某物”,或者至少获取应该在其上调用成员函数的this
指针(在您提供的代码中该指针位于edi
中,但是当然我们不知道它是怎么到达那里的。