Skip to content

Commit 44b8608

Browse files
committed
[+] new feature: support control arguments for peloader()
1 parent d67e7f7 commit 44b8608

5 files changed

Lines changed: 66 additions & 5 deletions

File tree

32&64bit/32bit.exe

-344 Bytes
Binary file not shown.

32&64bit/64bit.exe

1.86 KB
Binary file not shown.

32&64bit/PoC.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
// gcc PoC.cpp -Wl,--dynamicbase,--export-all-symbols -Wl,-- image-base=0xff00000
2+
#include <stdio.h>
13
#include <windows.h>
2-
3-
int main(void) {
4-
MessageBoxA(0, "Hello", "World", 0);
5-
}
4+
int main(int argc, char **argv)
5+
{
6+
printf("GetCommandLine() = \"%s\"\n", GetCommandLineA());
7+
for (int i = 0; i < argc; i++)
8+
printf("argv[%i] = %s\n", i, argv[i]);
9+
}
2.76 KB
Binary file not shown.

RunPE-In-Memory/RunPEinMemory/fixIAT.hpp

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,46 @@
1+
#include <string>
12
#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+
244

345
bool fixIAT(PVOID modulePtr)
446
{
@@ -49,7 +91,22 @@ bool fixIAT(PVOID modulePtr)
4991
LPSTR func_name = (LPSTR)by_name->Name;
5092
size_t addr = (size_t)GetProcAddress(LoadLibraryA(lib_name), func_name);
5193
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+
53110
}
54111
offsetField += sizeof(IMAGE_THUNK_DATA);
55112
offsetThunk += sizeof(IMAGE_THUNK_DATA);

0 commit comments

Comments
 (0)