HOOK 系统 API

来源:互联网 发布:ftp命令linux 编辑:程序博客网 时间:2024/05/16 19:40


调用系统函数 MessageBoxA

 

VC

MessageBoxA(NULL,NULL,NULL,MB_OK)

CALL dword ptr [0040d244]

VC作了优化

ASM

invoke  MessageBoxA,NULL,NULL,NULL,MB_OK

Call 401abc

401abc :jmp dword ptr [0040d244]

未优化时,函数名代表了jmp dword ptr [0040d244]的地址

 

 

调用内部函数 (函数名就是一个标号,均代表一个地址,VC的标号指向JMP XXXXASM的标号则直接指向函数体)

 

VC

SetHook(lpAddr,MyMessageBox);

CALL 40100f

 40100f:jmp 401030(E91C000000)

1C0(步长)+40100f(本条地址)+5(本条所占地址)=401030

1C(步长)+5(本条所占地址) =本条地址到目标函数地址的距离

 

ASM

CALL _SubProc

Call 40170D

40170D:push ebp

        mov ebp,esp



例子:


#include <windows.h>

 

PROClpAdder = MessageBoxA;//存了E9 +步长的地址, E9 + 步长会跳转到 JMP DWORD PTR [AD]处 (VC6中会直接指向JMP DWORD PTR [XXXXXXXX] )

//【知识点】

//1运算时一定要先把地址存入指向指向单字节指针中

//2要取单字节就将地址存入指向单字节指针中,要取四字节就将地址存入指向四字节的指针中,之后用指针[0]输出即可

PROC SetHook(PROClpFucAdder, PROC pNewProc )

{

LPBYTE                lpByte;

LPDWORD                lpAddr;

DWORD                dwAddr;

 

lpByte= (LPBYTE) lpFucAdder;//【运算时一定要先把地址存入指向指向单字节指针中】

// JMP DWORD PTR [XXXXXXXX] => FF 25 XX XX XX XX ,由于JMP +DWORD PTR 操作码就变成了FF25

if(lpByte[0] == 0xFF && lpByte[1] == 0x25)

{

lpAddr        =(LPDWORD)(&lpByte[2]);

dwAddr        =lpAddr[0];//将XXXXXXXX存入dwAddr中

lpAddr        =(unsigned long *)dwAddr;//XXXXXXXX指向的就是函数体的4字节地址值,要修改函数体的四字节地址值,就要写上XXXXXXXX,见下方的WriteProcessMemory

dwAddr        =lpAddr[0];//将[XXXXXXXX]输出的系统API函数体的地址值存入dwAddr中

 

WriteProcessMemory(GetCurrentProcess(),lpAddr,&pNewProc,sizeof(DWORD),NULL);//修改[XXXXXXXX]输出的地址,即函数体地址

return(PROC)dwAddr;

}

 

returnNULL;

 

}

int APIENTRYMyMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)

{

int ret= 0;

 

if(lpAdder != NULL)

ret =lpAdder(NULL,"new","new",MB_OK);

 

returnret;

}

 

void main()

 

{

//lpAdder=  MessageBoxA;//存了 " E9 + 步长 "的地址, E9 + 步长会跳转到 " JMP DWORD PTR [AD] " 处

 

LPBYTEpByte;

LPDWORD        pAddr;

DWORDdwAddr;

 

//从JMP后取出步长。先取出步长的地址然后存入LPDWORD的指针中,之后再输出即可得到步长

 

pByte =(LPBYTE) lpAdder;//将 " E9 + 步长 "的地址存入到字节的指针中,为了计算地址用【运算时一定要先把地址存入指向指向单字节指针中】

pAddr        =(LPDWORD)(&pByte[1]);//LPDOWD类型的pAddr是为了输取出4个字节的步长,&pByte[1]见指针逆向来理解【要取四字节就将地址存入指向四字节的指针中,之后用指针[0]输出即可】

dwAddr        =pAddr[0];//取出步长并存入dwAddr中

 

pByte +=5;//加上E9 + 步长所占的5个字节

pByte +=dwAddr;//加上步长,得到JMP DWORD PTR [AD]处的地址

 

//进行HOOK操作

lpAdder= SetHook((PROC)pByte, MyMessageBox);//pByte 指向了  ff 25 dc 73 0c 01 即 JMP DWORD PTR [XXXXXXXX]

 

//调用系统API时,进入MyMessageBox函数,实现HOOK系统API的效果

MessageBoxA(NULL,"old","old",MB_OK);

}


 

XX

 

 

XX

 

 

XX

 

 

XXX

 

 

XXX

 

 

XX

 

 

EDI

 

 

EDI

 

7674EA11

MOV

函数体

 

 

 

 

 

 

 

76

 

 

74

 

 

EA

 

0xDB73DC

11

 

 

 

 

 

 

 

 

00

 

 

DB

 

 

73

 

 

DC

 

 

DWORD PTR

 

0x1068428

JMP

1067045 + 13DE + 5 = 0x1068428

 

 

 

 

 

 

 

00

 

 

00

 

 

13

 

 

DE

 

(MessageBoxA)1067045

E9

E9DE13


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果平板进水了怎么办 华为平板进水了怎么办 三星平板进水了怎么办 笔记本cpu运行过高怎么办 微博永久性封号怎么办 电脑占用内存多怎么办 直播签约后悔了怎么办 移动宽带网络不稳定怎么办 股票帐号被锁定怎么办 电脑帐号锁定了怎么办 云校家帐号被锁定怎么办 qq音乐停止运行怎么办 做事效率低怎么办教案 孩子做事效率低怎么办 百度搜不到答案怎么办 学乐云账号忘了怎么办 wps云空间不足怎么办 超星密码忘了怎么办 百度钱包忘记密码怎么办 宝宝吃了粉笔怎么办 粉笔灰进眼睛怎么办 讲公开课紧张怎么办 课堂派考勤旷课怎么办 2018qq音乐付费怎么办 不满一个月社保怎么办 试用期未买社保怎么办 小视频转发黑屏怎么办 听歌要钱的怎么办 手机歌曲要付费怎么办 安装包已损坏怎么办 方舟 安装包损坏怎么办 安装包已删除怎么办 超大附件过期了怎么办 邮箱被黑客盯上怎么办 云闪付安全问题忘记了怎么办 不知道网易账号怎么办 登录过程初始化失败怎么办 登录进程初始化失败怎么办 网易邮箱地址忘了怎么办 电脑电源短路了怎么办 电脑电源有问题怎么办