Форум: "Основная";
Текущий архив: 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