44*/
55
66#include <stdio.h>
7+ #include <assert.h>
78#include "winpe.h"
89
10+ #define DUMP (path , addr , size )\
11+ FILE *_fp = fopen(path, "wb");\
12+ fwrite(addr, 1, size, _fp);\
13+ fclose(_fp)
14+
915// these functions are stub function, will be filled by python
10- unsigned char g_oepshellcode [] = {0x90 };
11- unsigned char g_memiatshellcode [] = {0x90 };
16+ unsigned char g_oepinit_code [] = {0x90 };
17+ unsigned char g_membindiat_code [] = {0x90 };
18+ unsigned char g_memfindexp_code [] = {0x90 };
1219
1320void _oepshellcode (void * mempe_exe , void * mempe_dll ,
1421 void * shellcode , PIMAGE_SECTION_HEADER psecth , DWORD orgoeprva )
1522{
1623 // PE struct declear
24+ #define FUNC_SIZE 0x200
1725 void * mempe ;
1826 PIMAGE_DOS_HEADER pDosHeader ;
1927 PIMAGE_NT_HEADERS pNtHeader ;
@@ -28,13 +36,15 @@ void _oepshellcode(void *mempe_exe, void *mempe_dll,
2836 PIMAGE_IMPORT_BY_NAME pFuncName = NULL ;
2937
3038 // bind the pointer to buffer
31- size_t end = sizeof (g_oepshellcode );
32- size_t * pexeoepva = (size_t * )(g_oepshellcode + end - 6 * sizeof (size_t ));
33- size_t * pdllbase = (size_t * )(g_oepshellcode + end - 5 * sizeof (size_t ));
34- size_t * pdlloepva = (size_t * )(g_oepshellcode + end - 4 * sizeof (size_t ));
35- size_t * pmemiatbind = (size_t * )(g_oepshellcode + end - 3 * sizeof (size_t ));
36- size_t * pexeloadlibrarya = (size_t * )(g_oepshellcode + end - 2 * sizeof (size_t ));
37- size_t * pexegetprocessaddress = (size_t * )(g_oepshellcode + end - 1 * sizeof (size_t ));
39+ size_t oepinit_end = sizeof (g_oepinit_code );
40+ size_t memiatbind_start = FUNC_SIZE ;
41+ size_t memfindexp_start = memiatbind_start + FUNC_SIZE ;
42+ size_t * pexeoepva = (size_t * )(g_oepinit_code + oepinit_end - 6 * sizeof (size_t ));
43+ size_t * pdllbase = (size_t * )(g_oepinit_code + oepinit_end - 5 * sizeof (size_t ));
44+ size_t * pdlloepva = (size_t * )(g_oepinit_code + oepinit_end - 4 * sizeof (size_t ));
45+ size_t * pmemiatbind = (size_t * )(g_oepinit_code + oepinit_end - 3 * sizeof (size_t ));
46+ size_t * pexeloadlibrarya = (size_t * )(g_oepinit_code + oepinit_end - 2 * sizeof (size_t ));
47+ size_t * pexegetprocessaddress = (size_t * )(g_oepinit_code + oepinit_end - 1 * sizeof (size_t ));
3848
3949 // get the information of exe
4050 mempe = mempe_exe ;
@@ -46,12 +56,8 @@ void _oepshellcode(void *mempe_exe, void *mempe_dll,
4656 pImpEntry = & pDataDirectory [IMAGE_DIRECTORY_ENTRY_IMPORT ];
4757 pImpDescriptor = (PIMAGE_IMPORT_DESCRIPTOR )(mempe + pImpEntry -> VirtualAddress );
4858 size_t exeimagebase = pOptHeader -> ImageBase ;
49- DWORD exeoeprva = pOptHeader -> AddressOfEntryPoint ;
50- DWORD exeloadlibrarya_rva = winpe_memfindiat (
51- mempe , "kernel32.dll" , "LoadLibraryA" );
52- DWORD exegetprocessaddress_rva = winpe_memfindiat (
53- mempe , "kernel32.dll" , "GetProcAddress" );
54-
59+ size_t shellcodebase = exeimagebase + psecth -> VirtualAddress ;
60+
5561 // get the information of dll
5662 mempe = mempe_dll ;
5763 pDosHeader = (PIMAGE_DOS_HEADER )mempe ;
@@ -65,14 +71,22 @@ void _oepshellcode(void *mempe_exe, void *mempe_dll,
6571 // fill the address table
6672 * pexeoepva = exeimagebase + orgoeprva ;
6773 * pdllbase = dllimagebase ;
68- * pdlloepva = dllimagebase + dlloeprva ;
69- * pmemiatbind = exeimagebase + psecth -> VirtualAddress + end ;
70- * pexeloadlibrarya = exeimagebase + exeloadlibrarya_rva ;
71- * pexegetprocessaddress = exeimagebase + exegetprocessaddress_rva ;
74+ * pdlloepva = dllimagebase + pOptHeader -> AddressOfEntryPoint ;
75+ * pmemiatbind = shellcodebase + memiatbind_start ;
76+ * pexeloadlibrarya = exeimagebase +
77+ (size_t )(winpe_memfindiat (mempe_exe ,
78+ "kernel32.dll" , "LoadLibraryA" ) - mempe_exe );
79+ * pexegetprocessaddress = sizeof (size_t ) > 4 ?
80+ shellcodebase + memfindexp_start : // x64
81+ exeimagebase + (size_t )(winpe_memfindiat (mempe_exe , // x86
82+ "kernel32.dll" , "GetProcAddress" ) - mempe_exe );
7283
7384 // copy to the target
74- memcpy (shellcode , g_oepshellcode , sizeof (g_oepshellcode ));
75- memcpy (shellcode + end , g_memiatshellcode , sizeof (g_memiatshellcode ));
85+ memcpy (shellcode , g_oepinit_code , sizeof (g_oepinit_code ));
86+ memcpy (shellcode + memiatbind_start ,
87+ g_membindiat_code , sizeof (g_membindiat_code ));
88+ memcpy (shellcode + memfindexp_start ,
89+ g_memfindexp_code , sizeof (g_memfindexp_code ));
7690}
7791
7892int injectdll_mem (const char * exepath ,
@@ -111,7 +125,7 @@ int injectdll_mem(const char *exepath,
111125 strcpy ((char * )secth .Name , ".module" );
112126 winpe_noaslr (mempe_exe );
113127 winpe_appendsecth (mempe_exe , & secth );
114- DWORD orgoeprva = winpe_setoep (mempe_exe , secth .VirtualAddress );
128+ DWORD orgoeprva = winpe_oepval (mempe_exe , secth .VirtualAddress );
115129 winpe_memreloc (mempe_dll , imgbase_exe + secth .VirtualAddress + SHELLCODE_SIZE );
116130 _oepshellcode (mempe_exe , mempe_dll , shellcode , & secth , orgoeprva );
117131
@@ -129,16 +143,53 @@ int injectdll_mem(const char *exepath,
129143 return 0 ;
130144}
131145
132- int main ( int argc , char * argv [] )
146+ void test_exp ( )
133147{
134- char outpath [MAX_PATH ];
148+ // test loadlibrary, getprocaddress
149+ HMODULE hmod = NULL ;
150+ size_t exprva = 0 ;
151+ size_t expva = 0 ;
152+ void * func = NULL ;
153+
154+ hmod = LoadLibraryA ("kernel32.dll" );
155+ assert (hmod != NULL );
156+ expva = (size_t )GetProcAddress (hmod , "LoadLibraryA" );
157+ exprva = (size_t )winpe_memfindexp (hmod , "LoadLibraryA" ) - (size_t )hmod ;
158+ func = winpe_memforwardexp (hmod , exprva , LoadLibraryA , (PFN_GetProcAddress )winpe_memfindexp );
159+ assert (exprva != 0 && (size_t )func == expva && func != NULL );
160+ expva = (size_t )GetProcAddress (hmod , "InitializeSListHead" );
161+ exprva = (size_t )winpe_memfindexp (hmod , "InitializeSListHead" ) - (size_t )hmod ;
162+ func = winpe_memforwardexp (hmod , exprva , LoadLibraryA , (PFN_GetProcAddress )winpe_memfindexp );
163+ assert (exprva != 0 && (size_t )func == expva && func != NULL );
164+ expva = (size_t )GetProcAddress (hmod , "GetSystemTimeAsFileTime" );
165+ exprva = (size_t )winpe_memfindexp (hmod , "GetSystemTimeAsFileTime" ) - (size_t )hmod ;
166+ func = winpe_memforwardexp (hmod , exprva , LoadLibraryA , (PFN_GetProcAddress )winpe_memfindexp );
167+ assert (exprva != 0 && (size_t )func == expva && func != NULL );
168+ }
169+
170+ void test_memdll (char * dllpath )
171+ {
172+ size_t mempesize = 0 ;
173+ void * mempe = winpe_memload_file (dllpath , & mempesize , TRUE);;
174+ assert (mempe != 0 && mempesize != 0 );
175+ winpe_membindiat (mempe , LoadLibraryA , (PFN_GetProcAddress )winpe_memfindexp );
176+ winpe_memLoadLibrary (mempe );
177+ free (mempe );
178+ }
179+
180+ int main (int argc , char * argv [])
181+ {
182+ #ifdef _DEBUG
183+ test_exp ();
184+ if (argc > 3 ) test_memdll (argv [2 ]);
185+ #endif
135186 if (argc < 3 )
136187 {
137188 printf ("usage: win_injectmemdll exepath dllpath [outpath]\n" );
138189 printf ("v0.2, developed by devseed\n" );
139190 return 0 ;
140191 }
141-
192+ char outpath [ MAX_PATH ];
142193 if (argc >= 4 ) strcpy (outpath , argv [3 ]);
143194 else strcpy (outpath , "out.exe" );
144195 return injectdll_mem (argv [1 ], argv [2 ], outpath );
0 commit comments