/************************************************************************/ /* Dll inject For VC x64 */ /* copyright 2004-2016 www.chinapyg.com */ /* Code By PiaoYun/P.Y.G */ /* Fixed 2016-10-08 */ /************************************************************************/ // 头文件 #include <windows.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 #pragma comment(linker, "/EXPORT:GetFileVersionInfoA=ChinaPYG_GetFileVersionInfoA") #pragma comment(linker, "/EXPORT:GetFileVersionInfoByHandle=ChinaPYG_GetFileVersionInfoByHandle") #pragma comment(linker, "/EXPORT:GetFileVersionInfoExW=ChinaPYG_GetFileVersionInfoExW") #pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeA=ChinaPYG_GetFileVersionInfoSizeA") #pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeExW=ChinaPYG_GetFileVersionInfoSizeExW") #pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeW=ChinaPYG_GetFileVersionInfoSizeW") #pragma comment(linker, "/EXPORT:GetFileVersionInfoW=ChinaPYG_GetFileVersionInfoW") #pragma comment(linker, "/EXPORT:VerFindFileA=ChinaPYG_VerFindFileA") #pragma comment(linker, "/EXPORT:VerFindFileW=ChinaPYG_VerFindFileW") #pragma comment(linker, "/EXPORT:VerInstallFileA=ChinaPYG_VerInstallFileA") #pragma comment(linker, "/EXPORT:VerInstallFileW=ChinaPYG_VerInstallFileW") #pragma comment(linker, "/EXPORT:VerLanguageNameA=ChinaPYG_VerLanguageNameA") #pragma comment(linker, "/EXPORT:VerLanguageNameW=ChinaPYG_VerLanguageNameW") #pragma comment(linker, "/EXPORT:VerQueryValueA=ChinaPYG_VerQueryValueA") #pragma comment(linker, "/EXPORT:VerQueryValueW=ChinaPYG_VerQueryValueW") //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 宏定义 #define EXTERNC extern "C" #define ALSTD EXTERNC void __stdcall #define ALCDECL EXTERNC void __cdecl #define PYG TEXT("PYG") #define LOAD_ERROR TEXT("无法加载 %s,程序无法正常运行。") #define FUN_ERROR TEXT("无法找到函数 %hs,程序无法正常运行。") //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 汇编函数声明 ALSTD GetRcx(); ALSTD JmpAddr(INT64 _addr); ALSTD PatchBYTE(INT64 addr, byte data); ALSTD PatchWORD(INT64 addr, WORD data); ALSTD PatchDWORD(INT64 addr, DWORD data); ALSTD PatchQWORD(INT64 addr, INT64 data); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ChinaPYG 命名空间 namespace ChinaPYG { HMODULE m_hModule = NULL; // 原始模块句柄 DWORD m_dwReturn[5] = { 0 }; // 原始函数返回地址 // 加载原始模块 inline BOOL WINAPI Load() { TCHAR tzPath[MAX_PATH]; TCHAR tzTemp[MAX_PATH * 2]; GetSystemDirectory(tzPath, MAX_PATH); lstrcat(tzPath, TEXT("\\version.dll")); m_hModule = LoadLibrary(tzPath); if (m_hModule == NULL) { wsprintf(tzTemp, LOAD_ERROR, tzPath); MessageBox(NULL, tzTemp, PYG, MB_ICONSTOP); } return (m_hModule != NULL); } // 释放原始模块 inline VOID WINAPI Free() { if (m_hModule) { FreeLibrary(m_hModule); } } // 获取原始函数地址 FARPROC WINAPI GetAddress(PCSTR pszProcName) { FARPROC fpAddress; CHAR szProcName[16]; TCHAR tzTemp[MAX_PATH]; if (m_hModule == NULL) { if (Load() == FALSE) { ExitProcess(-1); } } fpAddress = GetProcAddress(m_hModule, pszProcName); if (fpAddress == NULL) { if (HIWORD(pszProcName) == 0) { wsprintf(szProcName, "%d", pszProcName); pszProcName = szProcName; } wsprintf(tzTemp, FUN_ERROR, pszProcName); MessageBox(NULL, tzTemp, PYG, MB_ICONSTOP); ExitProcess(-2); } return fpAddress; } } using namespace ChinaPYG; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void PatchIt() { // 写自己的Patch代码 DWORD dwOldProtect; HMODULE BaseAddr; INT64 PatchAddr; BaseAddr = GetModuleHandle(NULL); PatchAddr = (INT64)BaseAddr + 0x1ABA; VirtualProtect((LPVOID)PatchAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect); //*(PWORD)PatchAddr = 0x9090; PatchWORD(PatchAddr, 0x9090); } INT64 g_GetFileVersionInfoA = NULL; INT64 g_GetFileVersionInfoByHandle = NULL; INT64 g_GetFileVersionInfoExW = NULL; INT64 g_GetFileVersionInfoSizeA = NULL; INT64 g_GetFileVersionInfoSizeExW = NULL; INT64 g_GetFileVersionInfoSizeW = NULL; INT64 g_GetFileVersionInfoW = NULL; INT64 g_VerFindFileA = NULL; INT64 g_VerFindFileW = NULL; INT64 g_VerInstallFileA = NULL; INT64 g_VerInstallFileW = NULL; INT64 g_VerLanguageNameA = NULL; INT64 g_VerLanguageNameW = NULL; INT64 g_VerQueryValueA = NULL; INT64 g_VerQueryValueW = NULL; VOID InitFun() { g_GetFileVersionInfoA = (INT64)GetAddress("GetFileVersionInfoA"); g_GetFileVersionInfoByHandle = (INT64)GetAddress("GetFileVersionInfoByHandle"); g_GetFileVersionInfoExW = (INT64)GetAddress("GetFileVersionInfoExW"); g_GetFileVersionInfoSizeA = (INT64)GetAddress("GetFileVersionInfoSizeA"); g_GetFileVersionInfoSizeExW = (INT64)GetAddress("GetFileVersionInfoSizeExW"); g_GetFileVersionInfoSizeW = (INT64)GetAddress("GetFileVersionInfoSizeW"); g_GetFileVersionInfoW = (INT64)GetAddress("GetFileVersionInfoW"); g_VerFindFileA = (INT64)GetAddress("VerFindFileA"); g_VerFindFileW = (INT64)GetAddress("VerFindFileW"); g_VerInstallFileA = (INT64)GetAddress("VerInstallFileA"); g_VerInstallFileW = (INT64)GetAddress("VerInstallFileW"); g_VerLanguageNameA = (INT64)GetAddress("VerLanguageNameA"); g_VerLanguageNameW = (INT64)GetAddress("VerLanguageNameW"); g_VerQueryValueA = (INT64)GetAddress("VerQueryValueA"); g_VerQueryValueW = (INT64)GetAddress("VerQueryValueW"); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 入口函数 BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hModule); if (Load()) { InitFun(); //PatchIt(); } else return FALSE; break; } case DLL_PROCESS_DETACH: { Free(); break; } } return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoA(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoByHandle(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoByHandle); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoExW(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoExW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoSizeA(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoSizeA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoSizeExW(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoSizeExW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoSizeW(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoSizeW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_GetFileVersionInfoW(void) { GetRcx(); JmpAddr(g_GetFileVersionInfoW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerFindFileA(void) { GetRcx(); JmpAddr(g_VerFindFileA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerFindFileW(void) { GetRcx(); JmpAddr(g_VerFindFileW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerInstallFileA(void) { GetRcx(); JmpAddr(g_VerInstallFileA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerInstallFileW(void) { GetRcx(); JmpAddr(g_VerInstallFileW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerLanguageNameA(void) { GetRcx(); JmpAddr(g_VerLanguageNameA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerLanguageNameW(void) { GetRcx(); JmpAddr(g_VerLanguageNameW); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerQueryValueA(void) { GetRcx(); JmpAddr(g_VerQueryValueA); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 导出函数 ALCDECL ChinaPYG_VerQueryValueW(void) { GetRcx(); JmpAddr(g_VerQueryValueW); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ASM obj部分源代码:
https://www.dllhook.com/post/12.html
已有14位网友发表了看法:
unresolved external symbol JmpAddr referenced in function
还有个obj要编译,看上面汇编代码
你先注释掉这个函数直接转发~~
发表评论