VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 5865|回复: 8

[技术文章] VC实现【API钩取】【调试法】附加调试器

[复制链接] share分享到朋友圈
001
47_avatar_middle
online_member Miss丿小沫 发表于 2016-7-16 19:53:06 | 显示全部楼层 |阅读模式
最近在学习逆向核心,在论坛也发了几篇帖子说说自己的经验,帮助自己巩固知识,也方便了大家。
如果帖子中有什么疏漏甚至不对的地方,请大牛们指出,我会积极改正的!VC实现【API钩取】【调试法】附加调试器
废话不多说,还是我【Miss丿小沫】,上教程!
-----------------------------------------------------------------------------------------------------
我在DLL注入里面也提到了API钩取这一概念,涉及的知识点比较多,也上了难度,我准备细致的介绍,讲解。
我能力有限,如果有错误的地方,欢迎大家指正!
-----------------------------------------------------------------------------------------------------
钩取(Hook)是一种截取信息(比如SetWindowsHook()获取键盘记录),更改程序执行流,添加新功能(DLL注入)的技术。
列一下流程:
①:使用反汇编器(IDA)或者调试器(OD)了解程序的结构和工作原理
②:开发Hook代码
③:灵活操作可执行文件和进程内存,执行Hook
其中,钩取API的技术就叫做API钩取,它将钩取API,改变程序执行流,达到某些我们想要的目的。VC实现【API钩取】【调试法】附加调试器

关于API的概念就不赘述了,(百度百科:http://baike.baidu.com/link?url= ... 9n63O8bV7We25xVyz-7
API封装在DLL中,程序运行时就会加载各种DLL(kernel32.dll,ntdll.dll等),上节DLL注入中就可以看出来了
-----------------------------------------------------------------------------------------------------
VC实现【API钩取】【调试法】附加调试器
以notepad为例,要打开一个文件,notepad会发生如下调用:
VC实现【API钩取】【调试法】附加调试器

程序正常调用API:
VC实现【API钩取】【调试法】附加调试器
当我们HookAPI后:
VC实现【API钩取】【调试法】附加调试器
利用上节的知识,将hook.dll注入目标进程后,hook.dll将钩取目标API,并执行我们自己的代码,改变程序执行流,这样,每当程序调用目标API后,都会经由我们自己的代码

下面给出一张技术图表:
VC实现【API钩取】【调试法】附加调试器
①:【方法】API钩取一般都采用动态方法
②:【位置】指出API钩取时操作哪部分
        <1>:IAT 将其内部的API函数地址修改为Hook函数地址,实施起来简单,但无法钩取不在IAT而在程序中动态加载的DLL中的API。(关于IAT的详细讲解,大家可以参考驿站的【PE文件格式解析】)
        <2>:代码 *.dll映射到内存是,从中查找目标API地址,并直接修改代码,应用广泛。
        <3>:EAT 并不常用,不在赘述
③:【技术】从表中也可以看出,API钩取可分为两种方法:调试法和注入法(代码注入和DLL注入)
        调试法:
        调试通过向目标进程附加调试器钩取API,调试器拥有被调试进程的所有权限
        注入法:
                DLL注入:
                (详细见我上一章【VC实现DLL注入】)在Dll中创建Hook代码和设置代码,并在DllMain()中调用,注入的同时也就完成了Hook
                代码注入:
                (我准备再开一章专讲代码注入)
④:【API】列举了几个各自技术要用到的API
-----------------------------------------------------------------------------------------------------
大致了解完枯燥的理论后,开始实例讲解!
利用【调试法】向notepad附加调试器,尝试钩取WriteFile()API
在这之前,我们有必要了解一下调试器。

调试器工作原理:
被调试进程注册后,每当被调试进程发生调试事件(DebugEvent)时,OS就会暂停进程执行,并汇报给调试器,当调试器处理完相关事件后,使被调试程序继续执行。
一张图说明调试器的异常处理(EXCEPTION):
VC实现【API钩取】【调试法】附加调试器
列举调试事件(DebugEvent)(共9个):
EXCEPTION_DEBUG_EVENT
CREATE_THREAD_DEBUG_EVENT
CREATE_PROCESS_DEBUG_EVENT
EXIT_THREAD_DEBUG_EVENT
EXIT_PROCESS_DEBUG_EVENT
LOAD_DLL_DEBUG_EVENT
UNLOAD_DLL_DEBUG_EVENT
OUTPUT_DEBUG_STRING_EVENT
RIP_EVENT
我们主要关注EXCEPTION_DEBUG_EVENT,列举出与其相关的异常事件列表:
EXCEPTION_ACCESS_VIOLATION
EXCEPTION_ARRAY_BOUNDS_EXCEEDED
EXCEPTION_BREAKPOINT
EXCEPTION_DATATYPE_MISALIGNMENT
EXCEPTION_FLT_DENORMAL_OPERAND
EXCEPTION_FLT_DIVIDE_BY_ZERO
EXCEPTION_FLT_INEXACT_RESULT
EXCEPTION_FLT_INVALID_OPERATION
EXCEPTION_FLT_OVERFLOW
EXCEPTION_FLT_STACK_CHECK
EXCEPTION_FLT_UNDERDLOW
EXCEPTION_ILLEGAL_INSTRUCTION
EXCEPTION_IN_PAGE_ERROR
EXCEPTION_INT_DIVIDE_BY_ZERO
EXCEPTION_INT_OVERFLOW
EXCEPTION_INVALID_DISPOSITION
EXCEPTION_PRIV_INSTRUCTION
EXCEPTION_SINGLE_STEP
EXCEPTION_STACK_OVERFLOW
(FUCK!我想骂人!刚写好的帖子渣B浏览器崩溃了,结果一堆都没了。。从头开始吧。。。)
我们只关心EXCEPTION_BREAKPOINT这个事件,因为要用int3下断点(断点的IA-32指令是0xCC。),通过这个事件反馈给调试器。
-----------------------------------------------------------------------------------------------------
下面讲解一下整个调试流程:
①:对目标进程附加调试器,开始调试
②:下断点,将目标API函数的起始地址第一个字节设置为0xCC
③:程序调用目标API,断下,反馈信息给调试器
④:执行我们自己的代码
⑤:恢复0xCC,使API正常执行
⑥:再次下断,将目标API函数的起始地址第一个字节设置为0xCC
这就是基本的流程了
-----------------------------------------------------------------------------------------------------
OK,开始真正的实战,
我们对notepad进行API钩取,在其保存文件时,将文本中所有小写字母替换成大写字母。
第一步:
先来用OD分析一下notepad.exe的执行流
(这利用的是XP的notepad.exe,WIN7的貌似有保护,我OD调试后立即崩溃)
VC实现【API钩取】【调试法】附加调试器 notepad.zip (33.41 KB, 下载次数: 8)

评分

参与人数 1威望 +2 驿站币 +2 贡献 +2 激情 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2 + 2 支持原创!

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

47_avatar_middle
ico_lz  楼主| Miss丿小沫 发表于 2016-7-16 19:53:07 | 显示全部楼层
SYC大哥,文章写到一半,存在了草稿箱,这咋不能编辑了呢?我再重开一个帖子,接这一个,等下,你帮我合并到一个里面吧。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

24_avatar_middle
online_member jingjinghack 发表于 2016-7-17 12:30:30 | 显示全部楼层
楼主看的那本书?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

47_avatar_middle
ico_lz  楼主| Miss丿小沫 发表于 2016-7-17 13:41:53 | 显示全部楼层

逆向工程核心原理

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2016-7-18 09:08:43 | 显示全部楼层
Miss丿小沫 发表于 2016-7-16 19:53
SYC大哥,文章写到一半,存在了草稿箱,这咋不能编辑了呢?我再重开一个帖子,接这一个,等下,你帮我合并 ...

已合并,加精喽!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

01_avatar_middle
online_member libocdf 发表于 2016-7-19 13:38:08 | 显示全部楼层
虽然没看过《逆核》,但是这种Hook方法前一段时间也想到过,后来果断放弃了。因为在当前软件对抗如此密集的今天,通过调试的方式进行Hook虽然做法相对新颖,但是很容易失败!!楼主对逆向感兴趣的话,建议写一写调试器,核心功能主要是实现调试器的3种断点(CC断点,内存断点以及硬件断点),其余断点都是根据这三类断点来实现的(OD是根据CC来实现的其余断点,条件断点,消息断点,条件记录断点,内存一次断点等)
楼主的文章很棒,继续支持!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

47_avatar_middle
ico_lz  楼主| Miss丿小沫 发表于 2016-7-19 18:24:38 | 显示全部楼层
Syc 发表于 2016-7-18 09:08
已合并,加精喽!

哈哈!!!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

47_avatar_middle
ico_lz  楼主| Miss丿小沫 发表于 2016-7-19 18:25:22 | 显示全部楼层
libocdf 发表于 2016-7-19 13:38
虽然没看过《逆核》,但是这种Hook方法前一段时间也想到过,后来果断放弃了。因为在当前软件对抗如此密集的 ...

多谢支持!!会继续努力的!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

46_avatar_middle
online_member runfog 发表于 2017-5-2 08:35:38 | 显示全部楼层
在DLL注入里面也提到了API钩取

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-4-20 05:01

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表