Форум: "WinAPI";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизКак поменять несколько байт в чужом приложении? Найти похожие ветки
← →
Destroyer © (2004-10-07 22:21) [0]Нужно поменять несколько байт в адресном пространстве чужой проги. Использую ф-ю writeprocessmemory (есть еще какие-нибудь варианты?) этой ф-ии нужен хэндл, хочу получить с помощью openprocess ей нужен PID процесса, как его можно получить? Пробую использовать ф-ию enumprocesses из модуля psapi, но не понимаю как правильно надо её вызвать и что она вернет? Если использовать эту функцию, то её, по-видимому, надо вызывать в цикле, перечисляя PID-ы. Может надо использовать какую-нибудь другую функцию?
← →
XProger © (2004-10-08 01:48) [1]
hWnd := FindWindow(nil, WindowTitle);
ThreadId := GetWindowThreadProcessId(hWnd, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
WriteProcessMemory(HandleWindow, p, buf, sizeOf(Buf), written);
CloseHandle(HandleWindow);
← →
Digitman © (2004-10-08 08:08) [2]
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;
← →
Destroyer © (2004-10-08 23:50) [3]Здорово, буду пробовать!
← →
Destroyer © (2004-10-10 21:54) [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? И как разрешить запись по этому адресу (в этом участке памяти)?
← →
8ung (2004-10-10 23:20) [5]В 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.
← →
8ung (2004-10-10 23:26) [6]Мастера 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:27) [7]Мастера 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;
Я это сразу же нашел в поиске по сайту...:(
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c