APIHOOK学习笔记(三)——实战制作易语言push窗口补丁
APIHOOK学习笔记(一)https://www.52hb.com/forum.php?mod=viewthread&tid=20831&fromuid=20388
(出处: 吾爱汇编论坛)
APIHOOK学习笔记(二)
https://www.52hb.com/forum.php?mod=viewthread&tid=21199&fromuid=20388
(出处: 吾爱汇编论坛)
这次我们用VC6来写这个DLL,为什么?因为VC6的运行库基本上所有电脑都装了,你整个需要VC2010的补丁出来,人家机子没装怎么办?抓瞎。
至于用到的课件我全部打包进压缩包了,在附件里。
实战
我们打开附件(要先下载)目录下的push.exe
应该都会易语言push窗口吧,不会的看恒大的零基础教程去。
这是需要修改的地方
//0040108B|.68 01000152 push 0x52010001
//0040108B 68 04000152 push 0x52010004
比较上述数据,我们发现只要把0x40108C的01改成04就可以了
打开VC6,新建一个dll工程(源码我打包进附件了)
文件(&F) —— 新建(&N)
然后把<DLL工程名>.cpp里的代码替换为如下
#include "stdafx.h"
#include "windows.h"
HMODULE h;
int pt;
unsigned char newcode = {184,0,0,0,0,255,224}; //要修改的数据
unsigned char oldcode;//备份原数据,方便还原
HWND MyCreateWindowExA(int dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,int dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,int* lpParam)
{
//0040108B|.68 01000152 push 0x52010001
//0040108B 68 04000152 push 0x52010004
unsigned char write = 0x4;//储存要修改的数据
WriteProcessMemory(HANDLE(-1),LPVOID(0x40108C),&write,1,0); //虽然地址是40108B可我们要更改的只有第二个字节,也就是40108C
WriteProcessMemory(HANDLE(-1),LPVOID(pt),&oldcode,7,0);//还原数据
//有些同学可能会问,为什么不调用一个CreateWindowExA,我一开始也是这样想的,可是后来我发现,调不调用都一样....所以干脆省掉,这里第一个CreateWindowExA函数的调用肯定是输入法调用的,如果觉得有必要加上一句 CreateWindowExA(把这个子程序里的各项参数写上去); 就可以了
return 0;
}
void FixHook() //这里我不解释了,不懂得去看看我的前面两篇笔记
{
int addr;
addr = int(&MyCreateWindowExA);
h = LoadLibrary("user32.dll");
pt = int(GetProcAddress(h,"CreateWindowExA"));
VirtualProtect(LPVOID(pt),7,PAGE_EXECUTE_READWRITE,0);
ReadProcessMemory(HANDLE(-1),LPVOID(pt),&oldcode,7,0);
memcpy(&newcode,&addr,4);
WriteProcessMemory(HANDLE(-1),LPVOID(pt),&newcode,7,0);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORDul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call = DLL_PROCESS_ATTACH) //如果是DLL被加载
{
FixHook();//安装HOOK
};
return TRUE;
}
知道怎么编译成Release的版本不,好吧,就知道你不知道
然后听到一声响,你就可以在DLL工程目录里面的Release目录下得到一个dll,然后把这个dll注入push.exe,就可以看到效果了{:5_116:}
怎么注入?我说个简单的方法
打开OD,载入push.exe,大家的OD应该都有StrongOD插件吧
选择菜单栏的 插件(P) —— StringOD —— InJectDll —— Reomote Thread
在弹出的窗口中选择HOOK Patch.dll,然后把程序跑起来就可以了。
可能会看不出来效果,不过区别方式是,如果不使用HOOK补丁的话,打开的窗口是一个有按钮(单击可以载入一个空白窗口)的窗口,使用后载入的就是一个空白窗口
沙发被我占了 板凳也是我的话说没有VC6怎么办 ll988600 发表于 2016-3-26 08:33
板凳也是我的话说没有VC6怎么办
用易语言 嗯 感谢分享,一直没接触过hook 我去试试... 看起来 好高端的 样子谢谢 分享了 !{:5_124:} 看起来很厉害的样子 如果不用OD注入,运行程序直接加载HOOK怎么做呢,谢谢楼主
guitar 发表于 2016-3-26 16:39
如果不用OD注入,运行程序直接加载HOOK怎么做呢,谢谢楼主
下次有时间写个注入DLL教程
页:
[1]
2