Sun07 В DOS - очень просто. В WIN ВСЮ без драйвера наверно никак. Думаю у тебя более простая задача, найти строку в неком приложении?
ну прога стартует из определённой папки. Мне надо изменить этот путь в памяти, чтобы показывала система, что прога стартанула из другой папки, а не из той, что на самом деле.
PEB.ProcessParameters.CurrentDirectory PEB.ProcessParameters.ImagePathName PEB.ProcessParameters.CommandLine
И что? Я так понимаю, тебе процесс скрывать и не нужно. Изменения в PEB.ProcessParameters приводят к изменениям в параметрах запуска, в чем можно убедиться посмотрев в process explorer до и после изменения.
не понимаю, отколь столь много Syntax Error? Код (Text): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\psapi.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Psapi.lib includelib \masm32\lib\user32.lib PTOZWQUERYINFORMATIONPROCESS TYPEDEF PROTO :DWORD, : DWORD, : DWORD, : DWORD, : DWORD PZWQUERYINFORMATIONPROCESS TYPEDEF PTR PTOZWQUERYINFORMATIONPROCESS .data? buff db 2000 dup(?) buffout db 15 dup(?) .data Prog_name db "a.exe", 0 str1 db "%d",0 error db "E",0 FormatStr db "%d",0 _PROCESSENTRY32 struct dwSize DWORD 0 cntUsage DWORD 0 th32ProcessID DWORD 0 th32DefaultHeapID DWORD 0 th32ModuleID DWORD 0 cntThreads DWORD 0 th32ParentProcessID DWORD 0 pcPriClassBase DWORD 0 dwFlags DWORD 0 szExeFile BYTE 260 dup (?) _PROCESSENTRY32 ends _PROCESS_BASIC_INFORMATION struct ExitStatus DWORD 0 PebBaseAddress DWORD 0 AffinityMask DWORD 0 BasePriority DWORD 0 UniqueProcessId DWORD 0 InheritedFromUniqueProcessId DWORD 0 _PROCESS_BASIC_INFORMATION ends _PEB struct InheritedAddressSpace DWORD 0 ReadImageFileExecOptions DWORD 0 BeingDebugged DWORD 0 SpareBool DWORD 0 Mutant DWORD 0 ImageBaseAddress DWORD 0 Ldr DWORD 0 ProcessParameters DWORD 0 SubSystemData DWORD 0 ProcessHeap DWORD 0 FastPebLock DWORD 0 AltThunkSListPtr DWORD 0 IFEOKey DWORD 0 Spare DWORD 0 _PEB ends _UNICODE_STRING struct sLength WORD 0 MaximumLength WORD 0 Buffer DWORD 0 _UNICODE_STRING ends _RTL_DRIVE_LETTER_CURDIR STRUCT Flags WORD 0 Length1 WORD 0 TimeStamp DWORD 0 DosPath UNICODE_STRING <> _RTL_DRIVE_LETTER_CURDIR ends _RTL_USER_PROCESS_PARAMETERS STRUCT MaximumLength DWORD ? length1 DWORD ? Flags DWORD ? DebugFlags DWORD ? ConsoleHandle DWORD ? ConsoleFlags DWORD ? StdInputHandle DWORD ? StdOutputHandle DWORD ? StdErrorHandle DWORD ? CurrentDirectoryPath UNICODE_STRING <> CurrentDirectoryHandle DWORD ? DllPath UNICODE_STRING <> ImagePathName UNICODE_STRING <> CommandLine UNICODE_STRING <> Environment DWORD ? StartingPositionLeft DWORD ? StartingPositionTop DWORD ? CountX DWORD 0 CountY DWORD 0 CountCharsX DWORD 0 CountCharsY DWORD 0 ConsoleTextAttributes DWORD ? WindowFlags DWORD ? ShowWindowFlags DWORD ? WindowTitle UNICODE_STRING <> DesktopName UNICODE_STRING <> ShellInfo UNICODE_STRING <> RuntimeData UNICODE_STRING <> DLCurrentDirectory RTL_DRIVE_LETTER_CURDIR 020h dup (?) _RTL_USER_PROCESS_PARAMETERS ENDS uProcess _PROCESSENTRY32 <?> pbi _PROCESS_BASIC_INFORMATION <?> pPeb _PEB <?> uStr _UNICODE_STRING <?> RtlUserProcParams _RTL_USER_PROCESS_PARAMETERS <?> ZwQueryInformationProcess PZWQUERYINFORMATIONPROCESS ? sTitle db "Message", 0 hSnapShot dd 0 BytesCount dd 0 hOpenProcess dd 0 wszBuffer db 260 dup (?) hModule dd ? szNtdll db "ntdll",0 szFuncName db "ZwQueryInformationProcess",0 .code start: invoke CreateToolhelp32Snapshot, 2h, 0 mov hSnapShot, eax mov uProcess.dwSize, sizeof PROCESSENTRY32 invoke Process32First, hSnapShot, addr uProcess invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name jz ok next1: invoke Process32Next, hSnapShot, addr uProcess invoke lstrcmpi, addr uProcess.szExeFile, addr Prog_name jnz next1 ok: invoke GetModuleHandle,offset szNtdll mov hModule,eax invoke GetProcAddress,eax,offset szFuncName mov ZwQueryInformationProcess,eax ;invoke MessageBox, NULL, addr uProcess.szExeFile, addr sTitle, MB_OK invoke OpenProcess, PROCESS_QUERY_INFORMATION, FALSE, uProcess.th32ProcessID mov hOpenProcess, eax ;call outn ;jmp endPrg invoke ZwQueryInformationProcess, hOpenProcess, 0, offset pbi, sizeof _PROCESS_BASIC_INFORMATION, 0 invoke ReadProcessMemory, hOpenProcess, pbi.PebBaseAddress, offset pPeb, sizeof _PEB, addr BytesCount invoke ReadProcessMemory, hOpenProcess, pPeb.ProcessParameters, offset RtlUserProcParams, sizeof _RTL_USER_PROCESS_PARAMETERS, BytesCount invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.ImagePathName, offset uStr, sizeof _UNICODE_STRING, BytesCount call outn invoke MessageBox, NULL, addr RtlUserProcParams.ImagePathName, addr sTitle, MB_OK ;invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.ImagePathName, offset wszBuffer, sizeof wszBuffer, BytesCount ;call outn ;invoke MessageBox, NULL, addr wszBuffer, addr sTitle, MB_OK ;invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.CurrentDirectoryPath, offset uStr, sizeof _UNICODE_STRING, BytesCount ;invoke MessageBox, NULL, addr RtlUserProcParams.CurrentDirectoryPath, addr sTitle, MB_OK ;WriteProcessMemory invoke CloseHandle, hOpenProcess invoke CloseHandle, hSnapShot endPrg: invoke ExitProcess, NULL outn proc ;вывод числа EAX на экран invoke wsprintf,offset buffout,offset FormatStr, eax invoke MessageBox,0,offset buffout,offset error,0 ret outn endp end start
а, понял - UNICODE_STRING на _UNICODE_STRING. А на кой впереди имени подчёркивание? И как определить массив на DLCurrentDirectory?
да я уже всё исправил. Но не читает тут Код (Text): invoke ReadProcessMemory, hOpenProcess, RtlUserProcParams.ImagePathName.Buffer, offset wszBuffer, sizeof wszBuffer, BytesCount invoke MessageBox, NULL, addr wszBuffer, addr sTitle, MB_OK вроде все параметры переданы верно.
сделал. Оказыватся, тот код, что я нашёл тут вовсе неверный. Получил: PEB.ProcessParameters.CurrentDirectory=C:\Temp\ PEB.ProcessParameters.ImagePathName=C:\Temp\Process.exe "C:\Temp\Process.exe" C:\Temp\Process.exe WinSta0\Default PEB.ProcessParameters.CommandLine="C:\Temp\Process.exe" C:\Temp\Process.exe WinSta0\Default Так много путей! Что их так много? Все менять, что-ли?
заменил всё. Ничего не работает. Только время зря убил. Просмотрщики процессов берут путь 1 раз на момент запуска проги и он верный... А то кто бы разрешил запись в ту область
Разумеется кейс был на случай, если тулза для просмотра процессов еще не была запущена. Если эта тулза уже запущена и сохранила параметры в свои внутренние переменные, то задача в общем случае не решаема.
а если поставить хук на CreateProcess? Так ведь просмотрщики процессов, антивиры ловят процессы? Удастся ли перехватить и записать данные первыми?
или запись в память другого процесса невозможна? Т.е. посторонний процесс отлавливает запуск моей проги и меняет ей путь.