#pragma once
///////////////////////////////////////////////////////////////////////////////////////
//
//调用方法:
// mkThisCall(对像指针,对像功能函数偏移,参数.... );
// mkThisCall(ECX,functionofs,....);
//
//
//
////////////////////////////////////////////////////////////////////////////////////////
extern unsigned long __cdecl mkThiscall (unsigned long lpthis,unsigned long functi**,...);
extern float __cdecl mkThiscallF(unsigned long lpthis,unsigned long functi**,...);
extern char* __cdecl mkThiscallC(unsigned long lpthis,unsigned long functi**,...);
__declspec(naked) unsigned long __cdecl mkThiscall(unsigned long lpthis,unsigned long functi**,...)
{
__asm
{
push ebp
mov ebp,esp
sub esp,20*4
push esi
push edi
lea edi,[esp+4*2] ;前面多push了2个字节,这里从ebp-20开始
lea esi,[ebp+10h] ;第3个参数开始拷贝
mov ecx,20
rep movsd
pop edi
pop esi
mov eax,[ebp+0Ch]
cmp eax,10000h
ja mkThiscall_fun
mov eax,[ebp+08h]
mov eax,[eax]
add eax,[ebp+0Ch]
mov eax,[eax]
jmp mkThiscall_ok
mkThiscall_fun:
mov eax,[ebp+0Ch]
mkThiscall_ok:
mov ecx,[ebp+08h]
call eax
mov esp,ebp
pop ebp
retn
}
}
__declspec(naked) float __cdecl mkThiscallF(unsigned long lpthis,unsigned long functi**,...)
{
__asm
{
push ebp
mov ebp,esp
sub esp,20*4
push esi
push edi
lea edi,[esp+4*2]
lea esi,[ebp+10h]
mov ecx,20
rep movsd
pop edi
pop esi
mov eax,[ebp+0Ch]
cmp eax,10000h
ja mkThiscall_fun
mov eax,[ebp+08h]
mov eax,[eax]
add eax,[ebp+0Ch]
mov eax,[eax]
jmp mkThiscall_ok
mkThiscall_fun:
mov eax,[ebp+0Ch]
mkThiscall_ok:
mov ecx,[ebp+08h]
call eax
mov esp,ebp
pop ebp
retn
}
}
__declspec(naked) char* __cdecl mkThiscallC(unsigned long lpthis,unsigned long functi**,...)
{
__asm
{
push ebp
mov ebp,esp
sub esp,20*4
push esi
push edi
lea edi,[esp+4*2]
lea esi,[ebp+10h]
mov ecx,20
rep movsd
pop edi
pop esi
mov eax,[ebp+0Ch]
cmp eax,10000h
ja mkThiscall_fun
mov eax,[ebp+08h]
mov eax,[eax]
add eax,[ebp+0Ch]
mov eax,[eax]
jmp mkThiscall_ok
mkThiscall_fun:
mov eax,[ebp+0Ch]
mkThiscall_ok:
mov ecx,[ebp+08h]
call eax
mov esp,ebp
pop ebp
retn
}
}
|