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 ...
随机推荐
- JDK与Tomcat的联系
如果服务器没有安装JDK或没有配置JDK环境变量,则Tomcat启动出错 报错:需要JAVA_HOME 或JRE_HOME环境变量 所以必须首先安装JDK 配置环境变量 web服务器Tomcat才能运 ...
- Shell 控制并发
方法1: #!/bin/bash c=0 for i in `seq -w 18 31`;do while [ $c -ge 3 ];do c=$(jobs -p |wc -w) sleep 1s d ...
- CodeFirst中DB保存时报错:对一个或多个实体的验证失败。
错误提示如下: 开始以为有字段可能没有添加数据,可是检查了很久,仍然没有任何头绪. 后使用DbEntityValidationException进行调试,问题才得以解决
- hbase 0.96 单机伪分布式配置文件及遇到的问题 find命令
http://www.apache.org/dyn/closer.cgi/hbase/ 国外的站点下载速度慢,可以考虑国内的镜像网站~ 前面已经部署好了hadoop2.2.0单机伪分布式.必须先安装h ...
- [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...
- [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...
- JavaScript的应用
DOM, BOM, XMLHttpRequest, Framework, Tool (Functionality) Performance (Caching, Combine, Minify, JSL ...
- 辉哥用的这种方法实现ZABBIX的MYSQL批量监控
不错的.集中和分布式,总是一对要解决的问题.应该可以再想更好的策略~~ 一.方案需求及思路 因跑MySQL服务的服务器比较多,并且每台服务器可能会运行多个不同端口的数据库,如果单独手动一台一台去修改a ...
- VS2012中使用编译的Qt-5.1.1静态库开发程序
1. 安装qt-vs-addin-1.2.2-opensource.exe,安装之后,vs2012菜单栏就会出现QT5菜单. 2. 在qt-vs-addin添加Qt5静态库: QT5->Qt O ...
- struts2 Convention插件零配置,使用注解开发
从struts21开始,struts2不再推荐使用codebehind作为零配置插件,而是改用Convention插件来支持零配置.与以前相比较,Convention插件更彻底. 使用Conventi ...