// вы читаете...

Новости

Обход SoftIce’а



* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:77D72C33(C), :77D72C43(U)
|
:77D5ADE4 6A00 push 00000000
:77D5ADE6 FF742414 push [esp+14]

Из листинга видно, что если будут ставить бряк, то скорее всего это будет bpx MessageBoxA или bpx MessageBoxA + 7… Значит в нашем лечащем массиве для MessageBoxA будет 2 записи:
HealMas[0].position:=0; // позиция, от начала (первого байта) излечаемой функции
HealMas[0].truly:=$83; // сам опкод лечения
HealMas[1].position:=7;
HealMas[1].truly:=$0F;

Сама структура HealMas выглядит так:
Type
PHealRec = ^THealRec;
THealRec = record
position:integer;
truly:byte;
end;

А вот и сама процедура лечения:

procedure Healing(ArrPointer:PHealRec; NumOfElems:integer; Offset:integer);
{параметры следующие: указатель на массив, (!!! массив надо создавать с 0-ого элемента!!!) содержащий количество “лечений”, колчиесво элементов массива, и указатель на первый байт излечаемой процедуры/функции}
var i:integer;
saved,s:cardinal;
b:pbyte;
begin
for i:=0 to NumOfElems-1 do
begin
b:=pointer(offset+PHealRec(integer(ArrPointer)+i*sizeof(THealRec)).position); // высчитываем указатель на исправляемый байт
VirtualProtect(b, 1, PAGE_READWRITE, saved); // делаем возможным запись в этот байт
b^:=PHealRec(integer(ArrPointer)+i*sizeof(THealRec)).truly; // восстанавливаем всё что попортил дебаггер
VirtualProtect(b, 1, saved, s); // возвращаем атрибуты памяти
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var HealMas:array[0..1] of THealRec;
h:integer;
begin
HealMas[0].position := 0; // заполняем массив
HealMas[0].truly := $83;
HealMas[1].position := 7;
HealMas[1].truly := $0F;
h := loadlibrary(‘user32.dll’);
Healing(@HealMas,2,integer(GetProcAddress(h,’MessageBoxA’))); // вызываем “лечение”
MessageBoxA(0,’Test’,’Am I healed?’,MB_OK); // её никто не поймал :)
end;

Страницы: 1 2 3 4 5 6 7

Обсуждене

Отзывов нет на «Обход SoftIce’а»

Ваш отзыв

Рубрики