从地址调用功能

时间:2018-07-05 08:10:45

标签: c++ assembly

我有这个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)

这是用于发送功能之前用于游戏的加密缓冲区 所以我需要加密我的自定义缓冲区,并在发送函数中将其发送给我们

那么,你看到了什么??

1 个答案:

答案 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中,但是当然我们不知道它是怎么到达那里的。