PDA

Просмотр полной версии : Как использовать Fastcall ? ХЭЛП!


bolvai
11.01.2016, 00:34
Хочу восстановить функцию из Engine.dll и немного ее изменить
int __thiscall sub_200D7CE0(int this, int a2)
{
int v3; // [sp+8h] [bp-10h]@1
int v4; // [sp+14h] [bp-4h]@1

sub_200D6990(this, a2);
v4 = 0;
*(_DWORD *)a2 = &off_2054182C;
*(_DWORD *)(a2 + 16) = 128;
*(_DWORD *)(a2 + 20) = 0;
FName__FName(&v3, L"Package.a", 1);
*(_DWORD *)(a2 + 48) = v3;
*(_DWORD *)(a2 + 64) = 2;
*(_DWORD *)(a2 + 56) = 1;
*(_DWORD *)(a2 + 72) = 1;
return a2;
}
Особых проблем в доступе к переменным этой функции нету, описываю я этот класс таким образом

bool SetHooks(void)
{
int AbnormalSleep;
AbnormalSleep = 0x200D7D10;
Hook::HookFunctionWithTrampoline(reinterpret_cast<unsigned char*>(AbnormalSleep), reinterpret_cast<unsigned char*>(AbnormalSleep_hookNew), trampoline);

}
typedef struct
{

void(__fastcall *subUnk1) (void* ecx, void* dummy,int unkA2); sub_200D6990
} hookedAbnSleep_class;
int __stdcall AbnormalSleep_hookNew(int unkA2) //sub_200D7CE0
{
int r = 0;

hookedAbnSleep_class *T;
__asm{mov T, ecx}
T->subUnk1(0, 0, unkA2);//sub_200D6990
return unkA2;
}
Но вся загвоздка у меня в том что я не могу понять как следует вызвать и описать эту функцию sub_200D6990 внутри моей AbnormalSleep_hookNew (так чтобы можно было поместить в нее аргументы и она работала как оригинальная) ?
Это можно проделать через Module Handle,GetProcAddress, или может еще как то.
Плиз знающие люди объясните =)) замучался....

Barsik
12.01.2016, 19:08
Это можно проделать через Module Handle,GetProcAddress, или может еще как то.

GetProcAddress получает адрес экспортированной функции, у тебя походу она не экспортирована. Может поможет:


// получаем указатель на функцию с нужным прототипом
typedef void (__thiscall *oOrigFunction)(MyClass*, LPVOID, int);
oOrigFunction pOrigFunction = (oOrigFunction)addr_origFunction; // addr_origFunction = 0x200D6990

void MyClass::myFunction(LPVOID dummy, int unkA2)
{
// вызов функции по указателю
pOrigFunction(this, dummy, unkA2);
}