HOOK(易语言高级部分)

Hook

API_HOOK核心代码

这里时绝对跳转 FF,同进程不用修改内存属性?
在这里插入图片描述
没有修改内存属性,照样可行
在这里插入图片描述

HOOK同进程MessageBoxA

未HOOK前 MessageBoxA

在这里插入图片描述

HOOK后 MessageBoxA

我们正好把这7个字节改了.

mov eax,0x401A5F
jmp eax           

在这里插入图片描述

类_InlineHook

这个类比先那个类要高级点,还可以调用原函数,和远程进程

整体思路
这个就是利用相对跳转。E9
修改被hook代码,执行相对跳转 到我们的代码,我们的代码也可通过私有_新函数地址继续执行原先代码,也可不执行。

下图中的jmp是是跳到我们的函数
在这里插入图片描述
这里是私有_新函数地址 保留的代码,从图中看可以继续跳到原先代码执行.
在这里插入图片描述

关于堆内存

例如建立一个文本变量A,你用HEAPALLOC申请内存,赋值给A后,当A进行下一次重新赋值时会自动调用HEAPFREE来释放之前的堆内存,易语言对文本、字节集等变量在堆上赋值时会自动调用HEAPFREE清空之前的堆内存,所以你不用管这个变量的堆内存,不管这个变量赋值多少次,在下次赋值时都会进行这个操作,所以不会有内存泄露。

http://bbs.eyuyan.com/read.php?tid=374658&page=3

关于函数参数

例如易语言在调用含自定义结构体的API时会先在堆上申请内存然后将自定义结构体转为字节集,然后再传入字节集的地址进栈里再调用这个API,调用完后再对着这个结构体将字节集的数据一个个填写进去。

还有一个更明显的例子就是易语言调用子程序时如果用的是“XXX子程序()”的形式来调用(我想大部分都是这样),那么当子程序里有文本、字节集、数组、自定义结构体之类的参数时,那么传入进栈里的是指针的指针,对于文本和字节集参数来说传入的就是“取变量地址()”而非“取变量数据地址”,用“&”取到的子程序地址并不是真正的子程序地址,而只是一个外壳地址,这个外壳地址在平时是不起作用的(你可以在OD里对这个地址下断,调用子程序时会发现OD根本不会断下来),一般是在做回调函数的时候才会起作用,例如APIHOOK的时候就会用到“&”取到得子程序外壳地址做回调函数,这个外壳的作用就是将传入的数据------数据的指针
变为指针的指针。

http://bbs.eyuyan.com/read.php?tid=374957&page=1

在这里插入图片描述
这也就解释了,因为多了一层中间指针
第一次eax 取的是中间指针,第二次取得才是实际地址,具体过程如下
主要在图中标记第二步骤
在这里插入图片描述

关于JMP

0xFF JMP 远跳 eax取值
0xE8 CALL 后面的四个字节是地址
0xE9 JMP 后面的四个字节是偏移 RVA = 目标地址-(指令所在地址+指令长度)
0xEB JMP 后面的二个字节是偏移 负数补码 比如F9是EIP向前移动7个字节

"减一取反"和"取反加一"等价
已知补码求源码也可取反 + 1,分正数和负数,负数的补码= 正数 取反 + 1
补码的补码是原码

总结

HOOK 很好很强大.

猜你喜欢

转载自blog.csdn.net/u012787710/article/details/104919408