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 ...
随机推荐
- 【JQuery学习历程】2.JQuery选择器
基本选择器 选择器 描述 返回 示例 #id 根据给定的id匹配元素 单个元素 $("#myId") .class 根据给定的class类匹配元素 集合元素 $(".my ...
- 在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心
最近两天有个lufylegend游戏引擎群的群友需要做一个项目,其中要解决的需求是:获取照相机拍摄的图片,根据图片的EXIF信息让图片显示为“正常”情况,并且需要给图片添加一些事件侦听.何为正常呢?就 ...
- dedecms织梦导航栏二级菜单的实现方法
dede导航下拉菜单,一级栏目增加二级下拉菜单 使用dedecms5.6——5.7 将这段代码贴到templets\default\head.htm文件里<!-- //二级子类下拉菜单,考虑 ...
- PHP面向对象(OOP):__toString()方法
我们前面说过在类里面声明“__”开始的方法名的方法(PHP给我们提供的),都是在某一时刻不同情况下自动调用执行的方 法,“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动 ...
- ios CAF音频转换为MP3
Url:http://blog.csdn.net/ysy441088327/article/details/7392842#reply 为了达到 iPhone 与 Android 实现音频互通. 那么 ...
- Zephyr-MQTT
Zephyr OS 支持MQTT协议,其源码目录在: # cd /zephyr-/samples/net/paho_mqtt_clients/publisher/ # cd /zephyr-1.5.0 ...
- Node.js回调概念
什么是回调? 回调是一个异步等效的功能.在完成特定任务回调函数被调用. Node大量使用了回调.Node的所有的API都支持回调这样的一种方式. 例如,一个函数读取一个文件可能开始读取文件,并使得下一 ...
- cf E. Fox and Card Game
http://codeforces.com/contest/389/problem/E 题意:给你n个序列,然后两个人x,y,两个人玩游戏,x从序列的前面取,y从序列的后面取,两个人都想自己得到的数的 ...
- 微控制器(MCU)架构介绍
微控制器(MicroController)又可简称MCU或μC,也有人称为单芯片微控制器(Single Chip Microcontroller),将ROM.RAM.CPU.I/O集合在同一个芯片中, ...
- mysql explain 解释
就是10W记录比如全表返回1行 Mysql显示可能是10W oracle是1行 mysql 是预估需要扫描的记录 Oracle 是预估返回的记录