DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jhgjhgf
今日帖子: 10
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2015/5/8 15:34:40
标题:
R3 HOOK OpenProcess 的问题 浏览:1693
加入我的收藏
楼主: unit HookAPI;
//Download by http://www.codefans.net
interface

uses
   Windows, Classes;
function LocateFunctionAddress(Code: Pointer): Pointer;
function RepointFunction(OldFunc, NewFunc: Pointer): Integer;

type //定义一个入口结构
   PImage_Import_Entry = ^Image_Import_Entry;
   Image_Import_Entry = record
      Characteristics: DWORD;
      TimeDateStamp: DWORD;
      MajorVersion: Word;
      MinorVersion: Word;
      Name: DWORD;
      LookupTable: DWORD;
   end;

type //定义一个跳转的结构
   TImportCode = packed record
      JumpInstruction: Word; //定义跳转指令jmp
      AddressOfPointerToFunction: ^Pointer; //定义要跳转到的函数
   end;
   PImportCode = ^TImportCode;
implementation

function LocateFunctionAddress(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 RepointFunction(OldFunc, NewFunc: Pointer): Integer;
var
   IsDone: TList;
   function RepointAddrInModule(hModule: THandle; OldFunc, NewFunc: Pointer): Integer;
   var
      Dos: PImageDosHeader;
      NT: PImageNTHeaders;
      ImportDesc: PImage_Import_Entry;
      RVA: DWORD;
      Func: ^Pointer;
      DLL: string;
      f: Pointer;
      written: DWORD;
   begin
      Result := 0;
      Dos := Pointer(hModule);
      if IsDone.IndexOf(Dos) >= 0 then exit;
      IsDone.Add(Dos);

      OldFunc := LocateFunctionAddress(OldFunc);

      if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then exit;
      if Dos.e_magic <> IMAGE_DOS_SIGNATURE then exit;
      NT := Pointer(Integer(Dos) + dos._lfanew);

      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);
         RepointAddrInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
         Func := Pointer(Integer(DOS) + ImportDesc.LookupTable);
         while Func^ <> nil do
         begin
          f := LocateFunctionAddress(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
   IsDone := TList.Create;
   try
      Result := RepointAddrInModule(GetModuleHandle(nil), OldFunc, NewFunc);
   finally
      IsDone.Free;
   end;
end;




进行OpenProcess时,单个程序HOOK时会正常,但同时运行两个一样的程序时,就会出问题,有没有更稳定的办法
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2015/5/8 15:35:47
1楼: A程序 启用HOOK后,
再运行B程序,B程序也HOOK后, A的程序就可以正常被任务管理器结束了,也就是A的HOOK无效了,不知道有没有什么比较好的办法,两个程序都可以同时保护
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 speedbin (speedbin) ★☆☆☆☆ -
盒子活跃会员
2015/5/8 15:49:53
2楼: 试试微软的Detours,不过网上只有32位版本64位版本要买,而且很贵,而且也买不到,网上基本上找不到官方的64位版本,另外还有开源的,百度搜一下。

Detours各方面考虑很全,毕竟MS的东西还是比较稳定的。
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2015/5/8 20:08:29
3楼: 楼主可以看下AFXRootkit的代码.
----------------------------------------------
按此在新窗口浏览图片
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2015/5/8 21:26:13
4楼: 这个Hook代码仅仅是Hook程序的导入表中的函数地址,而如果是GetProcAddress的根本没用。
而且Hook的时候压根就没考虑多次Hook的问题。
你可以试试我写的Hook库,支持WIN32和WIN64,比微软的Detours好用,还免费。
http://www.raysoftware.cn/?p=493
至少不会出现GetProcAddress有问题,或者多次Hook冲突的问题
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2015/5/16 21:21:50
5楼: 多谢大虾了,哈,
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 q34625474 (q34625474) ★☆☆☆☆ -
盒子活跃会员
2015/5/16 21:24:01
6楼: http://code.google.com/p/delphi-hook-library/

打不开呢,真是郁闷。。
----------------------------------------------
delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
作者:
男 coater (coater) ★☆☆☆☆ -
普通会员
2017/1/17 21:32:12
7楼: 墙了啊,需要的话可以发邮件,xyxxh1@126.com
版权归武哥所有啊,感谢武哥。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS