DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tino0914
今日帖子: 27
在线用户: 18
导航: 论坛 -> 开源项目 斑竹:joki,ralf_jones  
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 0:16:54
标题:
DelphiHookUtils @ github 浏览:7358
加入我的收藏
楼主: 开源 DelphiHookUtils,基于 wr960204 武大哥版本修改 ~

国庆帝都雾霾,一直闷家里发霉,也终于有时间搞搞自己的东东了!

年初基于 wr960204 武稀松大哥的 HookUtils 写了个 x64 的东东,效果很 8 错,不过呢,这个实现基于 BeaEngine 的静态库,额外胖了几百 K,对于我这只有“洁癖”的程序员,着实不爽!

之前关注过 BeaEngine 官网还有个 LDE64(Length Disassembler Engine)的东东,事实上对于武大哥那份 Hook 的实现,BeaEngine 只是为了查找足够的“代码间隙”,其实单个 LDE 应该是 ok 的!

遂,花了两天时间搞了这个东东:

https://github.com/delphilite/DelphiHookUtils

基于 LDE64 相对 BeaEngine 的优势非常明显,新 HookUtils 代码编译大约 10K 左右,相对武大哥“原版”,新版 HookUtils 主要修改:

1、参考 wr960204 武稀松 的原始实现: 
   https://code.google.com/p/delphi-hook-library 
2、修改 BeaEngine 引擎为 LDE64 长度反编译引擎,大幅降低大小
   https://github.com/BeaEngine/lde64
3、去除原始实现对多线程冻结的处理,通常建议 Hook/Unhook 放到单元初始化、析构中做,否则可能因改写内存没挂起其他线程造成错误 
4、由 HookUtils 中拆分 COM 相关函数至 HookIntfs 单元

初步 Delphi 2007-10.1 x86/x64 for Win 一切正常,大家有问题及时反馈 !?
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 4:17:50
1楼: 谨祝各位老Delphier们共同进步!!
----------------------------------------------
只有偏执狂才能生存!
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/10/5 6:41:42
2楼: 强烈支持先。。。已 Star.
----------------------------------------------
-
作者:
男 yaoyl (云里雾里) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 9:02:54
3楼: 期待你的Lite……
----------------------------------------------
Delphi老菜鸟~
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2016/10/5 9:26:58
4楼: 牛!
----------------------------------------------
-我的博客
作者:
男 isxuzhu (e.Wong) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 9:59:02
5楼: 非常感谢!!!学习!祝国庆快乐!
----------------------------------------------
你我,都可以是个造梦者!欢迎加入脚本引擎PaxCompiler交流群303904495http://www.cnblogs.com/fireboxsoft有需要错别字检测软件的朋友可以在我博客上的地址下载使用,备注“2ccc”的朋友可以免费获取超级黄金VVVVVVVVVVIP授权
作者:
男 liminx (liminx) ★☆☆☆☆ -
普通会员
2016/10/5 12:57:04
6楼: 先收藏了
----------------------------------------------
-
作者:
女 google220 (google220) ★☆☆☆☆ -
普通会员
2016/10/5 13:02:37
7楼: 期待你的Lite……期待你的Lite……
----------------------------------------------
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
作者:
男 cuit_xiong (熊猫) ★☆☆☆☆ -
普通会员
2016/10/5 13:06:43
8楼: 已经git下来等需要时在学习,谢谢lusper
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 17:58:23
9楼: 楼主实力派
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 chonghai (DBlue) ★☆☆☆☆ -
盒子活跃会员
2016/10/5 20:41:17
10楼: 赞!
----------------------------------------------
喜欢Delphi,关注Delphi,愿和广大爱好者交朋友。
作者:
男 xiucai (xiucai) ★☆☆☆☆ -
普通会员
2016/10/6 0:39:14
11楼: https://github.com/delphilite/DelphiHookUtils上不去,楼主能否给个下载包?
----------------------------------------------
-
作者:
男 kaida (kaida) ★☆☆☆☆ -
盒子活跃会员
2016/10/6 8:18:44
12楼: @ xiucai
DelphiHookUtils(lsuper 基于 wr960204 武大哥版本修改)
----------------------------------------------
http://down.desei.com.cn/down/1041485/MyWeb/VCLs.html
作者:
男 xiaoyo (XiaoYo) ★☆☆☆☆ -
普通会员
2016/10/6 11:57:05
13楼: 好东西 手下了 赞!
----------------------------------------------
-
作者:
男 xiucai (xiucai) ★☆☆☆☆ -
普通会员
2016/10/6 14:32:01
14楼: @kaida 多谢
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2016/10/6 14:43:44
15楼: lsuper做了件好事啊,我对现有的HookUtils也一直有要修改的想法,只是没时间。
赞一个!
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 bbnn38 (伟大的咸鱼) ★☆☆☆☆ -
普通会员
2016/10/6 21:44:51
16楼: 真是太赞了
----------------------------------------------
-
作者:
男 lufangyu (伟人录) ★☆☆☆☆ -
盒子活跃会员
2016/10/6 21:58:15
17楼: 楼主厉害!
----------------------------------------------
-
作者:
男 bbnn38 (伟大的咸鱼) ★☆☆☆☆ -
普通会员
2016/10/6 22:09:40
18楼: 话说回来,这东西的应用场景是哪些方面啊?下的钩子都是自身的,莫非还要注入到对方进程里下钩子吗?
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2016/10/6 23:52:06
19楼: @bbnn38 (伟大的咸鱼);AOP 这个思想还是很牛 b 的;搞别的进程远程注入或者 hijack 都可以 ~
----------------------------------------------
-
作者:
男 yxsoft (yxsoft) ★☆☆☆☆ -
盒子活跃会员
2016/10/7 0:48:18
20楼: 收藏先
----------------------------------------------
Great!
作者:
男 zhangshelly (雪莱) ★☆☆☆☆ -
盒子活跃会员
2016/10/7 8:44:12
21楼: 收藏
----------------------------------------------
-
作者:
男 jfhyn (贺兰之边) ★☆☆☆☆ -
普通会员
2016/10/7 10:42:49
22楼: 必须顶!
----------------------------------------------
-
作者:
男 gmxyb (gmxyb) ★☆☆☆☆ -
普通会员
2016/10/7 22:24:34
23楼: 支持~!

不过武大神原来的版本有个小问题(也许是我不会用),不知道解决没有?

这个问题是这样的:在一个dll中用HookProcInModule去钩WinInet.dll中的 HttpOpenRequestW函数成功,但是无法用UnHook卸掉,总是返回 False.
----------------------------------------------
-
作者:
男 gmxyb (gmxyb) ★☆☆☆☆ -
普通会员
2016/10/7 22:29:04
24楼: 补充一下23楼问题: 

在 DLL_PROCESS_ATTACH 时 HookProcInModule,成功;
在 DLL_PROCESS_DETACH 时 UnHook,失败,总是返回 False.
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2016/10/8 9:53:32
25楼: @gmxyb (gmxyb):有例子么?我 debug 一下 ~
@google220 (google220):内测中 ~ ;>
----------------------------------------------
-
作者:
男 gmxyb (gmxyb) ★☆☆☆☆ -
普通会员
2016/10/8 12:48:51
26楼: @lsuper: dll简化代码如下,dll 其实是个 ActiveX, 被IE载入调用的。

//////////

library HookDemo;

uses
  Windows, SysUtils, WinInet, HookUtils;


// 原始指针保存在 old_HttpOpenRequestW 变量中, 复制 WinInet 中的定义
var old_HttpOpenRequestW : function(hConnect: HINTERNET; lpszVerb: LPWSTR;
  lpszObjectName: LPWSTR; lpszVersion: LPWSTR; lpszReferrer: LPWSTR;
  lplpszAcceptTypes: PLPSTR; dwFlags: DWORD;
  dwContext: DWORD_PTR): HINTERNET; stdcall;


// 挂接的 Hook函数 new_HttpOpenRequestW
function new_HttpOpenRequestW(hConnect: HINTERNET; lpszVerb: LPWSTR;
  lpszObjectName: LPWSTR; lpszVersion: LPWSTR; lpszReferrer: LPWSTR;
  lplpszAcceptTypes: PLPSTR; dwFlags: DWORD;
  dwContext: DWORD_PTR): HINTERNET; stdcall;
var
  s : string;
begin
  // 先直接调用原始函数
  Result := old_HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion,
    lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext);

  if Result = nil then begin
    // 打印错误...
    Exit;
  end;  
  // 添加自定义的http标头
  s := 'X-MyHttpHeader: HeaderValue';
  if not Wininet.HttpAddRequestHeaders(Result, PChar(h), Length(h), 
    Wininet.HTTP_ADDREQ_FLAG_ADD or Wininet.HTTP_ADDREQ_FLAG_REPLACE) then begin
    // 打印错误...
    Exit;
  end;
end;

procedure _DllEntryPoint(dwReason: DWORD);  //èë3ö¿úoˉêy
 begin
   case dwReason of
     DLL_PROCESS_ATTACH : begin
       if HookUtils.HookProcInModule(PChar('WinInet.dll'), PChar('HttpOpenRequestW'),
          @new_HttpOpenRequestW, @old_HttpOpenRequestW) then begin
         // Hook 成功... <--这里正常
       end
       else begin
         // Hook 失败...
       end;
     end;
     DLL_PROCESS_DETACH : begin
       if HookUtils.UnHook(@old_HttpOpenRequestW) then begin
         // UnHook 成功...
       end
       else begin
         // UnHook 失败...<--这里总是失败
       end;
     end;
     DLL_THREAD_ATTACH  : begin
     end;
     DLL_THREAD_DETACH  : begin
     end;
   end;
 end;
begin
  SysInit.DllProc:=@_DllEntryPoint;
  _DllEntryPoint(DLL_PROCESS_ATTACH);
end.
----------------------------------------------
-
作者:
男 xiucai (xiucai) ★☆☆☆☆ -
普通会员
2016/10/9 0:14:45
27楼: @gmxyb 失败是因为你赋值的old_HttpOpenRequestW变量是在你调用的那份DLL里,加载到HOOK内存里的那一份DLL的old_HttpOpenRequestW变量值未赋值,old_HttpOpenRequestW这个变量必须是能跨进程访问的。
----------------------------------------------
-
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2016/10/9 10:44:42
28楼: @xiucai (xiucai):每个 dll 在自己的进程空间内都有自己的堆和栈数据结构,所有没问题
@gmxyb (gmxyb):感谢反馈,确实是个小 bug,已改,同时整合了你这个小例子,请更新 git ~ ;>
----------------------------------------------
-
作者:
男 gmxyb (gmxyb) ★☆☆☆☆ -
普通会员
2016/10/9 13:17:56
29楼: @lsuper 非常感谢 ~ 

@xiucai dll与加载它的主进程是在同一个地址空间的,不涉及跨进称问题。
----------------------------------------------
-
作者:
男 littlestone08 (littlestone08) ★☆☆☆☆ -
普通会员
2016/11/2 13:27:34
30楼: 杩欎釜蹇呴』鏀寔
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 dna32r (DNA32r) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 15:53:16
31楼: 用我翻译的HackerDisasmEngine吧
同时支持x86和x64
而且我也写了一个另外的库
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/11/3 16:07:41
32楼: 楼上的有下载地址吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2021/8/9 8:21:11
33楼: 要求
1:hook 任意地址 
2:JMP到我们myfuc后,在我们的myfuc先执行hook掉的代码,再执行我们代码。

这样的要求如何做呢?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2021/8/9 8:25:30
34楼:  
......          push ebp
......          mov ebp,esp
77c8003b  8908          mov dword prt ds:[eax],ecx   //hook这里   假如我们要读出ecx的值
77c8003d  8950 04     mov dwrod ptr ds:[eax+0x4],edx
77c80041          mov ebx,[eax]
.....          add ebx,[eax+0x4]
.....          mov eax,ebx
.....          mov esp,ebp
.....          pop  ebp
.....          ret


function myfunction()
begin
  //注意在裸函数里面不能进行变量的申请和赋值
  asm
    mov dword ptr ds:[eax],ecx
    mov dword ptr ds:[eax+0x4],edx    //这两条是原来的代码我们不能破坏,要加上去
    
    //这里开始我们要读出ecx寄存器里的值了
    //要保证我们的代码不会破坏堆栈和寄存器的值
    mov result,ecx  //将ecx的值赋值给result
    jmp retAddress            //这里因为不需要转换成机器码,所以直接jmp回去地址就行了
  end;
end;

这样,如何实现?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 abencat (远离delphi的人) ★☆☆☆☆ -
盒子活跃会员
2021/8/9 10:01:12
35楼: 跟着大神的脚本学习
----------------------------------------------
delphi爱好者
作者:
男 wiseinfo (wisienfo) ★☆☆☆☆ -
普通会员
2021/8/9 22:17:39
36楼: 不错,还带有DEMO,感觉入门了不错,还带有DEMO,感觉入门了
----------------------------------------------
-
作者:
男 slan06 (slan) ▲▲△△△ -
普通会员
2023/10/1 17:28:42
37楼: 谢谢分享
----------------------------------------------
-
作者:
男 sunkissfei (Bill) ★☆☆☆☆ -
普通会员
2023/10/2 16:09:43
38楼: 撸大哥是我坚持D的路上,坚强后盾
----------------------------------------------
-
作者:
男 yxsoft (yxsoft) ★☆☆☆☆ -
盒子活跃会员
2023/10/2 16:34:32
39楼: 感觉会用到,先顶!!
----------------------------------------------
Great!
作者:
男 mynet (if) ★☆☆☆☆ -
盒子活跃会员
2023/10/7 9:55:56
40楼: 谢谢分享!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行742.1875毫秒 RSS