////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "Main.h"
#include "AheadLib.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 常量
const CHAR STR_BlockHeader[] = "\r\n\r\n\r\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n";
const CHAR STR_BlockTail[] = "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n";
const CHAR STR_Preprocessor[] = "// 头文件\r\n#include <Windows.h>\r\n";
const CHAR STR_ExportComment[] = "// 导出函数\r\n";
const CHAR STR_ExportRedirect[] = "#pragma comment(linker, \"/EXPORT:%s=%s.%s,@%d\")\r\n";
const CHAR STR_ExportNormal[] = "#pragma comment(linker, \"/EXPORT:%s%s=_AheadLib_%s,@%d\")\r\n";
const CHAR STR_ExportNoname[] = "#pragma comment(linker, \"/EXPORT:Noname%d=_AheadLib_Noname%d,@%d,NONAME\")\r\n";
const CHAR STR_Macro[] =
"// 宏定义\r\n"
"#define EXTERNC extern \"C\"\r\n"
"#define NAKED __declspec(naked)\r\n"
"#define EXPORT __declspec(dllexport)\r\n"
"\r\n"
"#define ALCPP EXPORT NAKED\r\n"
"#define ALSTD EXTERNC EXPORT NAKED void __stdcall\r\n"
"#define ALCFAST EXTERNC EXPORT NAKED void __fastcall\r\n"
"#define ALCDECL EXTERNC NAKED void __cdecl\r\n";
const CHAR STR_Hook[] =
"// Hook 命名空间\r\n"
"namespace Hook\r\n"
"{\r\n"
" HHOOK m_hHook;\r\n // HOOK 句柄\r\n"
"\r\n"
"\r\n"
" // HOOK 函数\r\n"
" LRESULT CALLBACK HookProc(INT iCode, WPARAM wParam, LPARAM lParam)\r\n"
" {\r\n"
" if (iCode > 0)\r\n"
" {\r\n"
" ;\r\n"
" }\r\n"
"\r\n"
" return CallNextHookEx(m_hHook, iCode, wParam, lParam);\r\n"
" }\r\n"
"\r\n"
" // Hook\r\n"
" inline BOOL WINAPI Hook(INT iHookId = WH_CALLWNDPROC)\r\n"
" {\r\n"
" m_hHook = SetWindowsHookEx(iHookId, HookProc, NULL, GetCurrentThreadId());\r\n"
" return (m_hHook != NULL);\r\n"
" }\r\n"
"\r\n"
" // Unhook\r\n"
" inline VOID WINAPI Unhook()\r\n"
" {\r\n"
" if (m_hHook)\r\n"
" {\r\n"
" UnhookWindowsHookEx(m_hHook);\r\n"
" }\r\n"
" }\r\n"
"}\r\n";
const CHAR STR_AheadLib1[] =
"// AheadLib 命名空间\r\n"
"namespace AheadLib\r\n"
"{\r\n"
" HMODULE m_hModule = NULL; // 原始模块句柄\r\n"
" DWORD m_dwReturn[%d] = {0}; // 原始函数返回地址\r\n"
"\r\n"
"\r\n"
" // 加载原始模块\r\n"
" inline BOOL WINAPI Load()\r\n"
" {\r\n"
" TCHAR tzPath[MAX_PATH];\r\n"
" TCHAR tzTemp[MAX_PATH * 2];\r\n"
"\r\n"
" %s%s\"));\r\n"
" m_hModule = LoadLibrary(tzPath);\r\n"
" if (m_hModule == NULL)\r\n"
" {\r\n"
" wsprintf(tzTemp, TEXT(\"无法加载 %%s,程序无法正常运行。\"), tzPath);\r\n"
" MessageBox(NULL, tzTemp, TEXT(\"AheadLib\"), MB_ICONSTOP);\r\n"
" }\r\n"
"\r\n"
" return (m_hModule != NULL); \r\n"
" }\r\n"
" \r\n"
" // 释放原始模块\r\n"
" inline VOID WINAPI Free()\r\n"
" {\r\n"
" if (m_hModule)\r\n"
" {\r\n"
" FreeLibrary(m_hModule);\r\n"
" }\r\n"
" }\r\n"
"\r\n";
const CHAR STR_AheadLib2[] =
" // 获取原始函数地址\r\n"
" FARPROC WINAPI GetAddress(PCSTR pszProcName)\r\n"
" {\r\n"
" FARPROC fpAddress;\r\n"
" CHAR szProcName[16];\r\n"
" TCHAR tzTemp[MAX_PATH];\r\n"
"\r\n"
"%s"
" fpAddress = GetProcAddress(m_hModule, pszProcName);\r\n"
" if (fpAddress == NULL)\r\n"
" {\r\n"
" if (HIWORD(pszProcName) == 0)\r\n"
" {\r\n"
" wsprintf(szProcName, \"%%d\", pszProcName);\r\n"
" pszProcName = szProcName;\r\n"
" }\r\n"
"\r\n"
" wsprintf(tzTemp, TEXT(\"无法找到函数 %%hs,程序无法正常运行。\"), pszProcName);\r\n"
" MessageBox(NULL, tzTemp, TEXT(\"AheadLib\"), MB_ICONSTOP);\r\n"
" ExitProcess(-2);\r\n"
" }\r\n"
"\r\n"
" return fpAddress;\r\n"
" }\r\n"
"}\r\n"
"using namespace AheadLib;\r\n";
const CHAR STR_SystemPath[] = "GetSystemDirectory(tzPath, MAX_PATH);\r\n lstrcat(tzPath, TEXT(\"\\\\";
const CHAR STR_DefaultPath[] = "lstrcpy(tzPath, TEXT(\"";
const CHAR STR_LoadInNeed[] =
" if (m_hModule == NULL)\r\n"
" {\r\n"
" if (Load() == FALSE)\r\n"
" {\r\n"
" ExitProcess(-1);\r\n"
" }\r\n"
" }\r\n"
"\r\n";
const CHAR STR_DllMain[] =
"// 入口函数\r\n"
"BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)\r\n"
"{\r\n"
" if (dwReason == DLL_PROCESS_ATTACH)\r\n"
" {\r\n"
" DisableThreadLibraryCalls(hModule);\r\n"
"%s%s%s"
" }\r\n"
" else if (dwReason == DLL_PROCESS_DETACH)\r\n"
" {"
"%s%s%s"
"\r\n"
" }\r\n"
"\r\n"
" return TRUE;\r\n"
"}\r\n";
const CHAR STR_TlsAlloc[] =
"\r\n"
" for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)\r\n"
" {\r\n"
" m_dwReturn[i] = TlsAlloc();\r\n"
" }\r\n";
const CHAR STR_TlsFree[] =
"\r\n"
" for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)\r\n"
" {\r\n"
" TlsFree(m_dwReturn[i]);\r\n"
" }\r\n";
const CHAR STR_HookHook[] = "\r\n Hook::Hook();\r\n";
const CHAR STR_HookUnhook[] = "\r\n Hook::Unhook();\r\n";
const CHAR STR_LoadInEntry[] = "\r\n return Load();\r\n";
const CHAR STR_FreeInEntry[] = "\r\n Free();";
const CHAR STR_JumpToOrigin[] =
"// 导出函数\r\n"
"%s\r\n"
"{\r\n"
" GetAddress(%s);\r\n"
" __asm JMP EAX;\r\n"
"}\r\n";
const CHAR STR_CallOrigin[] =
"// 导出函数\r\n"
"%s\r\n"
"{\r\n"
" // 保存返回地址\r\n"
" __asm POP m_dwReturn[%d * TYPE long];\r\n\r\n"
" // 调用原始函数\r\n"
" GetAddress(%s)();\r\n\r\n"
" // 转跳到返回地址\r\n"
" __asm JMP m_dwReturn[%d * TYPE long];\r\n"
"}\r\n";
const CHAR STR_CallOriginTls[] =
"// 导出函数\r\n"
"%s\r\n"
"{\r\n"
" // 保存返回地址到 TLS\r\n"
" __asm PUSH m_dwReturn[%d * TYPE long];\r\n"
" __asm CALL DWORD PTR [TlsSetValue];\r\n\r\n"
" // 调用原始函数\r\n"
" GetAddress(%s)();\r\n\r\n"
" // 获取返回地址并返回\r\n"
" __asm PUSH EAX;\r\n"
" __asm PUSH m_dwReturn[%d * TYPE long];\r\n"
" __asm CALL DWORD PTR [TlsGetValue];\r\n"
" __asm XCHG EAX, [ESP];\r\n"
" __asm RET;\r\n"
"}\r\n";
const CHAR STR_ExportVariable[] = "// 导出变量\r\nEXPORT %s;\r\n";
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CAheadLib 类静态成员变量
BOOL CAheadLib::m_bCallRedirect = FALSE;
BOOL CAheadLib::m_bLoadIfNeed = FALSE;
BOOL CAheadLib::m_bJumpToOrigin = FALSE;
BOOL CAheadLib::m_bMultiThread = FALSE;
BOOL CAheadLib::m_bSystemPath = FALSE;
BOOL CAheadLib::m_bGenerateHook = FALSE;
TCHAR CAheadLib::m_tzDllFile[MAX_PATH] = {0};
TCHAR CAheadLib::m_tzCppFile[MAX_PATH] = {0};
CHAR CAheadLib::m_szOriginDll[MAX_PATH] = {0};
CHAR CAheadLib::m_szOrigin[MAX_PATH] = {0};
HMODULE CAheadLib::m_hDbgHelp = NULL;
UNDECORATESYMBOLNAME CAheadLib::m_pUnDecorateSymbolName = NULL;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ALRESULT WINAPI CAheadLib::Generate(BOOL bWriteCppFile)
{
DWORD i;
PSTR pszFile;
DWORD dwSize;
PSTR pszBuffer;
PSTR *ppszNames;
PDWORD pdwNames;
BOOL bLoadOrigin;
ALRESULT alResult;
PWORD pwNamesOrdinals;
PIMAGE_NT_HEADERS pInh;
PIMAGE_EXPORT_DIRECTORY pIed;
_Try
{
// 初始化
pszFile = NULL;
ppszNames = NULL;
pszBuffer = NULL;
SetDlgItemTextA(CMainDlg::m_hWnd, IDC_Preview, NULL);
// 判断参数是否完整
_LeaveExIf((m_szOrigin[0] == 0) || (m_tzDllFile[0] == 0) || (bWriteCppFile && (m_tzDllFile[