易语言APIHOOK2

更新时间:2023-11-14 06:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

╭───────────────────────────────────────────────────╮ │ ╔-----------------------------------------------------------╗ │ │ ┆精易论坛,专业易语言技术交流平台! ┆ │ │ ┆因为专注,所以专业!http://www.3600gz.cn ┆ │ │ ╚-----------------------------------------------------------╝ │ │ │ │【易语言宝盒】下载地址 http://soft.3600gz.cn/baohe.html │ │【精易小助手】下载地址 http://soft.3600gz.cn/zhushou.html │ │【精易模块】下载地址 http://www.3600gz.cn/thread-1177-1-1.html │ │ │ │ 1) 多学一门技术,让我们的生命更加精彩; │ │ 2) 【精易论坛】专业的易语言培训基地,本站拥有海量源码、优质教程; │ │ 3) 易语言是中国人第一款的全中文、全可视、跨平台的编程语言,让你轻轻 │ │ 松松写自己的软件; │ │ │ │ 4) 转载本站提供的资源请勿删除本说明文件。 │ │ 5) 本站资源一般均已查毒,但为安全起见,请在使用前查毒; │ │ 6) 本站提供资源只可供研究使用,请在下载24小时内删除,勿用于商业用途, │ │ 由此引起一切后果与本站无关。 │ │ │ │ 加入精易顶级VIP,享有更多特权,少走弯路、节省时间、快速学习! │ │ 详细访问 http://vip.3600gz.cn/ │ ╰───────────────────────────────────────────────────╯

课堂标题:远程Hook 制作者: 流年一逝

要用到的工具:易语言,OD调试器

欢迎大家学习本堂课程,此为Hook专题的一章,如果大家有什么好的技术可以联系我(E-Mail:490167887@qq.com)来为您组织专题,分享技术。

如果大家有时间、有精力、有能力录制成套教程,可以联系冰点(QQ:446809585) 录制后论坛会给予一定报酬。

加入精易,开始你的国语编程之路。

上一节我们知道了怎样在OllyDBG中Hook修改一个数据,然后转存。

这节课我们主要学习一下远程修改指定进程的代码来达到我们Hook的目的。 其实这节课也就是编写程序来实现OD中的修改代码的操作。 这节课我们需要学习几个API函数。 1、OpenProcess 打开一个进程,返回进程句柄 2、WriteProcessMemory 在一个进程中写入数据 3、CloseHandle 关闭一个内核对象 4、ReadProcessMemory 读取进程数据 5、VirtualAllocEx 在目标进程中申请一段内存空间(存放Hook代码) 6、VirtualFreeEx 在目标进程中释放申请的内存空间

因为是要动态修改程序代码,所以这节课的原程序有所改变,是一个静态编译的Windows窗口程序。

代码和上节课的一样,但是换成了按钮事件:

今天这个目标程序的Hook位置比较不好找,我提前找好了: Hook地址:00401057 |. DB45 FC fild [local.1] 相加指令地址

还原地址:00401077 |. 6A 00 push 0x0 信息框地址

我们今天的这个Hook程序就是这样,编辑框里输入目标进程ID,点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 进程句柄 具有写入权限,Write lpBaseAddress 写入数据的起始位置 lpBuffer 将要写入数据的缓冲区 nSize 缓冲区的长度 lpNumberOfBytesWritten 实际写入长度,如果不需要可以设置为null (0)

ReadProcessMemory和WriteProcessMemory的用法一样。

CloseHandle 关闭一个内核对象 参数

hObject 对象句柄

VirtualAllocEx 在指定的进程中分配内存空间,返回分配的内存地址 参数 hProcess 进程句柄 lpAddress 分配起始地址,一般为0则自动分配 dwSize 分配长度 flAllocationType 分配类型 flProtect 保护类

VirtualFreeEx 参数 hProcess lpAddress dwSize dwFreeType

释放分配的内存数据

进程句柄 释放起始地址

释放长度,一般为0 释放类型 MEM_RELEASE

这是写好的代码,首先我们判断进程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指令机器码 这个子程序的实现。

其实他只有这么几行代码,参数是源地址(从哪里跳),和目标地址(准备往哪里跳)。

我们先要考虑jmp本身的代码长度,也就是5个字节,那么开始跳的地方也就是源地址+5,从哪里跳,就把目标地址减去这个值就算出了跳转的距离,jmp指令的机器码标志是EB,也就是{232},把它和跳转距离合并起来就是整个jmp的机器码了。

本文来源:https://www.bwwdw.com/article/c91v.html

Top