DWORD adr_MessageBoxA;
BOOL WINAPI Intercept_MessageBoxA(HWND hwnd, char *text,char *hdr, UINT utype)
{
char *str = "Hi From MessageBOX!!!!";
((BOOL (__stdcall*)(HWND, char*, char*, UINT))adr_MessageBoxA)(hwnd,str, hdr, utype);
return TRUE;
}
void InterceptFunctions(void)
{
BYTE *pimage = (BYTE*)GetModuleHandle(NULL);
BYTE *pidata;
IMAGE_DOS_HEADER *idh;
IMAGE_OPTIONAL_HEADER *ioh;
IMAGE_SECTION_HEADER *ish;
IMAGE_IMPORT_DESCRIPTOR *iid;
DWORD *isd,written=0;
idh = (IMAGE_DOS_HEADER*)pimage;
ioh = (IMAGE_OPTIONAL_HEADER*)(pimage + idh->e_lfanew + 4 + sizeof(IMAGE_FILE_HEADER));
ish = (IMAGE_SECTION_HEADER*)((BYTE*)ioh + sizeof(IMAGE_OPTIONAL_HEADER));
if (idh->e_magic != 0x5A4D)
{
MessageBox(NULL, "Not exe hdr", "Error!", 0);
return;
}
int i;
for(i=0; i<16; i++)
if(strcmp((char*)((ish+ i)->Name) , ".idata") == 0) break;
if( i==16)
{
MessageBox(NULL, "Unable to find .idata section", "Error!", 0);
return;
}
iid = (IMAGE_IMPORT_DESCRIPTOR*)(pimage + (ish +i)->VirtualAddress );
adr_MessageBoxA = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
if(adr_MessageBoxA == 0)
{
MessageBox(NULL, "Can`t get addr_MessageBoxA", "Error!", 0);
return;
}
while(iid->Name)
{
if(strcmp((char*)(pimage + iid->Name), "USER32.dll") ==0 ) break;
iid++;
}
isd = (DWORD*)(pimage + iid->FirstThunk);
while(*isd!=adr_MessageBoxA && *isd!=0) isd++;
if(*isd == 0)
{
MessageBox(NULL, "adr_MessageBoxA not found in .idata", "Error!", 0);
return;
}
DWORD buf = (DWORD)&Intercept_MessageBoxA;
DWORD op;
VirtualProtect((void*)(isd),4,PAGE_READWRITE, &op);
WriteProcessMemory(GetCurrentProcess(), (void*)(isd),(void*)&buf,4,&written);
VirtualProtect((void*)(isd),4,op, &op);
if(written!=4)
{
MessageBox(NULL, "Unable rewrite address", "Error!", 0);
return;
}
}