李沉舟 发表于 2016-3-26 08:30

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补丁的话,打开的窗口是一个有按钮(单击可以载入一个空白窗口)的窗口,使用后载入的就是一个空白窗口







ll988600 发表于 2016-3-26 08:32

沙发被我占了

ll988600 发表于 2016-3-26 08:33

板凳也是我的话说没有VC6怎么办

李沉舟 发表于 2016-3-26 08:46

ll988600 发表于 2016-3-26 08:33
板凳也是我的话说没有VC6怎么办

用易语言

隐s丶 发表于 2016-3-26 13:00

嗯 感谢分享,一直没接触过hook 我去试试...

叶良辰和赵总 发表于 2016-3-26 13:26

莫丽丽 发表于 2016-3-26 14:52

看起来 好高端的 样子谢谢 分享了 !{:5_124:}

waxberry 发表于 2016-3-26 15:12

看起来很厉害的样子

guitar 发表于 2016-3-26 16:39

如果不用OD注入,运行程序直接加载HOOK怎么做呢,谢谢楼主

李沉舟 发表于 2016-3-26 20:19

guitar 发表于 2016-3-26 16:39
如果不用OD注入,运行程序直接加载HOOK怎么做呢,谢谢楼主

下次有时间写个注入DLL教程
页: [1] 2
查看完整版本: APIHOOK学习笔记(三)——实战制作易语言push窗口补丁