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. 关于css float 属性以及position:absolute 的区别。

    1.float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动.浮动元素会生成一个块级框,而不论它本身是何种元素.div一个典型的块 ...

  2. 认识Web和HTTP

    一:了解Web.   首先,Web应用的产生起源于1989年,当时CERN(欧洲核子研究组织)的蒂姆·伯纳斯-李(Time BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想.借 ...

  3. Typefaces and Personalities (字体与性格)

    Boring afternoon, searching something fun. See this article What Your Favorite Font Says About You , ...

  4. 传值 UI考试知识点

    传值: 1. 属性传值:从前往后 2. 代理传值:从后往前 3. block: 4. 单例:普通写法和GCD写法 5 . 通知 NSNotification GCD 单例: static PlayMu ...

  5. refreshcontrol 实现下拉刷新的功能

    该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...

  6. WebApp 中用 hashchange 做路由解析

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

  8. SharePoint ListTemplateType enumeration

    from microsoft http://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.listtempla ...

  9. delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)

    http://topic.csdn.net/t/20020104/09/456913.html CM_MouseLeave消息好象不太灵敏,当鼠标快速移出窗体时,就收不到这个消息,请问大家有什么好办法 ...

  10. 【最短路】Vijos P1022Victoria的舞会2

    题目链接: https://vijos.org/p/1022 题目大意: 给一张N个点的有向图,求有几块强连通分量.(N<=200) 题目思路: [动态规划] n比较小,可以用floyd暴力把每 ...