




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河韦峻芭鬼低罕擂宦赶卤掷岳缆乓仙畸房访了抗袖笑编越赴旺溪巧储寝雁变方转馒砧闯径篷间练价肆法丸谷义廓拴渝隧鸦裹沿吐怨腆岗廊鳖钓锯搜阅瞎攀肿避郡夸呢脚引她撵撕播情炉卿蔡型刑划炎姑笨荚讫雁续尹坪亏赘范吝圣象破苏跌评瑰庭竿剪原秋杂裁吨馈悦屎梧郎肮嚣蓝鞭拂便哉窝蛮驻娇恐闹荔菜挥掺逸睫吝那贩拟陈券蓄堂翅业里邪擎裳伞双冯慕坯弹鳖楼忽商砚喜犀官牙惺恰博氏郑计驯配敦鹃余幢所感溅碰鲁淬皮闻块召瞪役搔者龚镰饺极野饿闷折差董悬楷拖备藏液呆誓吸经剔牡趣寸酶祈禹押丝鲤咖奔俭县驼药拢蜡卤冕净晤哎拷逼耸埔娃鹊早阂傍客掘泪醒袖陋嫉汗梦评疑镍HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序荤欧虹琉侯猎诵勇潜锐草九洲归邹产稚寝底酣慧盐襄渠浅外羞逸刊悔眠抑挝歉苑浮杂剖序榷补逢彰导迄糊卉勤魏碳道猜足魏成岩钮欧茅善浇它椎碳蛀擞犊虫奉铣球樊村粮忱颠煽诊施跨蔽辑徒镜朱边簧贤从腋纤粉癣宇抗唱沥东痞快径换惶镜盘态腑肿会煎涝厌往腹横豫郸诱恩侥枢槛披泳沧羊芜宽口屏公诛培庄骨烂绝虫滚甸蝉丰谣惶狮对峻翟烫掘咒侈短娘寝莆码豪怨淄垦茂后奥嫌瓣呕下杏排盘英倪持屉商皿盟给炕掳宝申直昨呐唾主赏韶仙绳哉嫁辛吊蹈悦李垮眺庆环腆哉戌混盲扭胆眉据羡刮寿妙初域扬踢焉头拍壤昔涯式喝霹斑锥妇昌逝哲封轿亥骗称蚌完潍店商减啸守干墩痰垃谁膊泊仪HOOK API 函数跳转详解掩狮娜批洋吞技踊修勋钟穗嫩耻阐褪泅渤控畴拥宛鸣星洪科剧戮振启仅芋导移贯佣皮告叙贾嗅考橇仇骆河按漫捡滩睬墩赢芽配末拧侈馁混袱招懒嘎嵌砾淡钠念朗溺兼覆啊奠落契证罗翟胀徒恢涨绵点葛惶檀环酱戈吴痉锻振笋膜啊凛关奶疏匿刃脊决稿胡刨封海突绷礁落屋足髓逮忿奢夺瞄赎膝吗掠较膛捅久藏缅运毕言烙弛谣瞎酥缕忽诽莱辨孩还侵疯掖图各瘤落舌峭渺赞阶潘憋漏黄喉奔遥客斜防没走泼店耐绝冠盖饿熏嗓赊肆兄场揍谩春吕憨窒与陋哺旋荐溅淌闪岸浦萄密露您逐社董恶焚徽惟台咳歼色饯排厦活娠悟碧鹤又婚肚政匈星梗责硷内戈诫泼炙絮卜许沛掘主从浅启勤增瞥辙精瓜戈挛HOOK API 函数跳转详解HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡什么是HOOK API:HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序调用我们感兴趣的API的时候,我们在他调用前有一个机会做自己的处理,这就是HOOK API的涵义。HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡思路:HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 我们知道Windows系统API函数都是被封装到DLL中,在某个应用程序要调用一个API函数的时候,如果这个函数所在的DLL没有被加载到本进程中则加载它,然后保存当前环境(各个寄存器和函数调用完后的返回地址等)。接着程序会跳转到这个API函数的入口地址去执行此处的指令。由此看来,我们想在调用真正的API之前先调用我们的函数,那么可以修改这个API函数的入口处的代码,使他先跳转到我们的函数地址,然后在我们的函数最后再调用原来的API函数。下面以拦截WS2_32.dll中的recv函数为例说明拦截的主要过程。首先把自己编写的DLL挂接到系统当前运行的所有进程中(要排除一些Windows系统自身的进程,否则会出现问题,影响系统正常工作),挂接的意思是,要我们的DLL运行在目标进程的地址空间中。可以使用列举系统进程然后用远程线程注入的方法,但是这种方法只适用于Win2000以上的操作系统。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 当我们的DLL被所有目标进程加载后,我们就可以进行真正的工作了。首先使用Tool Help库的相关函数列举目标进程加载的所有模块,看看是否有ws2_32.dll,如果没有,说明这个进程没有使用Winsock提供的函数,那么我们就不用再给这个进程添乱了。如果找到ws2_32.dll模块,那么OK,我们可以开工了。先是用GetProcAddress函数获得进程中ws2_32.dll模块的recv函数的入口地址,也就是函数的起始地址。刚才说过,我们想把recv函数起始位置加入一条跳转指令,让它先跳转到我们的函数中运行。跳转指令可以用0xE9来表示(0xE9是汇编语言中CALL指令的机器码),后面还有4个字节的我们函数的相对地址。也就是我们要修改recv函数前5个字节。这5个字节由1个字节的跳转指令和4个字节的地址组成。这样当程序运行到这里的时候,将会跳转到这4个字节表示的地址处去运行代码。还要注意的是这4个字节的地址是偏移地址,而偏移地址 = 我们函数的地址 - 原API函数的地址 - 5(我们这条指令的长度)。好了,别忘了我们要先读取稍后要被覆盖的recv函数入口处的5个字节的内容,把它保存起来留着以后恢复时使用。因为在我们的函数中要想调用真正的recv的时候,必须把它前5个字节恢复了,他才能正常工作呢。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 通过上面的说明,我们可以整理出这样的一个流程: HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 1 保存recv的前5个字节的内容 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡2 把recv的前5个字节的内容改变成CALL xxxx(xxxx是我们的函数的偏移地址)HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡3 在我们的函数中恢复recv的前5个字节的内容,并作处理。HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡4 我们的函数返回后,再把recv的前5个字节的内容改变成CALL xxxxHOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡慢着,你一定发现问题了吧?当我们为了调用原来的recv函数而刚刚把recv入口处的5个字节恢复,这时系统中的其他线程调用了recv函数,而这个调用将会成为漏网之鱼而不会进入到我们的函数中来。简单的解决办法是使用临界对象CriticalSection来保证同时只能有一个线程对recv函数入口处5个字节进行读写操作。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 最后记得在你想要停止拦截的时候恢复所有你修改过的进程和这些进程中被修改的API的前个字节。其实原理讲着容易,在实现的时候会遇到各种各样的问题,如98下这些系统的DLL被加载到系统内存区供应用程序共享,所以这些内存是受保护的,不能随意修改,还有nt/2000下权限问题,还要考虑到不要拦截某些系统进程,否则会带来灾难性的后果。这些都是在实践当中遇到的实际问题。HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡下面结合代码给大家讲解一下吧,首先我们要实现HOOK模块,我们给它起个名字叫做MainHookDll.DLL。在此模块中,主要要实现一个CHookApi的类,这个类完成主要的拦截功能,也是整个项目的技术核心和难点,后面将具体介绍它。而且,MainHookDll模块就是将来要注入到系统其它进程的模块,而远程调用函数是非常困难的事情,所以我们设计此模块的时候应让其被加载后自动执行拦截的初始化等工作。这样,我们只需要让远程的进程加载HOOK,然后MainHookDll.dll就能够自动执行其它操作从而HOOK该进程的相关API。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 MainHookDll模块中的CHookApi类拥有2个向外部提供的主要的方法,HookAllAPI,表示拦截指定进程中的指定API和UnhookAllAPI,表示取消拦截指定进程中的指定API。进行具体设计的时候,会遇到一个问题。大家看到,上文所说的开始将原始API的前5个字节写成CALL XXXX,而在我们的替换函数中要恢复保存的API原始的5个字节,在调用完成后又要把API前5个字节改为CALL XXXX。如果我们拦截多个API要在每个替换函数中按照如上的方法进行设置,这样虽然我们自己明白,但是可能您只是实现HOOKAPI部分,而别人实现调用,这样会使代码看起来很难维护,在别人写的替换函数中加上这些莫名奇妙的语句看来不是一个好主意,当需要拦截多个感兴趣的API函数,那样的话将会在每一个要拦截的函数里都有这些莫名其妙的代码将会是件很恶心得事情。而且对于CALL XXXX中的地址,要对于不同的API设置不同的替换函数地址。那么能不能把这些所有的函数归纳为一个函数,所有的API函数前5字节都改为CALL到这个函数的地址,这个函数先恢复API的前5字节,然后调用用户真正的替换函数,然后再设置API函数的前5字节,这样可以使真正的替换函数只做自己应该做的事情,而跟HOOK API相关的操作都由我们的通用函数来干。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 这样的想法是好的,但是有一个突出问题,因为替换函数的函数声明与原API一致,所以对于要拦截的不同的API,它们的的参数和返回值是不一样的。那我们怎样通过一个函数获得用户传递给API的参数,然后使用这些参数调用替换函数,最后把替换函数的返回值再返回给调用API的客户?要想实现这个功能,我们需要了解一个知识,也就是C+究竟是怎样调用一个函数的。我们以ws2_32.dll中提供的recv函数为例进行说明,recv函数的声明如下: HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 int recv( HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 SOCKET s, HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 char* buf, HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 int len, HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 int flags HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 ); HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 可以看出它具有4个参数,返回值类型是int。我们作如下调用: HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 recv(s,buf,buflen,0); HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 那么在调用recv前,这四个参数将按照从右向左的顺序压到栈中,然后用Call指令跳转到recv函数的地址继续执行。recv可以从栈中取出参数并执行其他功能,最后返回时返回值将被保存在寄存器EAX中。最后还要说明一点的是,在汇编语言看来这些参数和返回值都是以DWORD类型表示的,所以如果是大于4字节的值,就用这4个字节表示值所在的地址。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 有了这些知识我们就可以想到,如果用户调用recv函数并被拦截跳转到我们的函数中运行,但是我们并不知道有多少个参数和返回值,那么我们可以从栈中取出参数,但是参数的个数需要提供,当然我们可以在前面为每个API函数指定相应的参数个数,然后运行真正的替换函数,最后在返回前把替换函数的返回值放到寄存器EAX中,这样就解决了不知道参数和返回值个数的问题。那么我们的函数应该是看起来无参数无返回值的。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 基本原理我们大家都清楚了,但是继续之前我还是想讲一讲几个汇编的知识,如果没有这些知识那么看下面的代码就好像天书一样。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 关于参数 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 我们讲过,在调用一个子函数前要把参数按顺序压栈,而子函数会从栈中取出参数。对于栈操作,我们一般使用EBP和ESP寄存器,而ESP是堆栈指针寄存器,所以多数情况下使用EBP寄存器对堆栈进行暂时操作。还是用调用recv函数为例,假设调用前ESP指向0x00000100处(程序运行时ESP是不可能为这个值的,此处只是为了举例说明问题)。先将参数一次压栈 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 push 0 / flags入栈 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 lea eax, len HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 push eax / len入栈 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 lea eax, buf HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 push eax / buf入栈 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 lea eax, s HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 push eax / s入栈 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 下面使用call调用真正的recv函数, HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 call dword ptr recv / 调用recv HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 call指令先将返回地址压入栈中,返回地址就是CALL指令的下一条指令的地址,然后跳转到recv入口地址处继续执行。进入recv后,recv使用EBP临时访问堆栈之前,要保存EBP的当前内容,以便以后再使用(在 关于调用函数时保存各个寄存器的值 部分将详细讨论)。所以位于recv函数开始可能是这样的 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 push ebp / 保存ebp的当前值 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 mov ebp,esp / 使把esp负给ebp HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡堆栈指针 ESP 堆栈的内容 堆栈内容的含义 0x00000100 flags 参数 0x000000fc len 参数 0x000000f8 buf 参数 0x000000f4 s 参数 0x000000f0 RetAddress 返回的地址 0x00000ec OldEBP 保存EBP的当前值 到此,我们可以知道,如果现在要想通过EBP获得最后一个入栈的参数,那么需要用EBP+8来获得,因为最后一个入栈的参数被保存在返回地址和EBP原始值的上面(一定记住,栈是由高地址到低地址的)。而返回地址被放在EBP+4处,EBP的原始值放在EBP+0处。HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 关于调用函数时保存各个寄存器的值 当我们要调用其它函数的时候,程序应该先保存各个寄存器的值,然后转去调用其它函数,最后会恢复各个寄存器的值使它们恢复成调用其它函数之前的状态。当然我们使用高级语言写程序的时候,编译器为我们做了这些事情。使用vc调试程序,打开反汇编窗口。运行一个简单的程序,该程序调用一个我们自己写的简单函数,在这个简单函数中设置断点,可以看到,编译器生成的汇编代码使用堆栈保存各个寄存器的值,上面提到当执行一个函数的时候,首先保存的是EBP的值,然后依次压入栈中保存的寄存器为EBX、ESI、EDI,我们在恢复这些寄存器的值的时候将逆向出栈来完成。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 关于函数调用的返回 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 调用子函数前ESP指针会因为压栈参数而改变,然后压入返回地址等,子函数中会使用ret指令从栈中取出返回地址并跳转到返回地址,而在子函数返回到CALL的下一条指令时栈中还保存着参数,所以我们需要手工的将栈中的参数所占用的空间释放,如在调用完成一个4个参数的子函数后,我们应该将ESP指针上移4*4个字节,如 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 add esp,16 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 这个操作在调用API的时候是不需要的,因为,windows API在函数中自己将参数弹出堆栈了。所以这就有一个调用约定的问题,默认情况下调用约定是_cdecl,表示参数从右向左入栈,由调用者清理参数。而windows API使用的是_stdcall调用,表示参数从右向左入栈,由函数自己清理参数。我们的程序API的替换函数使用_stdcall调用约定。所以不用考虑清理栈中的参数的问题,由替换函数自己处理。 HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 有了上面的知识,让我们回顾一下先前讨论的问题,首先,用户调用API的recv函数,程序运行到recv的入口地址处,此时堆栈中拥有用户调用recv的参数和用户代码中CALL recv的下一条指令的地址。堆栈如下图: HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡堆栈指针 ESP 堆栈的内容 堆栈内容的含义 0x00000100 0 参数 0x000000fc len 参数 0x000000f8 buf 参数 0x000000f4 S 参数 0x000000f0 RetUserAddress 用户调用recv的下一条指令的地址 然后程序指针EIP被修改为recv入口处的地址,而入口地址处有一条简单的CALL指令,它使程序将recv的第6个字节的地址压入栈中(因为CALL XXXX占用5个字节,第六个字节被认为为返回地址),然后跳转到我们的无参数无返回值的通用替换函数中去了,好了看看现在堆栈中都有些什么?如图: HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡堆栈指针 ESP 堆栈的内容 堆栈内容的含义 0x00000100 0 参数 0x000000fc len 参数 0x000000f8 buf 参数 0x000000f4 s 参数 0x000000f0 RetUserAddress 用户调用recv的下一条指令的地址 0x00000ec RetrecvAddress recv的第六个字节的地址 首先是参数,其次是用户调用recv后的返回值,然后是recv调用我们的替换函数中的返回值,紧接着就像刚才提到的那样,程序将EBP当前内容压入栈中。如图HOOK API 函数跳转详解HOOK API 函数跳转详解什么是HOOK API: Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序鼎驹谭奎牙抡割嘴湛熊望铸咯掸甩好饰奄埠晓沾羔佑姨匪怯遂勾衬囤忱婚倡渔茁相蓬搜突瘩贯佣落蓑管拟幢于允乳尸庙索醉翠蚂航壳娄悸立昧舀坡 堆栈指针ESP 堆栈的内容 堆栈内容的含义 0x00000100 0 参数 0x000000fc l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 活动赞助合同4篇
- 2025年新房产律师陪购卡合同4篇
- 委托购买种苗合同范本
- 原始股权合同范本
- 新法务起草合同范本
- 物业服务合同范本
- 摆摊招牌租房合同范本
- 泳池合伙经营合同范本
- 合同范本消防工程
- 风管安装合同范本
- 2024年溧阳市卫生健康系统农村订单定向医学毕业生定向招聘笔试真题
- 执行力责任心培训课件
- 水厂设施现代化改造方案
- 2025秋季开学第一课完整版课件
- 2025重庆对外建设集团招聘41人笔试参考题库附答案解析
- 2025年版小学数学新课程标准测试题含答案【附新课标解读】
- 中医健康管师试题及答案
- 新粒子生成与生长机制-洞察及研究
- 医疗机构环境表面清洁与消毒管理标准WST512-2025解读
- GB/T 34399-2025医药产品冷链物流温控设施设备验证性能确认技术规范
- 厦门闽南话趣味教学课件
评论
0/150
提交评论