We don't display ads so we rely on your Bitcoin donations to 1KWEk9QaiJb2NwP5YFmR24LyUBa4JyuKqZ
Post date: Mar 16, 2010 3:45:11 PM
{
Unit: uRedirectAPI
Author: steve10120
Description: Redirect imported API's, making rebuilding after dump harder.
Notes: This is just a simple [mov eax, xxxx >> jmp eax] to the API, if you want to defeat generic tracing functions you should obfuscate it somehow.
Website: hackhound.org
History: First try
}
unit uRedirectAPI;interfaceuses Windows;function RedirectAPIs(dwModule:DWORD):Boolean;type PImageImportDescriptor = ^TImageImportDescriptor; TImageImportDescriptor = packed record OriginalFirstThunk: DWORD; TimeDateStamp: DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD; end;type PImportByName = ^TImportByName; TImportByName = packed record Name1: DWORD; end;implementationfunction RedirectAPIs(dwModule:DWORD):Boolean;var IDH: PImageDosHeader; INH: PImageNtHeaders; IID: PImageImportDescriptor; IBN: PImportByName; pMem: Pointer; pFunction: Pointer; pWrite: ^Pointer; dwNull: DWORD; xVirtualAlloc:function(lpvAddress: Pointer; dwSize, flAllocationType, flProtect: DWORD): Pointer; stdcall;begin Result := FALSE; IDH := Pointer(dwModule); if IDH.e_magic = IMAGE_DOS_SIGNATURE then begin INH := Pointer(dwModule + IDH._lfanew); if INH.Signature = IMAGE_NT_SIGNATURE then begin xVirtualAlloc := GetProcAddress(GetModuleHandle('kernel32.dll'), 'VirtualAlloc'); VirtualProtect(Pointer(dwModule + INH.OptionalHeader.DataDirectory[1].VirtualAddress), INH.OptionalHeader.DataDirectory[1].Size, PAGE_EXECUTE_READWRITE, dwNull); IID := Pointer(dwModule + INH.OptionalHeader.DataDirectory[1].VirtualAddress); while IID.Name <> 0 do begin if IID.OriginalFirstThunk <> 0 then IBN := Pointer(dwModule + IID.OriginalFirstThunk) else IBN := Pointer(dwModule + IID.FirstThunk); pWrite := Pointer(dwModule + IID.FirstThunk); while IBN.Name1 <> 0 do begin if (IBN.Name1 and $80000000) <> 0 then begin pFunction := pWrite^; pMem := xVirtualAlloc(nil, 7, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); if pMem <> nil then begin PByte(pMem)^ := $B8; PDWORD(DWORD(pMem) + 1)^ := DWORD(pFunction); PByte(DWORD(pMem) + 5)^ := $FF; PByte(DWORD(pMem) + 6)^ := $E0; pWrite^ := pMem; end; end else begin pFunction := pWrite^; pMem := xVirtualAlloc(nil, 7, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); if pMem <> nil then begin PByte(pMem)^ := $B8; PDWORD(DWORD(pMem) + 1)^ := DWORD(pFunction); PByte(DWORD(pMem) + 5)^ := $FF; PByte(DWORD(pMem) + 6)^ := $E0; pWrite^ := pMem; end; end; Inc(IBN, SizeOf(IBN)); Inc(pWrite); end; Inc(IID) end; Result := TRUE; end; end;end;end.Usage:
RedirectAPIs(GetModuleHandle(nil));