#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> #include <stdio.h> #include <stdlib.h> typedef PVOID (WINAPI *PSymFunctionTableAccess64)( HANDLE hProcess, DWORD64 AddrBase ); typedef BOOL (WINAPI *PSymInitialize)( HANDLE hProcess, PCSTR UserSearchPath, BOOL fInvadeProcess ); typedef DWORD (WINAPI *PSymLoadModule)( HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD BaseOfDll, DWORD SizeOfDll ); typedef BOOL (WINAPI *PSymUnloadModule)( HANDLE hProcess, DWORD BaseOfDll ); typedef BOOL (WINAPI *PSymCleanup)( HANDLE hProcess ); int main(int argc, char* argv[]) { PSymFunctionTableAccess64 psymfunctiontableaccess64; PSymInitialize psyminit; PSymLoadModule psymloadmodule; PSymUnloadModule psymunloadmodule; PSymCleanup psymcleanup; FPO_DATA *pfpodata; HINSTANCE dbghlp_dll; if ( argc != 3 ) { printf( "Syntax: fnent <filename> <FunctionName>\n" ); return 1; } char * pszExeName = argv[1]; DWORD64 FunctionAddress; FunctionAddress = (DWORD64)GetProcAddress(LoadLibrary(argv[1]),argv[2]); HANDLE hProcess = 0; dbghlp_dll = LoadLibrary("dbghelp.dll"); if(dbghlp_dll) { psyminit = (PSymInitialize) GetProcAddress(dbghlp_dll,"SymInitialize"); psymloadmodule = (PSymLoadModule) GetProcAddress(dbghlp_dll,"SymLoadModule"); psymunloadmodule = (PSymUnloadModule) GetProcAddress(dbghlp_dll,"SymUnloadModule"); psymcleanup = (PSymCleanup) GetProcAddress(dbghlp_dll,"SymCleanup"); psymfunctiontableaccess64 = (PSymFunctionTableAccess64) GetProcAddress(dbghlp_dll,"SymFunctionTableAccess64"); if((psyminit) && (psymloadmodule) && (psymunloadmodule) &&(psymcleanup) && (psymfunctiontableaccess64)) { printf("dbghelp dll loaded and address retrieved\n"); } else { printf("dbghelp loaded but get proc failed\n"); return 1; } } else { printf("load lib failed\n"); return 1; } if ( !psyminit( hProcess, 0, FALSE ) ) { printf( "SymInitialize failed\n" ); return 1; } DWORD dwModuleBase = psymloadmodule( hProcess, 0, pszExeName, 0, 0, 0 ); if ( !dwModuleBase ) { printf( "SymLoadModuleFailed\n" ); return 1; } pfpodata = (FPO_DATA *)psymfunctiontableaccess64(0,FunctionAddress); printf("pfpodata returned is %x\n",pfpodata); if(pfpodata !=0) { printf("pfpodata->ulOffStart is %x\n",pfpodata->ulOffStart); printf("pfpodata->cbProcSize is %x\n",pfpodata->cbProcSize); printf("pfpodata->cdwLocals is %x\n",pfpodata->cdwLocals); } psymunloadmodule( hProcess, dwModuleBase ); psymcleanup( hProcess ); return 0; }
test:/>fnent ntdll.dll ZwCreateFile dbghelp dll loaded and address retrieved pfpodata returned is 1140620 pfpodata->ulOffStart is 2595e pfpodata->cbProcSize is f pfpodata->cdwLocals is 0 test:/>
77EE368C %2....PAttempt to access invalid address.....PArithmetic resul
There are 31,322 total registered users.
[+] expand