вторник, 26 июля 2016 г.

выскакивает CPU Window на ntdll.DbgBreakPoint? Как от этого избавиться - Решение

С какого-то момента в старом Билдере старой полуживой Вин2003 при работе над старыми проектами при запуске проекта из IDE он стал постоянно вываливаться в дебаггер по Ret 3, причем корни уходили в ntdll и к самому проекту не имели никакого отношения (в том плане, что аналога DebugBreak() у меня нигде не было). Решение проблемы: делаем модуль и закидываем его в проект и получаем возможность дальше нормально отлаживать проект :) Спасибо решению здесь :)
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.

Комментариев нет:

Отправить комментарий

Буду рад Вашим комментариям...