16,748
社区成员
发帖
与我相关
我的任务
分享
function InstallAntiAttach: Boolean;
label
__CodeToCopyStart, __CodeToCopyEnd, __CodeEnd;
var
ntdll: THandle;
pDbgUiRemoteBreakin: Pointer;
dwOldProtect: DWORD;
dwCodeSize: DWORD;
begin
ntdll := GetModuleHandle('ntdll.dll');
Result := False;
if ntdll = 0 then Exit;
pDbgUiRemoteBreakin := GetProcAddress(ntdll, 'DbgUiRemoteBreakin');
if Assigned(pDbgUiRemoteBreakin) then
begin
asm
// Get code size
lea eax, __CodeToCopyStart
lea ecx, __CodeToCopyEnd
sub ecx, eax
mov dwCodeSize, ecx
end;
// Make sure that we have write rights ...
if VirtualProtect(pDbgUiRemoteBreakin, dwCodeSize, PAGE_EXECUTE_READWRITE, dwOldProtect) then
begin
asm
// Copy code between __CodeToCopyStart and __CodeToCopyEnd
mov edi, pDbgUiRemoteBreakin
lea esi, __CodeToCopyStart
mov ecx, dwCodeSize
rep movsb
// Skip code
jmp __CodeEnd
__CodeToCopyStart:
lea eax, __CodeToCopyEnd
jmp eax
__CodeToCopyEnd:
end;
// ***CODE*HERE***
asm
// Clear registers
xor eax, eax
pushfd
mov [esp], eax
popfd
xor ebx, ebx
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi
xor esp, esp
xor ebp, ebp
// Jump to address 0
jmp eax
end;
// ***************
__CodeEnd:;
Result := True;
end;
end;
end;