![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поменять несколько байт в чужом приложении? [D6, WinXP]
Destroyer © (2004-10-07 22:21:00)Нужно поменять несколько байт в адресном пространстве чужой проги. Использую ф-ю writeprocessmemory (есть еще какие-нибудь варианты?) этой ф-ии нужен хэндл, хочу получить с помощью openprocess ей нужен PID процесса, как его можно получить? Пробую использовать ф-ию enumprocesses из модуля psapi, но не понимаю как правильно надо её вызвать и что она вернет? Если использовать эту функцию, то её, по-видимому, надо вызывать в цикле, перечисляя PID-ы. Может надо использовать какую-нибудь другую функцию?
8ung (2004-10-10 23:27:00) [1]Мастера Delphi | FAQ
Как получить строку сообщения об ошибке Windows код которой получен функцией GetLastError?
Функция RTL SysErrorMessage(GetLastError).
Пример:
procedure TForm1.Button1Click(Sender: TObject);begin {Cause a Windows system error message to be logged}
ShowMessage(IntToStr(lStrLen(nil)));
ShowMessage(SysErrorMessage(GetLastError));
end;
Я это сразу же нашел в поиске по сайту...:(
8ung (2004-10-10 23:26:00) [2]Мастера Delphi | FAQ
Как получить строку сообщения об ошибке Windows код которой получен функцией GetLastError?
Функция RTL SysErrorMessage(GetLastError).
Пример:
procedure TForm1.Button1Click(Sender: TObject);begin {Cause a Windows system error message to be logged} ShowMessage(IntToStr(lStrLen(nil))); ShowMessage(SysErrorMessage(GetLastError));
end;
Я это сразу же нашел в поиске по сайту...:(
8ung (2004-10-10 23:20:00) [3]В adr^ нужно писать адрес с учетом ImageBase.
Причем в шестнадцатеричной форме, т.е в примере долже стоять адрес = $417674(нули-то зачем писать перед числом?).
Если прога запакована чем-нить типа Upx, AsPack и т.п., то проверяй данный адрес чтением ReadProcessMemory, пока прога не распаковалась там всегда будет 00h. Когда распакуется - смело пиши. В примере КУЧА ошибок!
Правильно сделать нужно примерно так:
var
hnd:hwnd;
processfilename:string;
procid:dword;
windowtitle:PChar;
ThreadId:integer;
HandleProc:tprocessinformation;
adr:integer;
buf:^integer;
written:cardinal;
err:integer;
begin
new(buf);
buf^:=$9090;
adr:=$403CEA;
processfilename:='Example.exe'; // имя ФАЙЛА процесса
procid:=FindProcess(processfilename); // ID получим процесса
HandleProc.hProcess:=OpenProcess(PROCESS_ALL_ACCESS,True,procid); // получим хэндл процесса
suspendthread(HandleProc.hThread);//приостанови процесс
writeprocessmemory(HandleProc.hProcess,Pointer(adr),@buf^, 2,written);//пишем
resumethread(HandleProc.hThread);//запускаем процесс дальше
CloseHandle(HandleProc.hProcess);
FreeMemory(buf);
end.
Destroyer (2004-10-10 21:54:00) [4]Делаю так:
var
hnd:hwnd;
processname:string;
procid:dword;
windowtitle:PChar;
ThreadId:integer;
HandleWindow:cardinal;
adr:^integer;
buf:^integer;
written:cardinal;
err:integer;
begin
new(adr);
new(buf);
buf^:=31;
adr^:=00417674;
processname:=edit1.Text; // имя процесса
windowtitle:=PChar(edit2.text); // заголовок окна
procid:=FindProcess(processname); // ID получим процесса
hnd := FindWindow(nil, WindowTitle); // получим хэндл окна
ThreadId:=GetWindowThreadProcessId(hnd,@ProcId); // получим ID потока
HandleWindow:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcId); // получим хэндл процесса
WriteProcessMemory(HandleWindow, adr, buf, sizeOf(Buf),written ) ; // пишем в память
CloseHandle(HandleWindow);
end;
Вопросы: Какой адрес надо писать в adr^, с учетом ImageBase или нет?
WriteprocessMemory возвращает всегда false - т.е. не выполняется. Я думаю что это из за того, что записываемый адрес либо не найден, либо недоступен. Как правильно использовать ф-ю GetLastError? И как разрешить запись по этому адресу (в этом участке памяти)?
Destroyer (2004-10-08 23:50:00) [5]Здорово, буду пробовать!
Digitman (2004-10-08 08:08:00) [6]
type
TUnicodeString = packed record
Length, MaximumLength: Word;
Buffer: PWideChar;
end;
PSystemProcessInformation = ^TSystemProcessInformation;
TSystemProcessInformation = packed record
dNext: DWord;
dThreadCount: DWord;
dReserved01, dReserved02, dReserved03, dReserved04, dReserved05, dReserved06: DWord;
qCreateTime, qUserTime, qKernelTime: Int64;
usName: TUnicodeString;
BasePriority: DWord;
dUniqueProcessId: DWord;
dInheritedFromUniqueProcessId: DWord;
dHandleCount: DWord;
dReserved07: DWord;
dReserved08: DWord;
VmCounters: array[0..10] of DWord;
dCommitCharge: DWord;
end;
function NtQuerySystemInformation(sic: DWord; Buffer: Pointer; BufSize: DWord; var BytesReturned: DWord): DWord; stdcall; external 'ntdll.dll';
//ф-ция возвращает PID первого же обнаруженного процесса с именем ProcessName
function FindProcess(ProcessName: String): DWord;
var
p, Buf: PSystemProcessInformation;
BufSize: DWord;
TableSize: DWord;
begin
Result := 0;
BufSize := $10000;
GetMem(Buf, BufSize);
while NtQuerySystemInformation(5, Buf, BufSize, TableSize) <> 0 do
begin
Inc(BufSize, $10000);
ReallocMem(Buf, BufSize);
end;
p := Buf;
while True do
begin
if CompareText(Buf.usName.Buffer, ProcessName) = 0 then
begin
Result := Buf.dUniqueProcessId;
break;
end;
if Buf.dNext = 0 then Break;
Inc(Integer(Buf), Buf.dNext);
end;
FreeMem(p);
end;
XProger (2004-10-08 01:48:00) [7]
hWnd := FindWindow(nil, WindowTitle);
ThreadId := GetWindowThreadProcessId(hWnd, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
WriteProcessMemory(HandleWindow, p, buf, sizeOf(Buf), written);
CloseHandle(HandleWindow);