64 lines
No EOL
1.7 KiB
C++
64 lines
No EOL
1.7 KiB
C++
#include <Windows.h>
|
|
#include <TlHelp32.h>
|
|
#include <stdio.h>
|
|
|
|
typedef void* (*GetInterfaceFn_t)();
|
|
typedef struct interfacereg_s {
|
|
GetInterfaceFn_t m_fnGetInterface;
|
|
const char* m_pName;
|
|
struct interfacereg_s* m_pNext;
|
|
} interfacereg_t;
|
|
|
|
void DumpInterfaces(PMODULEENTRY32 pModEntry,FILE* fDump)
|
|
{
|
|
DWORD dwFunc;
|
|
interfacereg_t* pInterfaceReg;
|
|
|
|
if(!(dwFunc = (DWORD)GetProcAddress(pModEntry->hModule,"CreateInterface"))) return;
|
|
fprintf(fDump,"==== %s ====\n",pModEntry->szModule);
|
|
if(*(PWORD)((char*)dwFunc+0x03) != 0x3D8B){
|
|
fputs("Signature failed\n",fDump);
|
|
return;
|
|
}
|
|
if(!(pInterfaceReg = **(interfacereg_t***)((char*)dwFunc+0x05))){
|
|
fputs("interfacereg_t null\n",fDump);
|
|
return;
|
|
return;
|
|
}
|
|
do {
|
|
fprintf(fDump,"\t%s %p\n",pInterfaceReg->m_pName,(DWORD)
|
|
((BYTE*)pInterfaceReg->m_fnGetInterface-pModEntry->modBaseAddr));
|
|
} while(pInterfaceReg = pInterfaceReg->m_pNext);
|
|
}
|
|
|
|
DWORD WINAPI StartThread(LPVOID lpArg)
|
|
{
|
|
FILE* fDump;
|
|
fopen_s(&fDump,"gm9_interface.txt","wb");
|
|
|
|
MODULEENTRY32 modEntry;
|
|
HANDLE hSnapshot = NULL;
|
|
DWORD dwCurProcId = GetCurrentProcessId();
|
|
|
|
modEntry.dwSize = sizeof(MODULEENTRY32);
|
|
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwCurProcId);
|
|
if(!hSnapshot) return 1;
|
|
if(Module32First(hSnapshot,&modEntry))
|
|
{
|
|
do {
|
|
if(modEntry.th32ProcessID!=dwCurProcId) continue;
|
|
DumpInterfaces(&modEntry,fDump);
|
|
} while(Module32Next(hSnapshot,&modEntry));
|
|
}
|
|
CloseHandle(hSnapshot);
|
|
fclose(fDump);
|
|
FreeLibraryAndExitThread((HMODULE)lpArg,0);
|
|
return 0;
|
|
}
|
|
|
|
BOOL APIENTRY DllMain(HINSTANCE hDll,DWORD fdwReason,LPVOID lpArg)
|
|
{
|
|
if(fdwReason==DLL_PROCESS_ATTACH)
|
|
CreateThread(0,0,StartThread,(LPVOID)hDll,0,0);
|
|
return TRUE;
|
|
} |