Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.039 c
14-1106300912
syte_ser78
2005-01-21 12:48
2005.02.13
Как определить чего дейтсвительно хочеш?


14-1106732038
passlight
2005-01-26 12:33
2005.02.13
Выборные государственные должности


14-1106670254
Шишкин Илья
2005-01-25 19:24
2005.02.13
КПК в Москве


1-1106737496
Vn
2005-01-26 14:04
2005.02.13
Мигание иконки на панели задач


1-1107042906
MadGhost
2005-01-30 02:55
2005.02.13
Как переместить какой нибудь компонент по форме?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский