Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 3 апреля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

АРХИВ ФОРУМА eXeL@B
https://exelab.ru/f/

   

FEUERRADER Поиск байт в памяти процесса Возникла проблема по поиску


FEUERRADER Поиск байт в памяти процесса Возникла проблема по поиску последовательности байт в памяти процесса.
Код на Дельфи:

for i:=$420000 to $445000 do begin
ReadProcessMemory(pi.hprocess,Pointer(i),@olddata, 6,bytesread);
if (olddata[0] = $AD) and
(olddata[1] = $54) and
(olddata[2] = $56) and
(olddata[3] = $35) then
begin
WriteProcessMemory(pi.hProcess, Pointer(i), @newdata[0],1, i1);
END;
end;

Ищется последовательность байт AD545635 в диапазоне [420000; 445000] и если находится, то удачно патчится. Т.е. Всё ОК.
Но поиск очень медленно идет. В указанном диапазоне может занимать до минуты и более.
Может кто-нибудь подскажет другой способ? Только на Дельфи.
MozgC [TSRh] :: Намного увеличь в буфер, считывай все в буфер такими большими кусками и уже ищи в массиве вместо того чтобы каждый раз ReadProcessMemory...

-= ALEX =- :: Короче берешь и считываешь все байты в некий буфер (buf: Pbytearray), затем делаешь так getmem(buf,size), size - размер, и читаешь последовательность байтов по адресу $420000 и размером ($450000 - $445000), а потом уже перебираешь байты в буфере. Это очень быстро.... если что могу сделать реальный пример...

freeExec :: PS. И старвнивай не по байтам а сразу 32 битным числом

-= ALEX =- :: FEUERRADER Тебе обязательно на Delphi ? на асм не пробывал

FEUERRADER :: -= ALEX =-
Если можешь, скинь на мыло примерчик.
Надо на Дельфи, т.к. масм/тасм не знаю (толком не разбираюсь) :(
А?

-= ALEX =- :: OK ! буду писать...

-= ALEX =- :: var buf:PByteArray;
size,i:Integer;
FirstOffset,SecondOffset:longint;
begin
; Заполняем инфу
FirstOffset:=$420000;
SecondOffset:=$445000;
size:=SecondOffset-FirstOffset;
;
getmem(buf,size);
ReadProcessMemory(pi.hprocess,Pointer(FirstOffset) ,@buf,size,bytesread);
for i:=0 to size-1 do
begin
if (buf^=$AD) and
(buf^[i+1]=$54) and
(buf^[i+2]=$56) and
(buf^[i+2]=$35) then WriteProcessMemory(pi.hProcess, Pointer(i+FirstOffset), @newdata[0],1, i1);
end;
freemem(buf);
end;

Сразу скажу, что я не тестировал, но принцип таков, и должно по идеи работать...






   
Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS