自我保护HIPS主动防御
1、要Hook的API
方法名称:OpenProcess
位置:Kernel32.dll
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
2、大体方法
找到API函数在内存中的地址,改写函数头几个字节为JMP指令跳转到自己的代码,执行完毕再执行API开头几个字节的内容再跳回原地址。这种方法对CPU有较大的依赖性,而且在多线程环境下可能出问题,当改写函数代码的时候有可能此函数正在被执行,这样做可能导致程序出错。
3、操作步骤
1 找到MessageBoxA的入口地址
2 修改入口地址的虚拟保护为可读可写类型
3 在入口处直接返回 也就是在MessageBoxA的入口地址处写入 retn 10(为什么是retn 10 因为MessageBoxA最后的返回是这个参数)
这个其实在OD里面是很容易实现的 也就是Gtrl+G MessageBoxA 然后 retn 10
4、需要的API
1 GetProcAddress
函数功能描述:
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
对于我们这个题目来说 我们要通过它得到MessageBoxA的地址 如果这个函数正常返回 那么返回值就是MessageBoxA的函数地址
另外DLL模块句柄 就是User32.dll的句柄 函数名当然是MessageBoxA
那么我们怎么得到User32.dll的句柄的句柄呢 请看下个函数
2 GetModuleHandle
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
说明
获取一个应用程序或动态链接库的模块句柄
返回值
Long,如执行成功成功,则返回模块句柄。零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpModuleName String,指定模块名,这通常是与模块的文件名相同的一个名字
用这个函数就可以得到User32.dll的句柄
到这里我们就完成了第一步 找到MessageBoxA的入口地址
下面我们来修改这个地址处的内存读写保护 默认是不可以写的 必须修改才能写入数据 就要用到下个函数
3 VirtualProtect
VirtualProtect 方法
当做对应之 Win32 函式的逻辑包装函式。VirtualProtect 的 Win32 实作会在呼叫处理序的虚拟位址空间里,变更认可页面区域上的保护。
好了 就这3个API就可以做到了 写内存这个API 在易语言里面有这个指令 我就不说了