首页
社区
课程
招聘
ApiHook,InjectDll 单元及其应用 [Delphi代码]
发表于: 2005-8-11 21:59 11876

ApiHook,InjectDll 单元及其应用 [Delphi代码]

2005-8-11 21:59
11876

procedure InjectDllToProcess(hProcess:DWORD;lpDllName:PCHar);
进程插入DLL~留后有用~可以将HOOK的DLL插入目标进程
默认无法在Win9x下运行请使用EliCZ的EliRT单元~
以后说说如何打造自己的~
VirtualAllocEx,VirtualFreeEx,CreateRemoteThread函数(其实<<软件加密内幕>>已经给出了思路~下次贴出来吧)这次说API hook

function HOOKAPI(lpModuleName : PChar; lpApiName : PChar; pCallbackFunc : Pointer) : dword;

挂钩函数

function UnHOOK(lpModuleName : PChar; lpApiName : PChar; pRestorePoint : Pointer; dwOldAddr : dword) : BOOL;

脱钩函数

unit APIHOOK;
{$WARNINGS OFF}
interface

uses Windows;

procedure InjectDllToProcess(hProcess:DWORD;lpDllName:PCHar);
function HOOKAPI(lpModuleName : PChar; lpApiName : PChar; pCallbackFunc : Pointer) : dword;
function UnHOOK(lpModuleName : PChar; lpApiName : PChar; pRestorePoint : Pointer; dwOldAddr : dword) : BOOL;
implementation

type
  PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
  IMAGE_IMPORT_DESCRIPTOR = record
  OriginalFirstThunk : DWORD;
  TimeDateStamp : DWORD;
  ForwarderChain : DWORD;
  Name : DWORD;
  FirstThunk : DWORD;
end;

type
  PIMAGE_THUNK_DATA = ^IMAGE_THUNK_DATA;
  IMAGE_THUNK_DATA = record
  FunctionAddr : DWORD;
end;

type
  PIMAGE_RESTORE = ^IMAGE_RESTORE;
  IMAGE_RESTORE = record
  OldAddr : DWORD;
  NewAddr : DWORD;
end;

function IntToStr(Value: Integer): String;
begin
  Str(Value, Result);
end;


function UnHOOK(lpModuleName : PChar; lpApiName : PChar; pRestorePoint : Pointer; dwOldAddr : dword) : BOOL;
var
  dwLoaded : dword;
  pProtoFill : Pointer;
  dwModuleBase : dword;
  pDosHdr : PImageDosHeader;
  dwPeOffset : dword;
  pNtHdr : PImageNtHeaders;
  pImportDesc : PIMAGE_IMPORT_DESCRIPTOR;
  pCode : ^Pointer;
  bYesNo : Boolean;
begin
  dwLoaded := LoadLibrary(lpModuleName);
  pProtoFill := GetProcAddress(dwLoaded, lpApiName);
  dwModuleBase := GetModuleHandle(nil);
  pDosHdr := PImageDosHeader(dwModuleBase);
  dwPeOffset := pDosHdr^._lfanew;
  pNtHdr := Pointer(dword(pDosHdr) + dwPeOffset);
  pImportDesc := Pointer(dword(pDosHdr) + pNtHdr.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  bYesNo := FALSE;
  while pImportDesc^.Name <> 0 do
  begin
    pCode := Pointer(dword(pDosHdr) + pImportDesc^.FirstThunk);
    while pCode^ <> nil do
    begin
      if (pCode^ = Pointer(dwOldAddr)) then
      begin
        pCode^ := pProtoFill;
        bYesNo := TRUE;
      end;
      pCode := Pointer(dword(pCode) + 4);
    end;
    pImportDesc := Pointer(dword(pImportDesc) + 20);
  end;
  if (bYesNo = TRUE) then
  begin
    Result := TRUE;
  end else
  begin
    Result := FALSE;
  end;
end;

function HOOKAPI(lpModuleName : PChar; lpApiName : PChar; pCallbackFunc : Pointer) : dword;
var
  pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
  pNtHdr : PImageNtHeaders;
  dwModuleBase : DWORD;
  pDosHdr : PImageDosHeader;
  pCode: ^Pointer;
  pProtoFill : Pointer;
  dwLoaded : DWORD;
  dwPeOffset : DWORD;
  dwOld : DWORD;
  bYesNo : Boolean;
  dwAdz : dword;
begin
  dwLoaded := LoadLibrary(lpModuleName);
  pProtoFill := GetProcAddress(dwLoaded, lpApiName);
  dwModuleBase := GetModuleHandle(nil);
  pDosHdr := PImageDosHeader(dwModuleBase);
  dwPeOffset := pDosHdr^._lfanew;
  pNtHdr := Pointer(dword(pDosHdr) + dwPeOffset);
  pImportDesc := Pointer(dword(pDosHdr) + pNtHdr.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  bYesNo := FALSE;
  while pImportDesc^.Name <> 0 do
  begin
    pCode := Pointer(dword(pDosHdr) + pImportDesc^.FirstThunk);
    while pCode^ <> nil do
    begin
      if (pCode^ = pProtoFill) then
      begin
       VirtualProtect(pCode, 4, PAGE_EXECUTE_READWRITE, @dwOld);
       dwAdz := dword(pCode^);
       bYesNo := TRUE;
       pCode^ := pCallbackFunc;
       Result := dwAdz;
      end;
      pCode := Pointer(dword(pCode) + 4);
    end;
    pImportDesc := Pointer(dword(pImportDesc) + 20);
  end;
  if (bYesNo = FALSE) then
  begin
    Result := 0;
  end else
  begin
    Result := dwAdz;
  end;
end;

procedure InjectDllToProcess(hProcess:DWORD;lpDllName:PCHar);
var
  dwWritten : DWORD;
  dwThread : DWORD;
  dwTid: DWORD;
  pArg : Pointer;
begin
  pArg := VirtualAllocEx(hProcess, nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProcess, pArg, Pointer(lpDllName), 4096, dwWritten);
  dwThread := CreateRemoteThread(hProcess, nil, 0, GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA'), pArg, 0, dwTid);
  WaitForSingleObject(dwThread, INFINITE);
  VirtualFreeEx(hProcess, pArg, 0, MEM_RELEASE);
  CloseHandle(dwThread);
  CloseHandle(hProcess);
end;

end.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 80
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
XP sp3下测试不好使啊。请高手指点啊。
2009-7-22 22:43
0
游客
登录 | 注册 方可回帖
返回
//