89
89
v1.80, 28 October & 30 November, 2017:
90
90
write newline with _putws, not putwchar (fixes redirecting to CON);
91
91
use -pu to unload from the parent.
92
+
93
+ v1.84, 7 May, 2018:
94
+ import the DLL.
92
95
*/
93
96
94
- #define PDATE L"4 May, 2018"
97
+ #define PDATE L"7 May, 2018"
95
98
96
99
#include "ansicon.h"
97
100
#include "version.h"
@@ -128,25 +131,6 @@ BOOL GetParentProcessInfo( LPPROCESS_INFORMATION ppi, LPTSTR );
128
131
129
132
130
133
static HANDLE hConOut ;
131
- static WORD wAttr ;
132
-
133
- void get_original_attr ( void )
134
- {
135
- CONSOLE_SCREEN_BUFFER_INFO csbi ;
136
-
137
- hConOut = CreateFile ( L"CONOUT$" , GENERIC_READ | GENERIC_WRITE ,
138
- FILE_SHARE_READ | FILE_SHARE_WRITE ,
139
- NULL , OPEN_EXISTING , 0 , 0 );
140
- GetConsoleScreenBufferInfo ( hConOut , & csbi );
141
- wAttr = csbi .wAttributes ;
142
- }
143
-
144
-
145
- void set_original_attr ( void )
146
- {
147
- SetConsoleTextAttribute ( hConOut , wAttr );
148
- CloseHandle ( hConOut );
149
- }
150
134
151
135
152
136
// The fputws function in MSVCRT.DLL (Windows 7 x64) is broken for Unicode
@@ -172,53 +156,6 @@ int my_fputws( const wchar_t* s, FILE* f )
172
156
#define _putws ( s ) my_fputws( s L"\n", stdout )
173
157
174
158
175
- HANDLE hHeap ;
176
- #if defined(_WIN64 )
177
- LPTSTR DllNameType ;
178
- #endif
179
-
180
- // Find the name of the DLL and inject it.
181
- BOOL Inject ( LPPROCESS_INFORMATION ppi , BOOL * gui , LPCTSTR app )
182
- {
183
- DWORD len ;
184
- int type ;
185
- PBYTE base ;
186
-
187
- #ifdef _WIN64
188
- if (app != NULL )
189
- #endif
190
- DEBUGSTR ( 1 , "%S (%u)" , app , ppi -> dwProcessId );
191
- type = ProcessType ( ppi , & base , gui );
192
- if (type <= 0 )
193
- {
194
- if (type == 0 )
195
- fwprintf ( stderr , L"ANSICON: %s: unsupported process.\n" , app );
196
- return FALSE;
197
- }
198
-
199
- len = (DWORD )(prog - prog_path );
200
- memcpy ( DllName , prog_path , TSIZE (len ) );
201
- #ifdef _WIN64
202
- _snwprintf ( DllName + len , MAX_PATH - 1 - len ,
203
- L"ANSI%d.dll" , (type == 48 ) ? 64 : type );
204
- DllNameType = DllName + len + 4 ;
205
- set_ansi_dll ();
206
- if (type == 64 )
207
- InjectDLL ( ppi , base );
208
- else if (type == 32 )
209
- InjectDLL32 ( ppi , base );
210
- else // (type == 48)
211
- RemoteLoad64 ( ppi );
212
- #else
213
- wcscpy ( DllName + len , L"ANSI32.dll" );
214
- set_ansi_dll ();
215
- InjectDLL ( ppi , base );
216
- #endif
217
-
218
- return TRUE;
219
- }
220
-
221
-
222
159
// Use CreateRemoteThread to (un)load our DLL in the target process.
223
160
void RemoteLoad ( LPPROCESS_INFORMATION ppi , LPCTSTR app , BOOL unload )
224
161
{
@@ -227,7 +164,6 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload )
227
164
PBYTE proc ;
228
165
DWORD rva ;
229
166
BOOL fOk ;
230
- DWORD len ;
231
167
LPVOID param ;
232
168
HANDLE thread ;
233
169
DWORD ticks ;
@@ -236,7 +172,7 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload )
236
172
int type ;
237
173
#endif
238
174
239
- DEBUGSTR ( 1 , "%S (%u)" , app , ppi -> dwProcessId );
175
+ DEBUGSTR ( 1 , "Parent = %S (%u)" , app , ppi -> dwProcessId );
240
176
241
177
// Find the base address of kernel32.dll.
242
178
ticks = GetTickCount ();
@@ -266,29 +202,35 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload )
266
202
return ;
267
203
}
268
204
proc = param = NULL ;
269
- len = (DWORD )(prog - prog_path );
270
- memcpy ( DllName , prog_path , TSIZE (len ) );
271
205
#ifdef _WIN64
272
- type = (IsWow64Process ( ppi -> hProcess , & WOW64 ) && WOW64 ) ? 32 : 64 ;
273
- _snwprintf ( DllName + len , MAX_PATH - 1 - len , L"ANSI%d.dll" , type );
206
+ type = 64 ;
207
+ if (IsWow64Process ( ppi -> hProcess , & WOW64 ) && WOW64 )
208
+ {
209
+ type = 32 ;
210
+ * (PDWORD )DllNameType = 0x320033 /*L'23'*/ ;
211
+ }
274
212
#endif
275
213
me .dwSize = sizeof (MODULEENTRY32 );
276
214
for (fOk = Module32First ( hSnap , & me ); fOk ; fOk = Module32Next ( hSnap , & me ))
277
215
{
278
216
if (_wcsicmp ( me .szModule , L"kernel32.dll" ) == 0 )
279
217
{
280
218
proc = me .modBaseAddr ;
281
- if (!unload )
219
+ if (!unload || param )
282
220
break ;
283
221
}
284
222
else if (unload )
285
223
{
286
224
#ifdef _WIN64
287
- if (_wcsicmp ( me .szModule , DllName + len ) == 0 )
225
+ if (_wcsicmp ( me .szModule , DllNameType - 4 ) == 0 )
288
226
#else
289
227
if (_wcsicmp ( me .szModule , L"ANSI32.dll" ) == 0 )
290
228
#endif
229
+ {
291
230
param = me .modBaseAddr ;
231
+ if (proc )
232
+ break ;
233
+ }
292
234
}
293
235
}
294
236
CloseHandle ( hSnap );
@@ -307,7 +249,6 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload )
307
249
rva = GetProcRVA ( L"kernel32.dll" , (unload ) ? "FreeLibrary"
308
250
: "LoadLibraryW" , type );
309
251
#else
310
- wcscpy ( DllName + len , L"ANSI32.dll" );
311
252
rva = GetProcRVA ( L"kernel32.dll" , unload ? "FreeLibrary" : "LoadLibraryW" );
312
253
#endif
313
254
if (rva == 0 )
@@ -316,13 +257,14 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload )
316
257
317
258
if (!unload )
318
259
{
260
+ DWORD len = TSIZE ((DWORD )wcslen ( DllName ) + 1 );
319
261
param = VirtualAllocEx (ppi -> hProcess , NULL , len , MEM_COMMIT ,PAGE_READWRITE );
320
262
if (param == NULL )
321
263
{
322
264
DEBUGSTR (1 , " Failed to allocate virtual memory (%u)" , GetLastError ());
323
265
goto no_go ;
324
266
}
325
- WriteProcMem ( param , DllName , TSIZE ( len + 11 ) );
267
+ WriteProcMem ( param , DllName , len );
326
268
}
327
269
thread = CreateRemoteThread ( ppi -> hProcess , NULL , 4096 ,
328
270
(LPTHREAD_START_ROUTINE )proc , param , 0 , NULL );
@@ -346,7 +288,6 @@ int main( void )
346
288
LPTSTR argv , arg , cmd ;
347
289
TCHAR buf [4 ];
348
290
BOOL shell , run , gui ;
349
- HMODULE ansi ;
350
291
DWORD len ;
351
292
int rc = 0 ;
352
293
@@ -361,7 +302,9 @@ int main( void )
361
302
_setmode ( 2 , _O_U16TEXT );
362
303
363
304
// Create a console handle and store the current attributes.
364
- get_original_attr ();
305
+ hConOut = CreateFile ( L"CONOUT$" , GENERIC_READ | GENERIC_WRITE ,
306
+ FILE_SHARE_READ | FILE_SHARE_WRITE ,
307
+ NULL , OPEN_EXISTING , 0 , 0 );
365
308
366
309
argv = GetCommandLine ();
367
310
len = (DWORD )wcslen ( argv ) + 1 ;
@@ -386,9 +329,6 @@ int main( void )
386
329
}
387
330
}
388
331
389
- hHeap = HeapCreate ( 0 , 0 , 65 * 1024 );
390
-
391
- prog = get_program_name ( NULL );
392
332
* buf = '\0' ;
393
333
GetEnvironmentVariable ( L"ANSICON_LOG" , buf , lenof (buf ) );
394
334
log_level = _wtoi ( buf );
@@ -405,7 +345,12 @@ int main( void )
405
345
}
406
346
else
407
347
{
408
- Inject ( & pi , & gui , NULL );
348
+ PBYTE base ;
349
+ DEBUGSTR ( 1 , "64-bit process (%u) started by 32-bit" , pi .dwProcessId );
350
+ if (ProcessType ( & pi , & base , NULL ) == 48 )
351
+ RemoteLoad64 ( & pi );
352
+ else
353
+ InjectDLL ( & pi , base );
409
354
CloseHandle ( pi .hProcess );
410
355
}
411
356
return 0 ;
@@ -456,20 +401,8 @@ int main( void )
456
401
}
457
402
458
403
case 'm' :
459
- {
460
- int a = wcstol ( arg + 2 , NULL , 16 );
461
- if (a == 0 )
462
- a = (arg [2 ] == '-' ) ? -7 : 7 ;
463
- if (a < 0 )
464
- {
465
- SetEnvironmentVariable ( L"ANSICON_REVERSE" , L"1" );
466
- a = - a ;
467
- a = ((a >> 4 ) & 15 ) | ((a & 15 ) << 4 );
468
- }
469
- SetConsoleTextAttribute ( hConOut , (WORD )a );
470
- SetEnvironmentVariable ( L"ANSICON_DEF" , NULL );
404
+ SetEnvironmentVariable ( L"ANSICON_DEF" , arg [2 ] ? arg + 2 : L"7" );
471
405
break ;
472
- }
473
406
474
407
case 'e' :
475
408
case 'E' :
@@ -494,13 +427,7 @@ int main( void )
494
427
}
495
428
496
429
// Ensure the default attributes are the current attributes.
497
- if (GetEnvironmentVariable ( L"ANSICON_DEF" , buf , lenof (buf ) ) != 0 )
498
- {
499
- int a = wcstol ( buf , NULL , 16 );
500
- if (a < 0 )
501
- a = ((- a >> 4 ) & 15 ) | ((- a & 15 ) << 4 );
502
- SetConsoleTextAttribute ( hConOut , (WORD )a );
503
- }
430
+ WriteConsole ( hConOut , L"\33[m" , 3 , & len , NULL );
504
431
505
432
if (run )
506
433
{
@@ -518,11 +445,9 @@ int main( void )
518
445
519
446
ZeroMemory ( & si , sizeof (si ) );
520
447
si .cb = sizeof (si );
521
- if (CreateProcess ( NULL , cmd , NULL , NULL , TRUE, CREATE_SUSPENDED ,
522
- NULL , NULL , & si , & pi ))
448
+ if (CreateProcess ( NULL , cmd , NULL , NULL , TRUE, 0 , NULL , NULL , & si , & pi ))
523
449
{
524
- Inject ( & pi , & gui , arg );
525
- ResumeThread ( pi .hThread );
450
+ ProcessType ( & pi , NULL , & gui );
526
451
if (!gui )
527
452
{
528
453
SetConsoleCtrlHandler ( (PHANDLER_ROUTINE )CtrlHandler , TRUE );
@@ -540,13 +465,7 @@ int main( void )
540
465
}
541
466
else if (* arg )
542
467
{
543
- ansi = LoadLibrary ( ANSIDLL );
544
- if (ansi == NULL )
545
- {
546
- print_error ( ANSIDLL );
547
- rc = 1 ;
548
- }
549
- else if (* arg == 'e' || * arg == 'E' )
468
+ if (* arg == 'e' || * arg == 'E' )
550
469
{
551
470
cmd += 2 ;
552
471
if (* cmd == ' ' || * cmd == '\t' )
@@ -574,11 +493,8 @@ int main( void )
574
493
get_file ( arg , & argv , & cmd );
575
494
} while (* arg );
576
495
}
577
- FreeLibrary ( ansi );
578
496
}
579
497
580
- set_original_attr ();
581
-
582
498
return rc ;
583
499
}
584
500
0 commit comments