> function PointerToFunctionAddress(Code: Pointer): PPointer; Var func: PImportCode; begin Result:=nil; if Code=nil then exit; try func:=code; if (func.JumpInstruction=$25FF) then begin Result:=func.AddressOfPointerToFunction; end; except Result:=nil; end; end;
function FinalFunctionAddress(Code: Pointer): Pointer; Var func: PImportCode; begin Result:=Code; if Code=nil then exit; try func:=code; if (func.JumpInstruction=$25FF) then begin Result:=func.AddressOfPointerToFunction^; end; except Result:=nil; end; end;
Function PatchAddress(OldFunc, NewFunc: Pointer): Integer; Var BeenDone: TList;
Function PatchAddressInModule(hModule: THandle; OldFunc, NewFunc: Pointer): Integer; Var Dos: PImageDosHeader; NT: PImageNTHeaders; ImportDesc: PImage_Import_Entry; rva: DWORD; Func: PPointer; DLL: String; f: Pointer; written: DWORD; begin Result:=0; Dos:=Pointer(hModule); if BeenDone.IndexOf(Dos)>=0 then exit; BeenDone.Add(Dos); OldFunc:=FinalFunctionAddress(OldFunc); if IsBadReadPtr(Dos,SizeOf(TImageDosHeader)) then exit; if Dos.e_magic<>IMAGE_DOS_SIGNATURE then exit; NT :=Pointer(Integer(Dos) + dos._lfanew); // if IsBadReadPtr(NT,SizeOf(TImageNtHeaders)) then exit;
RVA:=NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if RVA=0 then exit; ImportDesc := pointer(integer(Dos)+RVA); While (ImportDesc^.Name<>0) do begin DLL:=PChar(Integer(Dos)+ImportDesc^.Name); PatchAddressInModule(GetModuleHandle(PChar(DLL)),OldFunc,NewFunc); Func:=Pointer(Integer(DOS)+ImportDesc.LookupTable); While Func^<>nil do begin f:=FinalFunctionAddress(Func^); if f=OldFunc then begin WriteProcessMemory(GetCurrentProcess,Func,@NewFunc,4,written); If Written>0 then Inc(Result); end; Inc(Func); end; Inc(ImportDesc); end; end;
begin BeenDone:=TList.Create; try Result:=PatchAddressInModule(GetModuleHandle(nil),OldFunc,NewFunc); finally BeenDone.Free; end; end;
procedure HookTextOut(ConvertFunction: TConvertTextFunction); begin if @OldTextOutA=nil then @OldTextOutA:=FinalFunctionAddress(@TextOutA); if @OldTextOutW=nil then @OldTextOutW:=FinalFunctionAddress(@TextOutW);
if @OldExtTextOutA=nil then @OldExtTextOutA:=FinalFunctionAddress(@ExtTextOutA); if @OldExtTextOutW=nil then @OldExtTextOutW:=FinalFunctionAddress(@ExtTextOutW);
if @OldDrawTextA=nil then @OldDrawTextA:=FinalFunctionAddress(@DrawTextA); if @OldDrawTextW=nil then @OldDrawTextW:=FinalFunctionAddress(@DrawTextW);
if @OldDrawTextExA=nil then @OldDrawTextExA:=FinalFunctionAddress(@DrawTextExA); if @OldDrawTextExW=nil then @OldDrawTextExW:=FinalFunctionAddress(@DrawTextExW);
if @OldTabbedTextOutA=nil then @OldTabbedTextOutA:=FinalFunctionAddress(@TabbedTextOutA); if @OldTabbedTextOutW=nil then @OldTabbedTextOutW:=FinalFunctionAddress(@TabbedTextOutW);
if @OldPolyTextOutA=nil then @OldPolyTextOutA:=FinalFunctionAddress(@PolyTextOutA); if @OldPolyTextOutW=nil then @OldPolyTextOutW:=FinalFunctionAddress(@PolyTextOutW);
if @OldGetTextExtentExPointA=nil then
@OldGetTextExtentExPointA:=FinalFunctionAddress(@GetTextExtentExPointA);
if @OldGetTextExtentExPointW=nil then
@OldGetTextExtentExPointW:=FinalFunctionAddress(@GetTextExtentExPointW);
if @OldGetTextExtentPoint32A=nil then
@OldGetTextExtentPoint32A:=FinalFunctionAddress(@GetTextExtentPoint32A);
if @OldGetTextExtentPoint32W=nil then
@OldGetTextExtentPoint32W:=FinalFunctionAddress(@GetTextExtentPoint32W);
if @OldGetTextExtentPointA=nil then @OldGetTextExtentPointA:=FinalFunctionAddress(@GetTextExtentPointA);
if @OldGetTextExtentPointW=nil then @OldGetTextExtentPointW:=FinalFunctionAddress(@GetTextExtentPointW);
@ConvertTextFunction:=@ConvertFunction;
procedure UnhookTextOut; begin If @OldTextOutA<>nil then begin PatchAddress(@NewTextOutA, @OldTextOutA); PatchAddress(@NewTextOutW, @OldTextOutW); PatchAddress(@NewExtTextOutA, @OldExtTextOutA); PatchAddress(@NewExtTextOutW, @OldExtTextOutW); PatchAddress(@NewDrawTextA, @OldDrawTextA); PatchAddress(@NewDrawTextW, @OldDrawTextW); PatchAddress(@NewDrawTextExA, @OldDrawTextExA); PatchAddress(@NewDrawTextExW, @OldDrawTextExW); PatchAddress(@NewTabbedTextOutA, @OldTabbedTextOutA); PatchAddress(@NewTabbedTextOutW, @OldTabbedTextOutW); PatchAddress(@NewPolyTextOutA, @OldPolyTextOutA); PatchAddress(@NewPolyTextOutW, @OldPolyTextOutW); PatchAddress(@NewGetTextExtentExPointA, @OldGetTextExtentExPointA); PatchAddress(@NewGetTextExtentExPointW, @OldGetTextExtentExPointW); PatchAddress(@NewGetTextExtentPoint32A, @OldGetTextExtentPoint32A); PatchAddress(@NewGetTextExtentPoint32W, @OldGetTextExtentPoint32W); PatchAddress(@NewGetTextExtentPointA, @OldGetTextExtentPointA); PatchAddress(@NewGetTextExtentPointW, @OldGetTextExtentPointW); end; end;
initialization finalization UnhookTextOut; end.
=================================================== unit PEStuff;
interface uses Windows;
type PImageDosHeader = ^TImageDosHeader; _IMAGE_DOS_HEADER = packed record { DOS .EXE header } e_magic: Word; { Magic number } e_cblp: Word; { Bytes on last page of file } e_cp: Word; { Pages in file } e_crlc: Word; { Relocations } e_cparhdr: Word; { Size of header in paragraphs } e_minalloc: Word; { Minimum extra paragraphs needed } e_maxalloc: Word; { Maximum extra paragraphs needed } e_ss: Word; { Initial (relative) SS value } e_sp: Word; { Initial SP value } e_csum: Word; { Checksum } e_ip: Word; { Initial 上一页 [1] [2] [3] [4] [5] [6] 下一页 |