Add option -pu to unload from the parent
				
					
				
			This commit is contained in:
		
							parent
							
								
									523c478d67
								
							
						
					
					
						commit
						1a4d6b488f
					
				
							
								
								
									
										9
									
								
								ANSI.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								ANSI.c
									
									
									
									
									
								
							| @ -1928,8 +1928,13 @@ BOOL HookAPIAllMod( PHookFn Hooks, BOOL restore, BOOL indent ) | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if (*(PDWORD)((PBYTE)me.hModule + 36) != 'ISNA' && | ||||
| 	  *(PDWORD)((PBYTE)me.hModule + 0x3C) >= 0x40) | ||||
|       if (*(PDWORD)((PBYTE)me.hModule + 36) == 'ISNA') | ||||
|       { | ||||
| 	VirtualProtect( (PBYTE)me.hModule + 36, 4, PAGE_READWRITE, &pr ); | ||||
| 	*((PBYTE)me.hModule + 36+3) = 'U'; | ||||
| 	VirtualProtect( (PBYTE)me.hModule + 36, 4, pr, &pr ); | ||||
|       } | ||||
|       else if (*(PDWORD)((PBYTE)me.hModule + 0x3C) >= 0x40) | ||||
|       { | ||||
| 	if (log_level & 16) | ||||
| 	  DEBUGSTR( 2, "%s%s %S", sp, zSkipping, me.szModule ); | ||||
|  | ||||
							
								
								
									
										105
									
								
								ansicon.c
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								ansicon.c
									
									
									
									
									
								
							| @ -86,8 +86,9 @@ | ||||
|     log: 64-bit addresses get an underscore between the 8-digit groups; | ||||
| 	 add error codes to some message. | ||||
| 
 | ||||
|   v1.80, 28 October, 2017: | ||||
|     write newline with _putws, not putwchar (fixes redirecting to CON). | ||||
|   v1.80, 28 October & 30 November, 2017: | ||||
|     write newline with _putws, not putwchar (fixes redirecting to CON); | ||||
|     use -pu to unload from the parent. | ||||
| */ | ||||
| 
 | ||||
| #define PDATE L"30 November, 2017" | ||||
| @ -217,15 +218,16 @@ BOOL Inject( LPPROCESS_INFORMATION ppi, BOOL* gui, LPCTSTR app ) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Use CreateRemoteThread to load our DLL in the target process.
 | ||||
| void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app ) | ||||
| // Use CreateRemoteThread to (un)load our DLL in the target process.
 | ||||
| void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app, BOOL unload ) | ||||
| { | ||||
|   HANDLE hSnap; | ||||
|   MODULEENTRY32 me; | ||||
|   PBYTE  LLW; | ||||
|   PBYTE  proc; | ||||
|   DWORD  rva; | ||||
|   BOOL	 fOk; | ||||
|   DWORD  len; | ||||
|   LPVOID mem; | ||||
|   LPVOID param; | ||||
|   HANDLE thread; | ||||
|   DWORD  ticks; | ||||
| #ifdef _WIN64 | ||||
| @ -262,48 +264,71 @@ void RemoteLoad( LPPROCESS_INFORMATION ppi, LPCTSTR app ) | ||||
|     fputws( L"ANSICON: unable to inject into parent.\n", stderr ); | ||||
|     return; | ||||
|   } | ||||
|   LLW = NULL; | ||||
|   me.dwSize = sizeof(MODULEENTRY32); | ||||
|   for (fOk = Module32First( hSnap, &me ); fOk; fOk = Module32Next( hSnap, &me )) | ||||
|   { | ||||
|     if (_wcsicmp( me.szModule, L"kernel32.dll" ) == 0) | ||||
|     { | ||||
|       LLW = me.modBaseAddr; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   CloseHandle( hSnap ); | ||||
|   if (LLW == NULL) | ||||
|   { | ||||
|     DEBUGSTR( 1, "  Unable to locate kernel32.dll" ); | ||||
|     goto no_go; | ||||
|   } | ||||
| 
 | ||||
|   proc = param = NULL; | ||||
|   len = (DWORD)(prog - prog_path); | ||||
|   memcpy( DllName, prog_path, TSIZE(len) ); | ||||
| #ifdef _WIN64 | ||||
|   type = (IsWow64Process( ppi->hProcess, &WOW64 ) && WOW64) ? 32 : 64; | ||||
|   wsprintf( DllName + len, L"ANSI%d.dll", type ); | ||||
|   LLW += GetProcRVA( L"kernel32.dll", "LoadLibraryW", type ); | ||||
| #else | ||||
|   wcscpy( DllName + len, L"ANSI32.dll" ); | ||||
|   LLW += GetProcRVA( L"kernel32.dll", "LoadLibraryW" ); | ||||
| #endif | ||||
|   if (LLW == me.modBaseAddr) | ||||
|     goto no_go; | ||||
| 
 | ||||
|   mem = VirtualAllocEx( ppi->hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE ); | ||||
|   if (mem == NULL) | ||||
|   me.dwSize = sizeof(MODULEENTRY32); | ||||
|   for (fOk = Module32First( hSnap, &me ); fOk; fOk = Module32Next( hSnap, &me )) | ||||
|   { | ||||
|     DEBUGSTR(1, "  Failed to allocate virtual memory (%u)", GetLastError()); | ||||
|     if (_wcsicmp( me.szModule, L"kernel32.dll" ) == 0) | ||||
|     { | ||||
|       proc = me.modBaseAddr; | ||||
|       if (!unload) | ||||
| 	break; | ||||
|     } | ||||
|     else if (unload) | ||||
|     { | ||||
| #ifdef _WIN64 | ||||
|       if (_wcsicmp( me.szModule, DllName + len ) == 0) | ||||
| #else | ||||
|       if (_wcsicmp( me.szModule, L"ANSI32.dll" ) == 0) | ||||
| #endif | ||||
| 	param = me.modBaseAddr; | ||||
|     } | ||||
|   } | ||||
|   CloseHandle( hSnap ); | ||||
|   if (proc == NULL) | ||||
|   { | ||||
|     DEBUGSTR( 1, "  Unable to locate kernel32.dll" ); | ||||
|     goto no_go; | ||||
|   } | ||||
|   WriteProcMem( mem, DllName, TSIZE(len + 11) ); | ||||
|   if (unload && param == NULL) | ||||
|   { | ||||
|     DEBUGSTR( 1, "  Unable to locate ANSICON's DLL" ); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
| #ifdef _WIN64 | ||||
|   rva = GetProcRVA( L"kernel32.dll", (unload) ? "FreeLibrary" | ||||
| 					      : "LoadLibraryW", type ); | ||||
| #else | ||||
|   wcscpy( DllName + len, L"ANSI32.dll" ); | ||||
|   rva = GetProcRVA( L"kernel32.dll", unload ? "FreeLibrary" : "LoadLibraryW" ); | ||||
| #endif | ||||
|   if (rva == 0) | ||||
|     goto no_go; | ||||
|   proc += rva; | ||||
| 
 | ||||
|   if (!unload) | ||||
|   { | ||||
|     param = VirtualAllocEx(ppi->hProcess, NULL, len, MEM_COMMIT,PAGE_READWRITE); | ||||
|     if (param == NULL) | ||||
|     { | ||||
|       DEBUGSTR(1, "  Failed to allocate virtual memory (%u)", GetLastError()); | ||||
|       goto no_go; | ||||
|     } | ||||
|     WriteProcMem( param, DllName, TSIZE(len + 11) ); | ||||
|   } | ||||
|   thread = CreateRemoteThread( ppi->hProcess, NULL, 4096, | ||||
| 			       (LPTHREAD_START_ROUTINE)LLW, mem, 0, NULL ); | ||||
| 			       (LPTHREAD_START_ROUTINE)proc, param, 0, NULL ); | ||||
|   WaitForSingleObject( thread, INFINITE ); | ||||
|   CloseHandle( thread ); | ||||
|   VirtualFreeEx( ppi->hProcess, mem, 0, MEM_RELEASE ); | ||||
|   if (!unload) | ||||
|     VirtualFreeEx( ppi->hProcess, param, 0, MEM_RELEASE ); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -412,11 +437,13 @@ int main( void ) | ||||
| 	// else fall through
 | ||||
| 
 | ||||
|       case 'p': | ||||
|       { | ||||
| 	BOOL unload = (arg[1] == 'p' && arg[2] == 'u'); | ||||
| 	shell = FALSE; | ||||
| 	if (GetParentProcessInfo( &pi, arg )) | ||||
| 	{ | ||||
| 	  pi.hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId); | ||||
| 	  RemoteLoad( &pi, arg ); | ||||
| 	  RemoteLoad( &pi, arg, unload ); | ||||
| 	  CloseHandle( pi.hProcess ); | ||||
| 	} | ||||
| 	else | ||||
| @ -425,6 +452,7 @@ int main( void ) | ||||
| 	  rc = 1; | ||||
| 	} | ||||
| 	break; | ||||
|       } | ||||
| 
 | ||||
|       case 'm': | ||||
|       { | ||||
| @ -918,7 +946,7 @@ L"http://ansicon.adoxa.vze.com/\n" | ||||
| L"\n" | ||||
| L"Process ANSI escape sequences in " WINTYPE L" console programs.\n" | ||||
| L"\n" | ||||
| L"ansicon [-l<level>] [-i] [-I] [-u] [-U] [-m[<attr>]] [-p]\n" | ||||
| L"ansicon [-l<level>] [-i] [-I] [-u] [-U] [-m[<attr>]] [-p[u]]\n" | ||||
| L"        [-e|E string | -t|T [file(s)] | program [args]]\n" | ||||
| L"\n" | ||||
| L"  -l\t\tset the logging level (1=process, 2=module, 3=function,\n" | ||||
| @ -928,6 +956,7 @@ L"  -u\t\tuninstall - remove ANSICON from the AutoRun entry\n" | ||||
| L"  -I -U\t\tuse local machine instead of current user\n" | ||||
| L"  -m\t\tuse grey on black (\"monochrome\") or <attr> as default color\n" | ||||
| L"  -p\t\thook into the parent process\n" | ||||
| L"  -pu\t\tunhook from the parent process\n" | ||||
| L"  -e\t\techo string\n" | ||||
| L"  -E\t\techo string, don't append newline\n" | ||||
| L"  -t\t\tdisplay files (\"-\" for stdin), combined as a single stream\n" | ||||
|  | ||||
| @ -52,6 +52,8 @@ Usage | ||||
| 	-p	Enable the parent process (i.e. the command shell used to run | ||||
| 		ANSICON) to recognise escapes. | ||||
| 
 | ||||
| 	-pu	Unload from the parent process, restoring it. | ||||
| 
 | ||||
| 	-m	Set the current (and default) attribute to grey on black | ||||
| 		("monochrome"), or the attribute following the 'm' (please | ||||
| 		use 'COLOR /?' for attribute values). | ||||
| @ -316,7 +318,8 @@ Version History | ||||
|     + use the system default sound for the bell; | ||||
|     + added Play Sound DECPS; | ||||
|     + added '+' intermediate byte to use the buffer, rather than the window; | ||||
|     + added palette sequences. | ||||
|     + added palette sequences; | ||||
|     + added -pu to unload from the parent. | ||||
| 
 | ||||
|     1.72 - 24 December, 2015: | ||||
|     - handle STD_OUTPUT_HANDLE & STD_ERROR_HANDLE in WriteFile; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jason Hood
						Jason Hood