社区
C++ Builder
帖子详情
如何利用API HOOK来截取数据封包
mygodness
2004-09-03 12:49:29
如果有源程序,我试了可用,则200分尽送..
代码请寄godsaveboy@sohu.com
...全文
551
12
打赏
收藏
如何利用API HOOK来截取数据封包
如果有源程序,我试了可用,则200分尽送.. 代码请寄godsaveboy@sohu.com
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mygodness
2004-09-22
打赏
举报
回复
其实我没有解决,没办法
jiangchun_xn
2004-09-07
打赏
举报
回复
为什么一定要用API HOOK,移植也不方便,再9x和nt,2k下面都不一样,而且技巧晦涩,用SPI吧/
mygodness
2004-09-06
打赏
举报
回复
逼我强制结贴呀
mygodness
2004-09-05
打赏
举报
回复
我随便写了一个DLL,里面只有一个空架子,然后
HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
用这个来把DLL装入系统,可总是不成功
mygodness
2004-09-05
打赏
举报
回复
他给的不太完全呀,而且是VC代码..我想要BCB的源代码,然后研究一下
大大怪老张
2004-09-05
打赏
举报
回复
如果想学习,2楼的回复比代码好,如果想使用,代码比2楼的回复好,看你怎么选
mygodness
2004-09-04
打赏
举报
回复
顶起来,希望有人再指教一下
mygodness
2004-09-03
打赏
举报
回复
就是HOOK SOCKET的RECV等..
Lonelywolf1899
2004-09-03
打赏
举报
回复
学习
mygodness
2004-09-03
打赏
举报
回复
还是没有看太明白.quickreport(快速报告)
你有没有源代码呀..看起来,你会的,是不是?
如果有完整原代码,能不能发一份到我邮箱,godsaveboy@sohu.com
你写的这段,我会看的,只是不明白其实一些具体的操作上怎么写法..
quickreport
2004-09-03
打赏
举报
回复
利用HOOK拦截封包原理
本文作者: 不详
文章出处: csdn
阅读次数: 174
发布日期: 10/16/2003
截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。
首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下:
HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其轿颐堑腁PI中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。
DWORD dwCurrentPID = 0;
HHOOK hOldHook = NULL;
DWORD pSend = 0;
DWORD pRecv = 0;
GETMESSAGE pGetMessage = NULL;
BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];
HANDLE hDebug = INVALID_HANDLE_value;
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
DWORD dwPIDWatched;
HMODULE hLib;
if( dwCurrentPID == 0 )
{
dwCurrentPID = GetCurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
if( dwCurrentPID == dwPIDWatched )
{
hLib = LoadLibrary( "ws2_32.dll" );
pSend = (DWORD)GetProcAddress( hLib, "send" );
pRecv = (DWORD)GetProcAddress( hLib, "recv" );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
hLib = LoadLibrary( "user32.dll" );
pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
hDebug = ::CreateFile( "C:\\Trace.log", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
}
}
if( hOldHook != NULL )
{
return CallNextHookEx( hOldHook, nCode, wParam, lParam );
}
return 0;
}
上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。btNewBytes中的指令实际就是
mov eax, 0x400000
jmp eax
这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成。再看看我们的函数中都干了些什么。以GetMessageA为例:
BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax )
{
DWORD dwSize;
char szTemp[256];
BOOL r = false;
//Watch here before it's executed.
sprintf( szTemp, "Before GetMessage : HWND 0x%8.8X, msgMin 0x%8.8X, msgMax 0x%8.8x \r\n", hWnd, wMsgFilterMin, wMsgFilterMax );
::WriteFile( hDebug, szTemp, strlen(szTemp), &dwSize, 0 );
//Watch over
// restore it at first
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
// execute it
r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax );
// hook it again
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
//Watch here after it's executed
sprintf( szTemp, "Result of GetMessage is %d.\r\n", r );
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );
if( r )
{
sprintf( szTemp, "Msg : HWND 0x%8.8X, MSG 0x%8.8x, wParam 0x%8.8X, lParam 0x%8.8X\r\nTime 0x%8.8X, X %d, Y %d\r\n",
lpMsg->hwnd, lpMsg->message,
lpMsg->wParam, lpMsg->lParam, lpMsg->time,
lpMsg->pt.x, lpMsg->pt.y );
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );
}
strcpy( szTemp, "\r\n" );
::WriteFile( hDebug, szTemp, strlen( szTemp ), &dwSize, 0 );
//Watch over
return r;
}
先将截获下来的参数,写入到一个log文件中,以便分析。然后恢复原先保留下来的GetMessageA的首8字节,然后执行真正的GetMessageA调用,完毕后再将执行结果也写入log文件,然后将GetMessageA的执行结果返回给调用者。
整个截获的过程就是这样。你可以把其中的写log部分改成你自己想要的操作。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,但这个我没有试验过。
CCED136
2004-09-03
打赏
举报
回复
老大,说清楚点儿
java
hook
api
实现
封包
截取
_
Hook
API
拦截
封包
原理
截获
API
是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows
Hook
可以帮我们实现这一点。SetWindows
Hook
Ex的声明如下:H
HOOK
SetWindows
Hook
Ex(int id
Hook
, //
hook
type
HOOK
PROC lpfn, //
hook
pr...
java
hook
api
实现
封包
截取
_
截取
封包
示例[
API
Hook
]
从网上查到一篇“拦截其它程序的网络
数据
封包
”的文章,我想问问前辈们,我应该怎么获取此程序连接的ip地址呢?我是希望能根据ip地址判断是不是需要拦截。
HOOK
.DLL的代码:library
Hook
;usesSysUtils,windows,Messages,
API
Hook
in '
API
Hook
.pas';typePData = ^TData;TData = record
Hook
: THandle...
java
hook
api
实现
封包
截取
_
hook
封包
截取
WSASend实例
【实例简介】
截取
IE11浏览器WSASend实例【实例截图】【核心代码】.版本 2.程序集
hook
, , 公开.程序集变量 函数地址, 整数型.程序集变量 dtgesxt, 整数型.程序集变量 原字节, 字节集.程序集变量 sr5h6bdfd, 字节集.程序集变量 原指针地址, 整数型.子程序 取地址, 整数型, 公开, 取原始
数据
地址,回调原指针时使用返回 (原指针地址).子程序 安装, 逻辑...
截取
程序的网络
封包
(Delphi
Hook
API
)
有时候我们需要对其它应用程序发送和接收的网络
数据
进行拦截,比如要对IE发送的**头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手来DIY吧. 拦截网络
数据
封包
的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的
数据
包,二是
HOOK
目标进程的发送和接收的
API
函数,第三种
利用
HOOK
拦截
封包
原理
截获
API
是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。 首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows
Hook
可以帮我们实现这一点。SetWindows
Hook
Ex的声明如下: H
HOOK
SetWindows
Hook
Ex( int id
Hook
, //
hook
type
HOOK
PROC lpfn
C++ Builder
13,872
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章