Вниз
Скачать: CL | DM;

Дамп процедуры   Найти похожие ветки 

← →
dumper   (2005-01-31 19:11) [0]

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


← →
Просто Джо ©   (2005-01-31 19:18) [1]

Перед процедурой и после создать пустые процедуры-метки.
Все, что между "пустышками" рассматривать как 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); // заполнили массив
 ...


← →
Defunct ©   (2005-01-31 19:19) [2]

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


← →
Просто Джо ©   (2005-01-31 19:22) [3]

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

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


← →
Defunct ©   (2005-01-31 19:25) [4]

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

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

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

Label EndOfMyProc;

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


← →
Просто Джо ©   (2005-01-31 19:28) [5]


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


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


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

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


← →
Defunct ©   (2005-01-31 19:50) [7]

dumper   (31.01.05 19:45) [6]

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


← →
dumper   (2005-01-31 20:11) [8]

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


← →
Defunct ©   (2005-01-31 20:45) [9]

dumper   (31.01.05 20:11) [8]

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


← →
GuAV ©   (2005-01-31 20:50) [10]

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


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

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


← →
Defunct ©   (2005-01-31 20:52) [11]

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

именно



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.024 c
14-1106550846
NewDelpher
2005-01-24 10:14
2005.02.13
Что за глюк Delphi 7 буквой "я"


3-1105604882
Rostislav Rotaru
2005-01-13 11:28
2005.02.13
Как правильнее огрганизовать взаимодействие с базой из интерфейса


14-1106622663
Думкин
2005-01-25 06:11
2005.02.13
С Днем Рождения! 25 января


6-1101807077
Vyacheslav
2004-11-30 12:31
2005.02.13
Как отобразит процесс загрузки по FTP


1-1107245865
BeshCN
2005-02-01 11:17
2005.02.13
DBGrid




   Наверх