![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дамп процедуры
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); // заполнили массив
...