1 (изменено: Poltergeyst, 2018-06-03 23:21:28)

Тема: JScript: Инъекция в процесс

Без гарантий! Используете на свой страх и риск.

Пример инъекции - выполнение функции ExitProcess в адресном пространстве другого процесса с помощью CreateRemoteThread.

Потребуется зарегистрированная библиотека scrsvc.dll
ОС WinXP/7


/*
 Пример инъекции в другой процесс, выполнение функции 
 ExitProcess в адресном пространстве другого процесса с 
 помощью CreateRemoteThread.

 ----------------------------------------------------------------
 Потребуется зарегистрированная библиотека scrsvc.dll
 http://forum.script-coding.com/viewtopic.php?id=8082

 ОС WinXP/7
*/
 
 var oScrSvc = new ActiveXObject('ScriptService.Service');
 
 //Изменяемый параметр - полный путь к запускаемому приложению.
 /*---------------------------------------------------------------*/
 sApp = 'calc'
 
 
 /*---------------------------------------------------------------*/
 PROCESS_TERMINATE = 1
 PROCESS_CREATE_THREAD = 2
 PROCESS_SET_SESSIONID  = 4
 PROCESS_VM_OPERATION  = 8;
 PROCESS_VM_READ = 0x10;
 PROCESS_VM_WRITE = 0x20;
 PROCESS_DUP_HANDLE = 0x40;
 PROCESS_CREATE_PROCESS = 0x80;
 PROCESS_QUERY_INFORMATION = 0x400;

 PAGE_NOACCESS = 1;
 PAGE_READONLY = 2;
 PAGE_READWRITE = 4;
 PAGE_WRITECOPY = 8;
 PAGE_EXECUTE = 0x10;
 PAGE_EXECUTE_READ = 0x20;
 PAGE_EXECUTE_READWRITE = 0x40;
 PAGE_EXECUTE_WRITECOPY= 0x80;
 PAGE_GUARD = 0x100;
 PAGE_NOCACHE = 0x200;

 MEM_COMMIT = 0x1000;
 MEM_RESERVE = 0x2000;
 MEM_DECOMMIT = 0x4000;
 MEM_RELEASE = 0x8000;
 MEM_FREE = 0x10000;
 MEM_PRIVATE = 0x20000;
 MEM_MAPPED = 0x40000;
 MEM_RESET = 0x80000;
 MEM_TOP_DOWN = 0x100000;

 NORMAL_PRIORITY_CLASS = 0x00000020;

 // Запуск процесса
 /*---------------------------------------------------------------*/
 var oWShell = new ActiveXObject('WScript.Shell');
 try
 {
	var oWExec = oWShell.Exec(sApp);
	WScript.Sleep(200);
 }
 catch(e)
 {
	oWShell.PopUp('Произошла ошибка: '+e.description, -1, 'Запуск процесса', 48);
	oWShell = null;
	oScrSvc = null;
	WScript.Quit()
 }
 var PID = oWExec.ProcessID;
 //oWShell.AppActivate(PID);
 WScript.Sleep(200);

 // Выполнение удаленной функции в адресном пространстве процесса
 /*---------------------------------------------------------------*/
 with (oScrSvc)
 {
	
	// Открытие процесса
	/*--------------------------------------------------------*/
	set_vararg(0, PROCESS_CREATE_THREAD + PROCESS_VM_OPERATION + PROCESS_VM_WRITE);
	set_vararg(1, true);
	set_vararg(2, PID);
	hOpen = api_call('KERNEL32.DLL','OpenProcess',3);
 
	// Выделение памяти в адресном пространстве созданного процесса
	set_vararg(0, hOpen);
	set_vararg(1, 0);
	set_vararg(2, 4);
	set_vararg(3, MEM_RESERVE + MEM_COMMIT);
	set_vararg(4, PAGE_EXECUTE_READWRITE);
	hMem = api_call('KERNEL32.DLL','VirtualAllocEx',5);

	// Запись аргумента удаленно вызываемой функции в выделенную память
	sStr = '____'
	vPtr = struct_setval(sStr)
	struct_setval(vPtr, 0, 0, 4); 

	set_vararg(0, hOpen);
	set_vararg(1, hMem);
	set_vararg(2, vPtr);
	set_vararg(3, 4);
	set_vararg(4, 0);
	hRes = api_call('KERNEL32.DLL','WriteProcessMemory',5);

	// Получение адреса удаленно вызываемой функции
	// (это ExitProcess, расположенная в KERNEL32.DLL)
	/*--------------------------------------------------------*/
	set_strarg(0, 'KERNEL32.DLL', true);
	hModule = api_call('KERNEL32.DLL','GetModuleHandleW',1);

	set_vararg(0, hModule);
	set_strarg(1, 'ExitProcess', false);	
	hAPIProc = api_call('KERNEL32.DLL','GetProcAddress',2);


	// Выполнение функции ExitProcess в памяти другого процесса
	/*--------------------------------------------------------*/
	oWShell.PopUp('Выполнение ExitProcess в памяти другого процесса...', 5, 'ExitProcess', 64);

	set_vararg(0, hOpen);
	set_vararg(1, 0);
	set_vararg(2, 0);
	set_vararg(3, hAPIProc);
	set_vararg(4, hMem);
	set_vararg(5, 0);
	set_vararg(6, 0);
	hRemoteThread = api_call('KERNEL32.DLL','CreateRemoteThread',7);

	oWShell.PopUp('Завершено...', 5, 'ExitProcess', 64);
	oWShell = null;
	oScrSvc = null;
	WScript.Quit();
	
 }

2 (изменено: Poltergeyst, 2016-01-30 01:00:42)

Re: JScript: Инъекция в процесс

Без гарантий! Используете на свой страх и риск.

Пример добавления пользовательского меню во внешнее оконное приложение, в данном случае это "Блокнот". Меню позволяет запускать файлы скриптов VBScript и JScript прямо из "Блокнота".

Для версии "Блокнота" 5.1.2600.5512 WinXP: http://img.ii4.ru/images/2014/11/03/544930_notinj.jpg

Сценарий создает внешний процесс notepad.exe, загружает библиотеку-инжектор inject.dll, расположенную рядом со скриптом, в адресное пространство этого процесса, передает в библиотеку необходимые параметры, после чего библиотека добавляет в главное меню "Блокнота" новый пункт меню "Запуск сценария WSH", который содержит подпункты "Запуск WScript"(запуск сценария с помощью WScript) и "Запуск СScript"(запуск сценария с помощью СScript, соответственно).

Потребуется зарегистрированная библиотека scrsvc.dll

Если что-то срабатывает не так, приложение валится, следует обратить внимание на изменяемые параметры в скрипте:


// Изменяемые параметры
// ------------------------------------------------------------- 
// ------------------------------------------------------------- 
 var sApp = 'C:\\WINDOWS\\system32\\notepad.exe';        // Полный путь к приложению "Блокнот"
 var sScriptHost1 = 'C:\\WINDOWS\\system32\\WScript.exe';    // Полный путь к интерпретатору WScript.exe
 var sScriptHost2 = 'C:\\WINDOWS\\system32\\CScript.exe';    // Полный путь к интерпретатору CScript.exe
 var lAddress = 0x0100A900;                    // Статический указатель на строку-путь к текущему открытому файлу в адресном пространстве "Блокнота"

Статический указатель на строку-путь к текущему открытому файлу в адресном пространстве "Блокнота", можно получить в отладчике, открыв процесс "Блокнота" и найдя "вставку" примерно следующего вида:


0100278C  |. BF 00A90001    MOV EDI,NOTEPAD.0100A900                 ;  UNICODE "C:\ScriptProjects\windows.txt"

Соответственно 0100A900 - это и есть искомый указатель на путь к текущему открытому файлу в процессе "Блокнот"(Для версии 5.1.2600.5512 WinXP)

Чтобы открыть JS или VBS скрипт, следует перетащить значок этого скрипта на значок inject.js. Чтобы добавить пункт открытия JS и VBS файлов сриптом-блокнот-инжектором в контекстное меню проводника, можно использовать, например, такие cmd сценарии:


:: Добавление пункта "Open Notepad" для js и vbs файлов в контекстное меню проводника, 
:: что позволяет открывать файлы соответствующих скриптов в "Блокноте" с добавленым 
:: пользовательским меню их запуска.

reg add "HKCR\VBSFile\Shell\Open3" /v "" /t REG_SZ /d "Open Notepad" /f
reg add "HKCR\VBSFile\Shell\Open3\Command" /v "" /t REG_EXPAND_SZ /d "%%SystemRoot%%\System32\WScript.exe %CD%\inject.js %%1 %%*" /f


reg add "HKCR\JSFile\Shell\Open3" /v "" /t REG_SZ /d "Open Notepad" /f
reg add "HKCR\JSFile\Shell\Open3\Command" /v "" /t REG_EXPAND_SZ /d "%%SystemRoot%%\System32\WScript.exe %CD%\inject.js %%1 %%*" /f

Чтобы избавиться от пункта меню:


:: Удаление пункта "Open Notepad" для js и vbs файлов из контекстного меню проводника. 

reg delete "HKCR\VBSFile\Shell\Open3" /f
reg delete "HKCR\JSFile\Shell\Open3" /f
Post's attachments

notepad_inj.zip 7.41 kb, 9 downloads since 2016-01-30 

You don't have the permssions to download the attachments of this post.