| 
 | 
			
 
APIHOOK学习笔记(一) 
https://www.52hb.com/forum.php?m ... 1&fromuid=20388 
(出处: 吾爱汇编论坛) 
 
APIHOOK学习笔记(二) 
https://www.52hb.com/forum.php?m ... 9&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[7] = {184,0,0,0,0,255,224}; //要修改的数据 
unsigned char oldcode[7];//备份原数据,方便还原 
 
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[0],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[0],7,0); 
        memcpy(&newcode[1],&addr,4); 
        WriteProcessMemory(HANDLE(-1),LPVOID(pt),&newcode[0],7,0); 
} 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
                       DWORD  ul_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,就可以看到效果了  
 
怎么注入?我说个简单的方法 
打开OD,载入push.exe,大家的OD应该都有StrongOD插件吧 
选择菜单栏的 插件(P) —— StringOD —— InJectDll —— Reomote Thread 
在弹出的窗口中选择HOOK Patch.dll,然后把程序跑起来就可以了。 
可能会看不出来效果,不过区别方式是,如果不使用HOOK补丁的话,打开的窗口是一个有按钮(单击可以载入一个空白窗口)的窗口,使用后载入的就是一个空白窗口 
 
 
 
 
 
 
push.zip
(1.83 MB, 下载次数: 58)
 
 
 |   
 
评分
- 
|  参与人数 10 | 威望 +1 | 
HB +39 | 
THX +6 | 
收起
理由
 | 
 
| 
可遇
 |  | 
 + 1 | 
 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
消逝的过去
 |  | 
 + 2 | 
 | 
 | 
 
| 
zxjzzh
 |  | 
 + 2 | 
 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
VipDongle
 |  | 
 + 1 | 
 | 
 | 
 
| 
agan8888
 |  | 
 | 
 + 1 | 
 | 
 
| 
ding520
 |  | 
 | 
 + 1 | 
&lt;span class=&quot;text2Link&quot;&gt;[吾爱汇编论坛&lt;a  target=&quot;_blank&quot;&gt;52HB.COM&lt;/a&gt;]-学破解防破解,知进攻懂防守!&lt;/span&gt;. | 
 
| 
圈瞳
 |  | 
 + 1 | 
 + 1 | 
吃水不忘打井人,给个评分懂感恩! | 
 
| 
yiyaya
 |  | 
 + 1 | 
 + 1 | 
分享精神,是最值得尊敬的! | 
 
| 
1355400205
 |  | 
 + 1 | 
 + 1 | 
不玩了 | 
 
| 
Shark恒
 |  + 1 | 
 + 30 | 
 + 1 | 
分享精神,是最值得尊敬的! | 
 
 
查看全部评分
 
 
 
 
 
 |