hook研究结果备忘
hook研究结果:
最近一周时间仔细研究了一下hook,也许不能称之为研究吧。顶多是让别人的思想拿过来抄袭一遍而已,写点结果也算对得起自己的这几天的苦心了。
1,首先从同事旁边听到了hook,然后看的第一篇文章来自于http://hi.baidu.com/supko/item/9ae475f2eef2bdd042c36a6d钩子与DLL注入技术简单了解了hook
2,我起步开始想直接hook其他的进程,于是又关注了如何将自己的dll注入到其他的进程中。
注入方法:通过remotetest.exe将dllremote.dll注入到dlltest.exe
1,先将自己的注入进程remotetest.exe提升到debug权限。主要方法名OpenProcessToken
2,通过dlltest.exe进程名字查找它的进程id,系统快照遍历方式。主要方法名CreateToolhelp32Snapshot
2,打开dlltest.exe的进程id,然后给此进程分配一个字符串空间,空间大小为dllremote.dll,然后将此字符串内存设置为dllremote.dll,通过GetProcAddress获得LoadLibrary的函数地址。通过createremotethread方法将线程的方法设置为LoadLibrary的地址,将线程的参数设置为刚才分配的字符串空间地址。这样当线程执行的时候就会自动载入dllremote.dll到dlltest.exe. 主要方法有:OpenProcess,VirtualAllocEx, WriteProcessMemory, CreateRemoteThread.
总结一下:
基本就是先将自己的权限提升,然后再dlltest.exe的进程空间分配一个字符串的空间,赋值为要注入的dll的名字dllremote.dll,然后通过createremotethread在dlltest.exe的地址空间创建一个线程,线程的参数为dll的名字的地址。这样实际上就是强制要dlltest.exe干点其他的活,而且干的是LoadLibrary的活,之所以要使用特别方式分配字符串空间存放dllremote.dll,那是因为LoadLibrary是dlltest.exe执行,在它的地址空间里,于是分配一个字符串也要在它的地址空间里。通过这种方式可以让一个运行着的进程加载一个你想加载的dll,于是我们就可以在我们自己的dllremote.dll做一些工作了,这个相当于是dlltest.exe自己主动加载的,是在dlltest.exe地址空间里,一切活动都如这一个程序中操作一样。
3,有了上面的过程dllremote.dll的注入是可以了。为了测试我在dlltest.exe中加载一个dllhello.dll,dllhello.dll只有一个函数,HelloWorld,c函数。打印字符串HelloWorld。dlltest.exe载入了dllhello.dll而且通过GetProcAddr获取了HelloWorld的地址,执行了HelloWorld,还执行了MessageBox函数。这两个函数再一个while循环中不断执行。
dlltest.exe代码简略如下,主要是为了理解:
while (1)
{
Sleep(2000);
(*HelloWorld)();//HelloWorld为函数指针,指向GetProcAddress得到的Helloworld的地址
MessageBoxA(NULL, "how are you", "demo", 0);
}
再来描述dllremote.dll,它被载入之时会自动进入DllMain函数,我在这个DLL_PROCESS_ATTACH case中启动一个线程干自己的活。
线程函数干的活是想替换MessageBoxA的地址为dllremote.dll一个自己的函数地址,这样当dlltest.exe调用MessageBoxA后,首先调用的是我的自己的函数,等自己的函数执行完毕结束之前,我再调用一次真正的MessageBoxA函数。
对于MessageBoxA的这种调用方式,我通过IAT hook方式可以hook成功。主要思路是遍历当前进程的iat表,通过函数名字MessageBoxA找到这个函数的地址,然后替换为自己的函数地址,仅此而已,在自己的函数里面打印一些东西后,再调用之前的函数。具体还是请参见网上相关东西,他们比我nb多了。不过IAT hook方式对上面的HelloWorld不起作用,遍历当前进程根本找不到dllhello.dll。比较郁闷。于是又学习了inline hook方式,我也不知道具体叫什么,看很多人这样叫。简单思想就是替换原来HelloWorld的指令集。具体介绍如下:
1,简单做法:
将HelloWorld的函数的前5个字节取出,替换成一条跳转指令,跳转到自己的HelloWorldProxy函数中,在自己的HelloWorldProxy中做完自己的操作后,再将HelloWorld的前5个字节纠正回来,再字节调用HelloWorld函数,调用完毕后,再将其改变为跳转指令,等待dlltest.exe的下一次调用。
这样很容易想到会遇到多线程的问题,不过这个处理起来简单,不失为测试的简单玩意。
2,复杂一点的做法:
将HelloWorld的前几个字节取出,必须是完整的指令,一定要大于5个字节。将其前5个字节改变为跳转指令,跳转到自己的函数中,同时申请一个buff缓冲区,将取出来的完整指令保存下来,然后再buff后加一条跳转指令,再跳转回真正的HelloWorld函数的后面位置(即取出来的指令后面的位置)。然后在自己的函数中做完操作后,将上面的buff强转为函数,调用.这样它就会继续执行HelloWorld的前几条指令,然后会执行到跳转指令,跳转到真正的HelloWorld后面一点的位置,继续HelloWorld的执行.这种方式比较完美,但是我没能做到,总是AccessFailed等等程序崩溃。要注意的是如果HelloWorld取出来的前几条指令有跳转指令,取地址指令等等的话,需要考虑要将地址转换为你在HelloWorldProxy中执行时候的相对地址,主要是因为HelloWorld中指令是相对于HelloWorld函数执行时候的地址而言的,你现在在HelloWorldProxy中,那个地址就会有变化的。如果有谁将这种方式实现的话,请告诉我一下,非常感谢,我测试研究了几天,也没能有所突破。
hook研究结果备忘的更多相关文章
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
- get_template_part() 函数详解备忘(转)
最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_par ...
- 备忘:移植ucos-III到stm32f103c8t6
由于本人对linux系统内核这块比较感兴趣,下一份工作想做linux驱动相关的:于是最近一旦有空都在研究linux内核源码,面对linux内核这个庞然大物,越看越觉得不能太过急躁,且由于还要工作,只能 ...
- sublime 常用快捷键备忘
转一篇sublime常用的快捷键备忘 sublime常用快捷键 选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本 ...
- 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘
[C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
随机推荐
- 修改原代码定制bootstrap
1.下载对应的Bootstarap和node.js 注:less文件夹中包含了bootstrap中所有样式组件的less源代码: dist保存编译后的css和js等文件 2.命令行输入npm inst ...
- easyui tab 加载iframe 高度问题
其实按网上搜的结果,easyui 有个data-options属性是fit:true. 加上他之后会使得自适应父类的宽高. 加上之后,发现个问题,当刷新tab内容的时候高度是对的,但是新建tab的时候 ...
- ecshop--加载初始化文件
define('IN_ECS', true);require(dirname(__FILE__) . '/../../includes/init.php'); 在开头要加入这两句文件才可以访问数据库以 ...
- ecshop数据表
ecs_account_log:账户变动日志(注册用户充值.支付等记录信息) ecs_ad:广告表 ecs_admin_action:管理员权限表(定义了128项功能操作) ecs_admin_log ...
- IS打包
1. 目的 让用户可以通过运行一个安装程序,安装程序到系统中正常运行. 2. 注意 当我们用项目向导生成的新项目时,InstallShield只为我们生成两个事件,分别是OnFirstUIBefore ...
- 同步异步GET和POST请求
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...
- Ajax 的同步与异步
1.Ajax的工作原理如图: 2.同步 XMLHttpRequest 对象用于和服务器交换数据. XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参 ...
- Dungeons and Candies
Zepto Code Rush 2014:http://codeforces.com/problemset/problem/436/C 题意:k个点,每个点都是一个n * m的char型矩阵.对与每个 ...
- hdu 5150 Sit sit sit
http://acm.hdu.edu.cn/showproblem.php?pid=5151 直接判断是不是素数,然后再注意1就行. #include <cstdio> #include ...
- java中的string字符串中的trim函数的作用
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...