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研究结果备忘的更多相关文章

  1. 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因

    近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...

  2. get_template_part() 函数详解备忘(转)

    最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_par ...

  3. 备忘:移植ucos-III到stm32f103c8t6

    由于本人对linux系统内核这块比较感兴趣,下一份工作想做linux驱动相关的:于是最近一旦有空都在研究linux内核源码,面对linux内核这个庞然大物,越看越觉得不能太过急躁,且由于还要工作,只能 ...

  4. sublime 常用快捷键备忘

    转一篇sublime常用的快捷键备忘 sublime常用快捷键 选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本 ...

  5. 【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 ...

  6. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  7. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  8. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  9. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

随机推荐

  1. photoshop cc 版本安装失败解决办法

    好久没有碰ps,看了下在ps版本都到cc了.忍不住也想尝试最新版本,但是安装出现了很多问题,导致我花了很多时间才搞定,现在分享给大家几点经验吧. Exit Code: Please see speci ...

  2. javascript获取div高度

    DOM的: 获得了div的高度值 = document.getElementById("目标id").offsetHeight;

  3. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  4. Idea设置自动导包

    默认 IntelliJ IDEA 是没有开启自动 import 包的功能.  勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包 ...

  5. DOMContentLoaded vs onload

    http://ie.microsoft.com/testdrive/HTML5/DOMContentLoaded/Default.html The DOMContentLoaded event fir ...

  6. iOS Developer Libray (中文版)-- Defining Classes 定义类

    该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...

  7. H3C S5500上层接路由,VLAN IP作网站配置实例

    # version 5.20, Release 2208 # sysname S5500-1 # clock timezone #Web#8#01 add 08:00:00 # super passw ...

  8. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  9. WM_SIZE和WM_MOVE的函数体内容为什么不一样?

    搞不懂,要想一想- procedure TWinControl.WMSize(var Message: TWMSize); begin UpdateBounds; // 类函数 inherited; ...

  10. HDU 2255 奔小康赚大钱

    题目分析:这个是个KM的模板题. #include<stdio.h> #include<string.h> #include<algorithm> #include ...