unit patchret3;
interface
implementation
uses Windows, SysUtils;
procedure PatchINT3;
var
NOP : Byte;
BytesWritten : DWORD;
NtDll : THandle;
P : Pointer;
begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
NtDll := GetModuleHandle('NTDLL.DLL');
if NtDll = 0 then Exit;
P := GetProcAddress(NtDll, 'DbgBreakPoint');
if P = nil then Exit;
try
if Char(P^) <> #$CC then Exit;
NOP := $90;
if WriteProcessMemory(GetCurrentProcess, P, @NOP, 1,
BytesWritten) and (BytesWritten = 1) then
FlushInstructionCache(GetCurrentProcess, P, 1);
except
//Do not panic if you see an EAccessViolation here,
// it is perfectly harmless!
on EAccessViolation do ;
else raise;
end;
end;
initialization
PatchINT3;
end.
вторник, 26 июля 2016 г.
выскакивает CPU Window на ntdll.DbgBreakPoint? Как от этого избавиться - Решение
С какого-то момента в старом Билдере старой полуживой Вин2003 при работе над старыми проектами при запуске проекта из IDE он стал постоянно вываливаться в дебаггер по Ret 3, причем корни уходили в ntdll и к самому проекту не имели никакого отношения (в том плане, что аналога DebugBreak() у меня нигде не было).
Решение проблемы:
делаем модуль и закидываем его в проект и получаем возможность дальше нормально отлаживать проект :)
Спасибо решению здесь :)
Подписаться на:
Комментарии (Atom)