开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 21855|回复: 71
收起左侧

[技术专题] 【技术专题】一、Hook专题 b)远程修改代码

[复制链接]
结帖率:100% (1/1)
发表于 2012-7-15 13:18:56 | 显示全部楼层 |阅读模式   湖北省咸宁市
分享视频教程
教程类型: -
教程讲师: 流年一逝
下载地址1: http://www.3600gz.cn
本帖最后由 |流年灬一逝| 于 2012-7-26 09:20 编辑

前言
第一章
第二章
第三章
第四章
第五章
第六章

既然来了,就坚持读下去吧,认真读下去,一定会有收获的!
************************************************************************************************

上一节我们知道了怎样在OllyDBGHook修改一个数据,然后转存。
这节课我们主要学习一下远程修改指定进程的代码来达到我们Hook的目的。
其实这节课也就是编写程序来实现OD中的修改代码的操作。
这节课我们需要认识几个API函数。
1OpenProcess                  打开一个进程,返回进程句柄
2WriteProcessMemory      在一个进程中写入数据
3CloseHandle                    关闭一个内核对象
4ReadProcessMemory       读取进程数据
5VirtualAllocEx                 在目标进程中申请一段内存空间(存放Hook代码)
6VirtualFreeEx                  在目标进程中释放申请的内存空间
因为是要动态修改程序代码,所以这节课的原程序有所改变,是一个静态编译的Windows窗口程序。
未命名.PNG
代码和上节课的一样,但是换成了按钮事件:
未命名.PNG
今天这个目标程序的Hook位置比较不好找,我提前找好了:
Hook地址:00401057  |. DB45 FC       fild [local.1]              相加指令地址(c = a + b)
还原地址:00401077 |.  6A 00         push 0x0              信息框地址
未命名.PNG
我们今天的这个Hook程序就是这样,编辑框里输入目标进程ID,点Hook就修改指令,点还原就还原修改的Hook代码
我们先来看看这几个API函数的使用:
OpenProcess                根据进程ID打开进程
参数
dwDesiredAccess          进程操作权限
bInheritHandle        是否被子进程所继承
dwProcessId                指定要打开的进程ID
这里的操作权限我们一般给它完全操作权限,也就是PROCESS_ALL_ACCESS API助手里查到的是(STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF) 这个值,其实就是把STANDARD_RIGHTS_REQUIRED SYNCHRONIZE FFF进行位或
STANDARD_RIGHTS_REQUIRED的值是F0000(十六进制) SYNCHRONIZE的值是100000 (十六进制),他们三个位或之后的结果是2035711 (十进制)
WriteProcessMemory                  读取进程的数据
参数
hProcess                                    进程句柄
lpBaseAddress                             写入数据的起始位置
lpBuffer                                      将要写入数据的缓冲区
nSize                                          缓冲区的长度
lpNumberOfBytesWritten             实际写入长度,如果不需要可以设置为null(0)
ReadProcessMemoryWriteProcessMemory的用法一样。
CloseHandle                  关闭一个内核对象
参数
hObject   对象句柄
VirtualAllocEx                      在指定的进程中分配内存空间,返回分配的内存地址
参数
lpAddress                                   分配起始地址,一般为0则自动分配
dwSize                                       分配长度
flAllocationType                          分配类型
flProtect                                     保护类型
VirtualFreeEx                释放分配的内存数据
参数
hProcess                      进程句柄
lpAddress                     释放起始地址
dwSize                         释放长度,一般为0
dwFreeType                 释放类型
未命名.PNG
这是写好的代码,首先我们判断进程ID是否合法,接着根据提供的进程ID来使用openprocess函数来打开进程。原数据 这个程序集变量中保存的是Hook前的数据代码,也就是c=a+b转换成汇编代码的前五个字节,用来以后我们还原用。接下来就是我们Hook的主要代码了,先使用VirtualAllocEx函数申请一段内存空间,我们的 分配类型(第四个参数)使用的是从内存中分配,保护类型(第五个参数)使用的是应用程序可读可写
下面的那段汇编指令我们暂且不管。
接着构造hook代码,也就是:


mov dword [ebp-0x4],0x3
mov dword [ebp-0x8],0x4
mov eax,dword [ebp-0x4]
add eax,[ebp-0x8]
mov dword [ebp-0xc],eax
jmp 0x00401077 跳转到信息框的地址
这段代码我们应该很熟悉,就是上节课我们Hook的代码。
那个计算jmp指令机器码子程序待会我们会提到。
接着就是写入数据了,注释打的很清楚,我就不说了。
说一下这个常量 #Hook代码吧。
我们Hook代码存储区有一段代码是固定不变的,也就是:
mov dword [ebp-0x4],0x3
mov dword [ebp-0x8],0x4
mov eax,dword [ebp-0x4]
add eax,[ebp-0x8]
mov dword [ebp-0xc],eax
这段代码既然固定不变,我们就可以把它设定为常量,用字节集形式来写入,这样也就是写入一段代码了。
注:jmp 0x00401077 跳转到信息框的地址 这条代码会随着申请Hook代码存储空间的位置变化而变化,原因我们待会会提到(计算jmp指令机器码子程序的实现)
我们在云外归鸟写的易语言置入代码工具中,写入这段汇编代码,然后编译成为二进制文件,添加在易语言的资源中,需要时进行调用写入目标程序就可以了。
未命名.PNG
关于这个工具也可以到易语言宝盒或者云外归鸟的官方去下载。
好了,再说一下计算jmp指令机器码 这个子程序的实现。
未命名.PNG
其实他只有这么几行代码,参数是源地址(从哪里跳),和目标地址(准备往哪里跳)
我们先要考虑jmp本身的代码长度,也就是5个字节,那么开始跳的地方也就是源地址+5,从哪里跳,就把目标地址减去这个值就算出了跳转的距离,jmp指令的机器码标志是EB,也就是{232},把它和跳转距离合并起来就是整个jmp的机器码了。
我们的这句代码:
未命名.PNG
其实就是:
mov dword [ebp-0x4],0x3
mov dword [ebp-0x8],0x4
mov eax,dword [ebp-0x4]
add eax,[ebp-0x8]
mov dword [ebp-0xc],eax
jmp 0x00401077 跳转到信息框的地址
加红的这句是使用计算jmp指令机器码来实现的。
未命名.PNG
这句代码也一样,计算从Hook起始位置跳转到Hook代码储存区的机器码。
然后我们来看一下还原:
未命名.PNG
这个是还原的代码,首先从Hook起始地址把数据还原,也就是我们之前的原数据中保存的代码,接着我们释放已经申请的内存。最后,我们关闭这个进程句柄,以防进程泄露。

最后我们看一下运行效果:
没有Hook之前的: 未命名.PNG
Hook之后的: 未命名.PNG


*****************************************************************************************
大家可能有疑问说怎样才能知道被Hook程序的进程ID。方法可以利用一些工具,比如说进程管理器把查看-选择列-PID(进程标识符)选上,点确定,就有了。

大家还有什么疑问可以跟帖提出来。

程序+代码在此下载
程序 代码.rar (499.74 KB, 下载次数: 653)

本帖被以下淘专辑推荐:

结帖率:94% (16/17)
发表于 2012-7-15 13:19:29 | 显示全部楼层   江西省赣州市
前排支持了
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)
发表于 2012-7-15 13:23:31 | 显示全部楼层   北京市北京市
受教了{:3_228:}远程Hook
回复 支持 反对

使用道具 举报

结帖率:100% (19/19)

签到天数: 4 天

发表于 2012-7-15 13:47:45 | 显示全部楼层   浙江省温州市
的范德萨发个福德宫
回复 支持 反对

使用道具 举报

发表于 2012-7-15 14:11:34 | 显示全部楼层   浙江省杭州市
楼主辛苦了!{:3_232:}
回复 支持 反对

使用道具 举报

发表于 2012-7-24 19:24:22 | 显示全部楼层   江西省上饶市
回复 支持 反对

使用道具 举报

结帖率:97% (36/37)
发表于 2012-7-29 08:33:14 | 显示全部楼层   安徽省蚌埠市
貌似很复杂 看的稀里糊涂
回复 支持 反对

使用道具 举报

发表于 2012-8-10 15:28:08 | 显示全部楼层   广东省广州市
既然来了,就坚持读下去吧,认真读下去,一定会有收获的!
回复 支持 反对

使用道具 举报

发表于 2012-8-12 09:26:04 | 显示全部楼层   河南省焦作市
这个很不错,回复以后下载一个
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2012-9-14 21:41:36 | 显示全部楼层   广东省广州市
撒的发生的冯绍峰撒的发生
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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