|
| 1 | +#include <string> |
1 | 2 | #include <windows.h> |
| 3 | +using namespace std; |
| 4 | +char* sz_masqCmd_Ansi = NULL, *sz_masqCmd_ArgvAnsi[100] = { }; |
| 5 | +wchar_t* sz_masqCmd_Widh = NULL, *sz_masqCmd_ArgvWidh[100] = { }; |
| 6 | +int int_masqCmd_Argc = 0; |
| 7 | +LPWSTR hookGetCommandLineW() { return sz_masqCmd_Widh; } |
| 8 | +LPSTR hookGetCommandLineA() { return sz_masqCmd_Ansi; } |
| 9 | +int __wgetmainargs(int* _Argc, wchar_t*** _Argv, wchar_t*** _Env, int _useless_, void* _useless) { |
| 10 | + *_Argc = int_masqCmd_Argc; |
| 11 | + *_Argv = (wchar_t **)sz_masqCmd_ArgvWidh; |
| 12 | + return 0; |
| 13 | +} |
| 14 | +int __getmainargs(int* _Argc, char*** _Argv, char*** _Env, int _useless_, void* _useless) { |
| 15 | + *_Argc = int_masqCmd_Argc; |
| 16 | + *_Argv = (char **)sz_masqCmd_ArgvAnsi; |
| 17 | + return 0; |
| 18 | +} |
| 19 | + |
| 20 | +void masqueradeCmdline(const wchar_t* cmdline) { |
| 21 | + if (!cmdline) return; |
| 22 | + auto sz_wcmdline = wstring(cmdline); |
| 23 | + |
| 24 | + // |
| 25 | + sz_masqCmd_Widh = new wchar_t[sz_wcmdline.size() + 1]; |
| 26 | + lstrcpyW(sz_masqCmd_Widh, sz_wcmdline.c_str()); |
| 27 | + |
| 28 | + // |
| 29 | + auto k = string(sz_wcmdline.begin(), sz_wcmdline.end()); |
| 30 | + sz_masqCmd_Ansi = new char[k.size() + 1]; |
| 31 | + lstrcpyA(sz_masqCmd_Ansi, k.c_str()); |
| 32 | + |
| 33 | + wchar_t** szArglist = CommandLineToArgvW(cmdline, &int_masqCmd_Argc); |
| 34 | + for (size_t i = 0; i < int_masqCmd_Argc; i++) { |
| 35 | + sz_masqCmd_ArgvWidh[i] = new wchar_t[lstrlenW(szArglist[i]) + 1]; |
| 36 | + lstrcpyW(sz_masqCmd_ArgvWidh[i], szArglist[i]); |
| 37 | + |
| 38 | + auto b = string(wstring(sz_masqCmd_ArgvWidh[i]).begin(), wstring(sz_masqCmd_ArgvWidh[i]).end()); |
| 39 | + sz_masqCmd_ArgvAnsi[i] = new char[b.size() + 1]; |
| 40 | + lstrcpyA(sz_masqCmd_ArgvAnsi[i], b.c_str()); |
| 41 | + } |
| 42 | +} |
| 43 | + |
2 | 44 |
|
3 | 45 | bool fixIAT(PVOID modulePtr) |
4 | 46 | { |
@@ -49,7 +91,22 @@ bool fixIAT(PVOID modulePtr) |
49 | 91 | LPSTR func_name = (LPSTR)by_name->Name; |
50 | 92 | size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), func_name); |
51 | 93 | printf(" [V] API %s at %x\n", func_name, addr); |
52 | | - fieldThunk->u1.Function = addr; |
| 94 | + if (strcmpi(func_name, "GetCommandLineA") == 0) |
| 95 | + fieldThunk->u1.Function = (size_t)hookGetCommandLineA; |
| 96 | + else if (strcmpi(func_name, "GetCommandLineW") == 0) |
| 97 | + fieldThunk->u1.Function = (size_t)hookGetCommandLineW; |
| 98 | + else if (strcmpi(func_name, "__wgetmainargs") == 0) { |
| 99 | + |
| 100 | + fieldThunk->u1.Function = (size_t)__wgetmainargs; |
| 101 | + } |
| 102 | + else if (strcmpi(func_name, "__getmainargs") == 0) { |
| 103 | + fieldThunk->u1.Function = (size_t)__getmainargs; |
| 104 | + |
| 105 | + } |
| 106 | + |
| 107 | + else |
| 108 | + fieldThunk->u1.Function = addr; |
| 109 | + |
53 | 110 | } |
54 | 111 | offsetField += sizeof(IMAGE_THUNK_DATA); |
55 | 112 | offsetThunk += sizeof(IMAGE_THUNK_DATA); |
|
0 commit comments