Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Как поменять несколько байт в чужом приложении?   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
14-1099743026
BoS | Snake
2004-11-06 15:10
2004.11.21
Народ , неед хелп , кто в Lisp шарит...


14-1098887209
Григорьев Антон
2004-10-27 18:26
2004.11.21
А в какой именно книге Архангельского написано...


1-1099910426
Змей
2004-11-08 13:40
2004.11.21
Манифест


4-1097340955
Sergeika
2004-10-09 20:55
2004.11.21
Изменение яркости монитора


1-1099435489
Garfunkel
2004-11-03 01:44
2004.11.21
Замена шрифтов