Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.044 c
1-1106874074
KOLIG
2005-01-28 04:01
2005.02.13
Сворачивание окна


1-1106998266
Antonn
2005-01-29 14:31
2005.02.13
Утечка памяти


1-1107030167
ASDASD
2005-01-29 23:22
2005.02.13
Два вопроса: Общие точки и Работа Chart


14-1106564058
Vlad Oshin
2005-01-24 13:54
2005.02.13
Не напомните в каком windows и где лежит интерпретатор basic?


1-1107111860
QWEQWEQWE
2005-01-30 22:04
2005.02.13
Drag&amp;Drop