社区
进程/线程/DLL
帖子详情
如何HOOK DLL中的一个导出函数
mcawxd
2009-12-04 03:02:28
我想HOOK一个DLL中的导出函数。不是HOOK API函数,而且这个DLL是在程序自己的目录下不在系统目录下。这样就不能通过劫持DLL来实现。应该怎么做呢?
...全文
309
9
打赏
收藏
如何HOOK DLL中的一个导出函数
我想HOOK一个DLL中的导出函数。不是HOOK API函数,而且这个DLL是在程序自己的目录下不在系统目录下。这样就不能通过劫持DLL来实现。应该怎么做呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
TRUE
2009-12-07
打赏
举报
回复
但是你的知道具体的参数形式和个数
TRUE
2009-12-07
打赏
举报
回复
4楼的是对的
mcawxd
2009-12-07
打赏
举报
回复
已经解决。
windviki
2009-12-04
打赏
举报
回复
[Quote=引用 4 楼 mcawxd 的回复:]
可不可以HOOK GetProcAddress然后取出参数与目标函数进行比较如果相等就把函数指针保存起来。然后调用替换的函数,执行完后再决定是不是继续执行函数指针指向的真实函数?
[/Quote]
LoadLibaryEx/GetProcAddress动态加载的dll的话,你的想法应该是正确的。
LiuYinChina
2009-12-04
打赏
举报
回复
Detours
mcawxd
2009-12-04
打赏
举报
回复
可不可以HOOK GetProcAddress然后取出参数与目标函数进行比较如果相等就把函数指针保存起来。然后调用替换的函数,执行完后再决定是不是继续执行函数指针指向的真实函数?
mcawxd
2009-12-04
打赏
举报
回复
[Quote=引用 1 楼 wangjia184 的回复:]
创建一个Proxy的DLL , 实现相同的接口, 然后替换掉这个。
这种方式要模拟所有的接口,很麻烦。
还有种方式,你创建的Proxy DLL只到处要HOOK的, 创建一个新的PE Section,将原来的 Import Table等复制过去进行修改,将需要HOOK的 THUNK指向你自己的Proxy DLL
[/Quote]
你这个太难了,还要修改Import Table。看着就晕。有没有像HOOK API或HOOK COM的那种方法。
CodeProject-Jerry
2009-12-04
打赏
举报
回复
还有种方式,你创建的Proxy DLL只需要实现被HOOK的, 创建一个新的PE Section,将原来的 Import Table等复制过去进行修改,将需要HOOK的 THUNK指向你自己的Proxy DLL
或者你可以试试 运行期的HOOK
CodeProject-Jerry
2009-12-04
打赏
举报
回复
创建一个Proxy的DLL , 实现相同的接口, 然后替换掉这个。
这种方式要模拟所有的接口,很麻烦。
还有种方式,你创建的Proxy DLL只到处要HOOK的, 创建一个新的PE Section,将原来的 Import Table等复制过去进行修改,将需要HOOK的 THUNK指向你自己的Proxy DLL
反编译
DLL
文件为.CPP工具
一、简介 AheadLib 是用来生成一个特洛伊
DLL
的工具,用于分析
DLL
中
的
函数
参数调用(比如记录Socket send了什么等等)、更改
函数
功能(随心所欲了:)、更改界面功能(比如在
Hook
里面生成一个按钮,截获事件等等)。 二、使用 1.用 AheadLib 打开要模拟的
DLL
,生成一个 CPP 文件。 2.用 Visual Studio 6.0/.NET 建立一个
DLL
工程,把这个 CPP 文件加入到项目
中
。 3.使用 Release 方式编译,生成的
DLL
将和原来的
DLL
具有一模一样的
导出
函数
,并且能顺利把这些
函数
转发到原来的
函数
中
。 4.AheadLib 还可以生成
Hook
代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注 1.如果
导出
函数
过多,在 Visual Studio 6.0
中
,如果出现编译错误,请在项目属性关闭与编译头功能。 2.如果是 C++ 、C __stdcall、C __fastcall 的方式
导出
的话,生成的
函数
声明将会还原成原代码级别(可能需要修改才能编译,比如
导出
C++类的情况)。此时使用 __declspec(
dll
export)
导出
——不能指定
导出
序号。 3.如果是 NONAME 或者 C _CDECL 方式
导出
(比如 DEF
导出
,大多数Windows
DLL
都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)
导出
,且指定
导出
序号。 4.如果系统
中
没有 DbgHelp.
dll
,将无法识别 C++ 模式的
导出
。
编辑/查看
DLL
文件的PE
导出
表工具ExpX-v0.5
软件说明: ExpX是一个编辑/查看PE文件
导出
表的工具。 利用它可以方便的对PE文件的
导出
表进行增、删、改的操作,现在它还可以用于给没有
导出
表的文件添加
导出
函数
。 这个工具除了PE diy外,通过为
导出
函数
添加Forward信息等方法还可以实现
函数
hook
,
dll
注入等功能。至于更多的用途还等你来发现了。 这个程序为学习PE结构的产品,如果时间精力允许我会继续更新。 如果你有什么建议请发到我的邮箱ttui@163.com。
利用输入法注入
DLL
Ring3下注入
DLL
的另类方法,能过杀软和游戏NP(源码) 注入
DLL
是做全局钩子或者拦截类软件都有可能用到的技术,如果做外挂的话我们也有 可能需要注入一个
DLL
到游戏进程
中
去干点什么“坏事”。 但我们知道现在要注入
DLL
是越 来越难了。场景1:制作火星文输入法外挂,原理是利用API
HOOK
拦截并修改输入法相关函 数,需要注入一个
DLL
到所有进程
中
,但是后来发现,在开启了瑞星的帐号保险箱后,用户 将不能在QQ
中
输入火星文。原因是瑞星保护了QQ进程,禁止对其注入
DLL
,解决方法是提示 用户关闭帐号保险箱 -_-| 确实是很降低用户体验的一个不是办法的办法。场景2:制作某 游戏外挂,需要注入一个
DLL
到游戏进程
中
去直接调用游戏
函数
完成某一功能。结果发现该 游戏有NP保护,OpenProcess打不开,创建远程线程也不行,试用其它方法也一一失败。遇 到上面的情况,高手们自然是转到Ring0下面去,使用驱动之类的办法来对付啦,不过吾等 菜鸟可就是酒井没法子了 -_-| 不过也别太灰心,凡事总会有办法的。我想我们需要一种持久的、稳定的、不容易被安 全软件屏蔽的
DLL
注入方法,后来发现,输入法程序就是能完成这一任务的理想人选。输入 法程序程序到底是什么?它没有自己的进程,并且在系统还没有登录时就已被加载(在欢迎 界面你也可以调出输入法),它可以在游戏
中
打开,也可以在控制台程序
中
打开,还可以在 瑞星保护下的QQ
中
打开,在杀软
中
也可以打开,这不就是我们要找的特性吗。那么,输入法 到底是什么呢?根据Windows的规定,输入法其实就是一个
DLL
,不过它是一个特殊的
DLL
, 它必须具有标准输入法程序所规定的那些接口,输入法是由输入法管理器(imm32.
dll
)控 制的,输入法管理器又是由user32.
dll
控制的。输入法在系统目录是以IME为扩展名的文件 ,当在应用程序
中
激活某个输入法时,输入法管理器就会在那个应用程序的进程
中
加载对应 的IME文件,注意,加载IME文件跟加载普通的
DLL
并没有本质区别,所以,可以认为,输入 法其实就是注入到应用程序
中
的一个
DLL
文件,并且,这种“注入”是不会被杀软和游戏NP 拦截的(至少目前是)。现在,我们已经有了一个注入
DLL
的另类方法,那就是利用输入法 。具体流程是这样,首先制作一个标准输入法文件,但是这个输入法并不完成文字输入工作 ,它的唯一任务就是用来注入
DLL
,所以称为“服务输入法”,然后,制作一个控制程序, 来控制服务输入法,当然最后还需要一个用于注入的目标
DLL
,这样一共就有3个文件。开始 工作后,控制程序首先将服务输入法安装到系统
中
,然后传递几个参数给服务输入法,参数
中
包括了需要注入的
DLL
文件的名称和路径,然后,控制程序将服务输入法设置为系统的默 认输入法,这样新的程序一打开,服务输入法就会注入那个程序。当然,在服务输入法安装 之前打开的程序不会被注入,这时需要向系统
中
的所有窗口POST一条 WM_INPUTLANGCHANGEREQUEST消息,该消息可以在指定窗口
中
后台激活服务输入法,这样, 系统
中
所有拥有窗口的进程就都被我们的服务输入法注入了。服务输入法注入程序之后,就 会根据控制程序传递过来的参数加载目标
DLL
,这样目标
DLL
也就随着服务输入法一同注入到 目标程序
中
了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口
中
自动激活的,如果某个窗口自动激活失败,你就需要在那个窗口
中
手工切换到服务输入法 ,这样才能注入进去了。至于注入以后,你就可以在窗口
中
切换到别的输入法,这并不会影 响已经注入进去的
DLL
。我将这一套功能制作成一个完整的示例,你可以在以下地址下载: http://www.pen88.com/download/ime
hook
.rar 压缩包
中
的第6个和第8个文件夹演示了此 功能并包含所有源代码。其
中
文件ime
dll
host09.
dll
就是服务输入法,运行时会被安装到系 统
中
,控制程序退出时会自动卸载该输入法,这样用户就不太容易察觉,你还可以重新编译 该输入法,将名称改为“
中
文(
中
国)”,这样隐蔽性更好。文件hxw
dll
wx.
dll
是演示用的 目标
DLL
,你可以替换成自己的
DLL
,然后那个exe文件就是控制程序了。输入法 ime
dll
host09.
dll
在运行时会被复制到系统目录并更名为ime
dll
host09.ime,它
导出
了2个
函数
用于控制。在VB
中
的声明为: Public Declare Function IMESetPubString Lib "ime
dll
host09.ime" (ByVal Run
DLL
Str As String, ByVal Unload
Dll
As Long, ByVal loadNextIme As Long, ByVal
Dll
Data1 As Long, ByVal
Dll
Data2 As Long, ByVal
Dll
Data3 As Long) As Long Public Declare Function IMEClearPubString Lib "ime
dll
host09.ime" () As Long 其
中
IMESetPubString用于向输入法传递要注入的
DLL
等参数。Run
DLL
Str,要注入的
DLL
命令 和完整路径。Unload
Dll
,当输入法退出时,是否同时卸载目标
DLL
0-是,1-否。 loadNextIme,当切换至该服务输入法时,是否直接切换到下一个输入法(这样服务输入法 就好像被跳过了,可最小限度影响用户的输入法顺序) 0-否,1-是。
Dll
Data1,
Dll
Data2 ,
Dll
Data3是传递给目标
DLL
的回调
函数
(
函数
名称必须为Run
Dll
HostCallBack)的参数, 你可以在目标
DLL
中
导出
一个
函数
,名称为Run
Dll
HostCallBack,这样当输入法注入时会调 用目标
DLL
的该回调
函数
并向其传递这3个参数。
函数
原型为(VC): DWORD Run
Dll
HostCallBack(DWORD calldata1, DWORD calldata2,DWORD calldata3); IMEClearPubString
函数
用于清除输入法的配置,清除后,输入法将停止在新的程序
中
注入 目标
DLL
,但已注入的
DLL
不会卸载。 好了,利用输入法来注入
DLL
基本上就是这样了,详细的用法大家可以看压缩包
中
的第8个文 件夹,其
中
服务输入法是VC写的,控制程序是VB的,代码都是有注释的。测试发现该方法能 过目前所有杀软,也能注入冰刃。当然缺点还是有的,就是目标程序如果不接受输入法那就 没办法了,但是现在一般的游戏都不会禁止玩家在里面打字吧,而且杀软也不能禁止用户输 入汉字吧,哈哈,所以通用性应该还是蛮好的。 最后,我再介绍另一个注入
DLL
的方法,估计也很少被用到。是利用一个未公开
函数
RegisterUserApi
Hook
,可以在网上搜索关键词“RegisterUserApi
Hook
”,查到有人在 Windows 2003下测试成功,但是我在Windows XP测试却失败。后来终于找到了失效的原因。 RegisterUserApi
Hook
函数
可以在系统
中
注册一个全局钩子,你需要在钩子
中
指定一个
DLL
和 一个回调
函数
,然后,所有加载了user32.
dll
的程序就都会在启动时加载你指定的这个
DLL
。用这个
函数
来注入
DLL
也是很不错的。但是测试发现它的注入能力似乎赶不上上面提到的 利用输入法来注入的办法,可以注入一般的程序和某些安全程序,但是对冰刃无效。而且它 有一个限制,就是系统
中
只能同时存在一个这样的钩子。实际上这个钩子平时是被系统
中
的 Themes服务占用了,Themes服务正是利用这个钩子
HOOK
了绘制窗口的相关API,所以才让所 有程序窗口变成XP主题样式的。所以我们要用这个钩子的话,必须先关闭Themes服务,这样 在XP下也可以用了,但是这样系统就变成Windows 2000的样式了 -_-| RegisterUserApi
Hook
函数
的VB声明如下: Public Declare Function RegisterUserApi
Hook
XP Lib "user32" Alias "RegisterUserApi
Hook
" (ByVal hInstance As Long, ByVal fnUserApis As Long) As Long Public Declare Function RegisterUserApi
Hook
2003 Lib "user32" Alias "RegisterUserApi
Hook
" (pRegInfo As
Hook
APIRegInfo2003) As Long 可以看到,在XP和2003下这个
函数
的参数是不一样的。关于此
函数
的示例代码,请参见压缩 包
中
的第5个文件夹。 最后的最后,再介绍一个未公开
函数
InitializeLpk
Hook
s,这个
函数
在网上能找到的资料更 少,只有一个声明而已。但是它名称
中
最后那个“
Hook
s”误导了我,我以为又是一个可以 用来注入
DLL
的不错
函数
,用OD反出来一看,原来只是个局部
HOOK
而已。虽然没太大用,还 是一并写上吧,也许谁用得着呢。InitializeLpk
Hook
s顾名思义就是
HOOK
LPK的,Windows 有个lpk.
dll
,就是支持多语言包的那么个功能。测试发现好多程序在TextOut之前似乎是要 调用lpk.
dll
里面的相关
函数
的,可能是支持多语言的程序就需要用这个来判断到底要显示 那种语言吧。而InitializeLpk
Hook
s,就是用来
HOOK
lpk.
dll
里面的4个
函数
的,这4个
函数
是LpkTabbedTextOut,LpkPSMTextOut,LpkDrawTextEx,LpkEditControl。我们先打开VB, 在窗体
中
加入以下代码吧: Private Sub Form_Load()
DLL
hwnd = LoadLibrary("lpk.
dll
") '加载
DLL
DLL
FunDre = GetProcAddress(
DLL
hwnd, "LpkDrawTextEx") '获取回调
函数
地址 Lpk
Hook
sInfo.lp
Hook
Proc_LpkTabbedTextOut = 0 Lpk
Hook
sInfo.lp
Hook
Proc_LpkPSMTextOut = 0 Lpk
Hook
sInfo.lp
Hook
Proc_LpkDrawTextEx = GetLocalProcAdress(AddressOf
Hook
Proc1) '设置要
HOOK
的LPK
函数
Lpk
Hook
sInfo.lp
Hook
Proc_LpkEditControl = 0 InitializeLpk
Hook
s Lpk
Hook
sInfo End Sub Private Sub Form_Unload(Cancel As Integer) Lpk
Hook
sInfo.lp
Hook
Proc_LpkTabbedTextOut = 0 Lpk
Hook
sInfo.lp
Hook
Proc_LpkPSMTextOut = 0 Lpk
Hook
sInfo.lp
Hook
Proc_LpkDrawTextEx =
DLL
FunDre Lpk
Hook
sInfo.lp
Hook
Proc_LpkEditControl = 0 InitializeLpk
Hook
s Lpk
Hook
sInfo FreeLibrary
DLL
hwnd End Sub 然后新建一个模块,在模块
中
加入以下代码: Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long ' ----------------未公开
函数
-------------------------------------- Public Declare Sub InitializeLpk
Hook
s Lib "user32" (lpProcType As Any) Type Lpk
Hook
sSetting lp
Hook
Proc_LpkTabbedTextOut As Long lp
Hook
Proc_LpkPSMTextOut As Long lp
Hook
Proc_LpkDrawTextEx As Long lp
Hook
Proc_LpkEditControl As Long End Type ' ------------------------------- Public
DLL
hwnd As Long,
DLL
FunDre As Long Public Lpk
Hook
sInfo As Lpk
Hook
sSetting Public Function GetLocalProcAdress(ByVal lpProc As Long) As Long GetLocalProcAdress = lpProc End Function Function
Hook
Proc1(ByVal a1 As Long, ByVal a2 As Long, ByVal a3 As Long, ByVal a4 As Long, ByVal a5 As Long, ByVal a6 As Long, ByVal a7 As Long, ByVal a8 As Long, ByVal a9 As Long, ByVal a10 As Long) As Long
Hook
Proc1 = 0 End Function 运行一下看看,是不是窗体
中
标题栏和按钮上的文字都没有了,因为我们把
函数
LpkDrawTextEx替换成自己的
函数
Hook
Proc1了。这个
函数
有10个参数,其
中
几个好像是字符 串指针,似乎可以用来截获窗体要显示的文字,然后改成另一种语言的文字,我猜想,也许 就是这个用途吧。哈哈,纯属猜测。以上就是
函数
InitializeLpk
Hook
s的用法了。 以上就是全部。 本文所有示例代码的下载地址是: http://www.pen88.com/download/ime
hook
.rar 我的QQ511795070,欢迎交流。
AheadLib x86 + x64两个版本
AheadLib是一款功能强大的pe工具箱,这款软件绿色小巧、使用方便快捷,主要是用来生成特洛伊
DLL
,用于分析
DLL
中
的
函数
参数调用(比如记录Socket send了什么等等)、更改
函数
功能、更改界面功能(比如在
Hook
里面生成一个按钮,截获事件等等)。 软件说明 1.用 AheadLib 打开要模拟的
DLL
,生成一个 CPP 文件。 2.用 Visual Studio 6.0/.NET 建立一个
DLL
工程,把这个 CPP 文件加入到项目
中
。 3.使用 Release 方式编译,生成的
DLL
将和原来的
DLL
具有一模一样的
导出
函数
,并且能顺利把这些
函数
转发到原来的
函数
中
。 4.AheadLib 还可以生成
Hook
代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。
AheadLib源代码
一、简介 AheadLib 是用来生成一个特洛伊
DLL
的工具,用于分析
DLL
中
的
函数
参数调用(比如记录Socket send了什么等等)、更改
函数
功能(随心所欲了:)、更改界面功能(比如在
Hook
里面生成一个按钮,截获事件等等)。 二、使用 1.用 AheadLib 打开要模拟的
DLL
,生成一个 CPP 文件。 2.用 Visual Studio 6.0/.NET 建立一个
DLL
工程,把这个 CPP 文件加入到项目
中
。 3.使用 Release 方式编译,生成的
DLL
将和原来的
DLL
具有一模一样的
导出
函数
,并且能顺利把这些
函数
转发到原来的
函数
中
。 4.AheadLib 还可以生成
Hook
代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注 1.如果
导出
函数
过多,在 Visual Studio 6.0
中
,如果出现编译错误,请在项目属性关闭与编译头功能。 2.如果是 C++ 、C __stdcall、C __fastcall 的方式
导出
的话,生成的
函数
声明将会还原成原代码级别(可能需要修改才能编译,比如
导出
C++类的情况)。此时使用 __declspec(
dll
export)
导出
——不能指定
导出
序号。 3.如果是 NONAME 或者 C _CDECL 方式
导出
(比如 DEF
导出
,大多数Windows
DLL
都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)
导出
,且指定
导出
序号。 4.如果系统
中
没有 DbgHelp.
dll
,将无法识别 C++ 模式的
导出
。 主页:http://Yonsm.reg365.com 邮件:Yonsm@163.com 源码:如果需要,请访问作者主页
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章