Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дамп процедуры


dumper ©   (2005-01-31 19:11:00) 

как задампить процедуру? К примеру есть процедура
procedure MyProc;
begin
....
end;
Так вот как мне получить ее код? Как считать ее во время выполнения программы?


Defunct   (2005-01-31 20:52:00) [1]

> Или нет, я понял, Вы наверное хотите отделить эти 0..3 байт мусора, ища в поседних четырёх байтах $CB.

именно


GuAV   (2005-01-31 20:50:00) [2]

Defunct ©   (31.01.05 20:45) [9]
Большинство процедур и функций оканчиваются кодом $CB.


Однако этот код встречается и внутри многих процедур, не так ли ?

Или нет, я понял, Вы наверное хотите отделить эти 0..3 байт мусора, ища в поседних четырёх байтах $CB.


Defunct   (2005-01-31 20:45:00) [3]

dumper   (31.01.05 20:11) [8]

завершающую пустую процедуру можно ставить, при этом возможно попадание мусора (процедуры обычно выровняны на границу Dword).
Большинство процедур и функций оканчиваются кодом $CB.


dumper   (2005-01-31 20:11:00) [4]

>CopyMemory( <Куда копировать>, @MyProc, <Сколько байт копировать>
Каким образом определить длину кода, если нельзя использовать процедуры пустышки?
FS := Integer(@MyProc) - ? ?);


Defunct   (2005-01-31 19:50:00) [5]

dumper   (31.01.05 19:45) [6]

не забивайте голову метками, у вас есть процедура которую надо скопировать, она расположена по адресу @MyProc.


dumper   (2005-01-31 19:45:00) [6]

А как определить где находится метка?


Просто Джо   (2005-01-31 19:28:00) [7]


> Достаточно одной метки (в конце процедуры) и то только для
> определения длины кода.


Согласен, перемудрил


Defunct   (2005-01-31 19:25:00) [8]

> Просто Джо ©   (31.01.05 19:18) [1]

Что-то слишком сложно, да и не правильно. В теле пустой процедуры как минимум есть команда Ret, а это значит уже результат будет неверным.

Достаточно одной метки (в конце процедуры) и то только для определения длины кода.

Label EndOfMyProc;

procedure MyProc;
begin
 // код
EndOfMyProc:
end;


Просто Джо   (2005-01-31 19:22:00) [9]

Вдогонку к [1] Просто Джо ©   (31.01.05 19:18)

Сделал не CopyMemory, чтобы сразу можно было в теле GetByteArray считать CRC или чего-там нужно


Defunct   (2005-01-31 19:19:00) [10]

CopyMemory( <Куда копировать>, @MyProc, <Сколько байт копировать> );


Просто Джо   (2005-01-31 19:18:00) [11]

Перед процедурой и после создать пустые процедуры-метки.
Все, что между "пустышками" рассматривать как PByteArray.
Навскидку, примерно так (возможны ошибки, пишу не в редакторе):

function GetByteArray (BeginLabel,EndLabel: Pointer; var BtArray: TByteArray): Integer;
var
 dwOldProtect: DWORD;
 B: Byte;
 P: Pointer;
 I: Cardinal absolute P;
 N: Integer;
begin
 SetLength (BtArray,0);
 
 VirtualProtect(
   BeginLabel,
   Cardinal(EndLabel)-Integer(BeginLabel),
   PAGE_READONLY,
   @dwOldProtect
 );
 

 N := 0;
 I := Cardinal(BeginLabel);
 while I<=(Cardinal(EndLabel)) do
 begin
   B := Byte(P^);
   BtArray[N] := B;
   Inc(I);
   Inc(N)
 end;

 Dec(N);

 Result := N
end;


Используем так:


procedure BeginLabel;
asm // пустышка, начало кода
end;

procedure ActualProc;
begin
/// наша процедура
end;

procedure EndLabel;
asm // пустышка, конец кода
end;

....
var
 BtArray: TByteArray;
 Cnt: Integer;
 ...
 Cnt := GetByteArray(@BeginLabel,@EndLabel,BtArray); // заполнили массив
 ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо