利用HOOK拦截封包原理
hook技术原理
Hook技术是一种用于拦截API函数调用的技术,它通过修改系统API函数的内存地址,从而拦截系统函数的调用,实现对系统API函数的拦截和修改。
Hook技术的基本原理是将系统API函数的内存地址指向一个用户定义的函数,而不是指向实际的API函数。
当调用系统API函数时,系统将调用用户定义的函数,而不是原来的函数。
这样就可以实现对系统API函数的拦截和修改。
Hook技术的实现步骤如下:
1、首先,程序员需要查找和定位需要拦截的API函数的内存地址。
2、然后,程序员需要编写用户定义的函数,用来拦截和修改系统API函数的调用。
3、接着,程序员需要将系统API函数的内存地址指向用户定义的函数,从而实现API函数的拦截。
4、最后,程序员需要将系统API函数的原始内存地址保存起来,以便在不再需要拦截时,可以恢复原来的API函数调用行为。
Hook技术是一种强大的技术,可以用来实现各种功能,比如拦截软件的调用,拦截软件的输入输出,拦截系统函数的调用等。
Hook技术也可以用来实现防病毒,反垃圾邮件,防恶意程序,实现软件保护以及实现自定义控件等功能。
利用HOOK拦截封包原理
利用HOOK拦截封包原理.txt HHOOK SetWindowsHookEx(int idHook, // hook typeHOOKPROC lpfn, // hook procedureHINSTANCE hMod, // handle to application instanceDWORD dwThreadId // thread identifier);具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。
hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。
lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
之后,我们的代码就已经进入了系统内的所有进程空间了。
必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。
我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。
也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。
这是最关键的部分。
这里我想截三个调用,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个)。
钩子技术原理
钩子技术原理
钩子技术(Hooking)是一种在计算机编程中常用的技术,它允许开发者拦截和修改特定的操作或事件。
钩子技术的原理是通过在操作系统或应用程序中插入特定的代码段(钩子函数),以便在特定事件发生时执行自定义的操作。
以下是钩子技术的一般原理:
钩子注册:开发者通过调用操作系统提供的API函数,将自定义的钩子函数注册到目标操作系统或应用程序中。
这些API函数通常提供了不同类型的钩子,如键盘钩子、鼠标钩子、消息钩子等。
事件拦截:一旦钩子函数被注册,它将被插入到操作系统或应用程序的事件处理流程中。
当特定的事件发生时,操作系统或应用程序将调用已注册的钩子函数。
自定义操作:在钩子函数中,开发者可以执行自定义的操作。
这可以包括修改事件的参数、拦截和修改事件的处理流程、记录事件信息、发送自定义的消息等。
钩子链:在某些情况下,多个钩子函数可以被注册,并形成一个钩子链。
当事件发生时,钩子链中的每个钩子函数都会被依次调用,允许开发者在不同的层次上进行操作。
需要注意的是,钩子技术是一种强大的编程技术,但也需要谨慎使用。
滥用钩子技术可能会导致系统不稳定、安全漏洞或不可预测的行为。
因此,在使用钩子技术时,开发者应该遵循最佳实践,并确保对目标系统或应用程序的行为有充分的了解。
Delphi拦截网络数据封包
有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手来DIY吧.拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方法是自己实现一个代理的DLL.在这里我们使用HOOK API的方法,这样易于实现,而且也不会得到大量的无用数据(如第一种方法就会监视到所有的网络数据).下面是一个尽量简化了的API HOOK的模版,原理是利用消息钩子将DLL中的代码注入到目标进程中,再用GetProcAddress得到API函数入口地址,将函数入口址改为自己定义的函数入口,这样就得到了API函数的相应参数,处理完后,再改回真实API函数入口地址,并调用它.HOOK.DLL的代码:library Hook;usesSysUtils,windows,Messages,APIHook in 'APIHook.pas';typePData = ^TData;TData = recordHook: THandle;Hooked: Boolean;end;varDLLData: PData;{------------------------------------}{过程名:HookProc{过程功能:HOOK过程{过程参数:nCode, wParam, lParam消息的相{ 关参数{------------------------------------}procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall; beginif not DLLData^.Hooked thenbeginHookAPI;DLLData^.Hooked := True;end;//调用下一个HookCallNextHookEx(DLLData^.Hook, nCode, wParam, lParam); end;{------------------------------------}{函数名:InstallHook{函数功能:在指定窗口上安装HOOK{函数参数:sWindow:要安装HOOK的窗口{返回值:成功返回TRUE,失败返回FALSE{------------------------------------}function InstallHook(SWindow: LongWORD):Boolean;stdcall;varThreadID: LongWORD;Result := False;DLLData^.Hook := 0;ThreadID := GetWindowThreadProcessId(sWindow, nil);//给指定窗口挂上钩子DLLData^.Hook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, H instance, ThreadID);if DLLData^.Hook > 0 thenResult := True //是否成功HOOKelseexit;end;{------------------------------------}{过程名:UnHook{过程功能:卸载HOOK{过程参数:无{------------------------------------}procedure UnHook;stdcall;beginUnHookAPI;//卸载HookUnhookWindowsHookEx(DLLData^.Hook);end;{------------------------------------}{过程名:DLL入口函数{过程功能:进行DLL初始化,释放等{过程参数:DLL状态{------------------------------------}procedure MyDLLHandler(Reason: Integer);FHandle: LongWORD;begincase Reason ofDLL_PROCESS_ATTACH:begin //建立文件映射,以实现DLL中的全局变量FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ffff, 'MYDLLDATA');if FHandle = 0 thenif GetLastError = ERROR_ALREADY_EXISTS thenbeginFHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'MYDLLD ATA');if FHandle = 0 then Exit;end else Exit;DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);if DLLData = nil thenCloseHandle(FHandle);end;DLL_PROCESS_DETACH:beginif Assigned(DLLData) thenbeginUnmapViewOfFile(DLLData);DLLData := nil;end;end;end;end;{$R *.res}exportsInstallHook, UnHook, HookProc;beginDLLProc := @MyDLLHandler;MyDLLhandler(DLL_PROCESS_ATTACH);DLLData^.Hooked := False;end.----------------------------------------------------------------------------------------APIHook.Pas的代码:unit APIHook;interfaceusesSysUtils,Windows, WinSock;type//要HOOK的API函数定义TSockProc = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;PJmpCode = ^TJmpCode;TJmpCode = packed recordJmpCode: BYTE;Address: TSockProc;MovEAX: Array [0..2] of BYTE;end;//--------------------函数声明---------------------------procedure HookAPI;procedure UnHookAPI;varOldSend, OldRecv: TSockProc; //原来的API地址JmpCode: TJmpCode;OldProc: array [0..1] of TJmpCode;AddSend, AddRecv: pointer; //API地址TmpJmp: TJmpCode;ProcessHandle: THandle;implementation{---------------------------------------}{函数功能:Send函数的HOOK{函数参数:同Send{函数返回值:integer{---------------------------------------}function MySend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; vardwSize: cardinal;begin//这儿进行发送的数据处理MessageBeep(1000); //简单的响一声//调用直正的Send函数WriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); Result := OldSend(S, Buf, len, flags);JmpCode.Address := @MySend;WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSize); end;{---------------------------------------}{函数功能:Recv函数的HOOK{函数参数:同Recv{函数返回值:integer{---------------------------------------}function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; vardwSize: cardinal;begin//这儿进行接收的数据处理MessageBeep(1000); //简单的响一声//调用直正的Recv函数WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); Result := OldRecv(S, Buf, len, flags);JmpCode.Address := @MyRecv;WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize); end;{------------------------------------}{过程功能:HookAPI{过程参数:无{------------------------------------}procedure HookAPI;varDLLModule: THandle;dwSize: cardinal;beginProcessHandle := GetCurrentProcess;DLLModule := LoadLibrary('ws2_32.dll');AddSend := GetProcAddress(DLLModule, 'send'); //取得API地址AddRecv := GetProcAddress(DLLModule, 'recv');JmpCode.JmpCode := $B8;JmpCode.MovEAX[0] := $FF;JmpCode.MovEAX[1] := $E0;JmpCode.MovEAX[2] := 0;ReadProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); JmpCode.Address := @MySend;WriteProcessMemory(ProcessHandle, AddSend, @JmpCode, 8, dwSiz e); //修改Send入口ReadProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); JmpCode.Address := @MyRecv;WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize); //修改Recv入口OldSend := AddSend;OldRecv := AddRecv;end;{------------------------------------}{过程功能:取消HOOKAPI{过程参数:无{------------------------------------}procedure UnHookAPI;vardwSize: Cardinal;beginWriteProcessMemory(ProcessHandle, AddSend, @OldProc[0], 8, dwSize); WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize); end;end.---------------------------------------------------------------------------------------------编译这个DLL后,再新建一个程序调用这个DLL的InstallHook并传入目标进程的主窗口句柄就可:unit fmMain;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form s,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Edit1: TEdit;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;InstallHook: function (SWindow: THandle):Boolean;stdcall;UnHook: procedure;stdcall;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);varModuleHandle: THandle;TmpWndHandle: THandle;beginTmpWndHandle := 0;TmpWndHandle := FindWindow(nil, '目标窗口的标题');if not isWindow(TmpWndHandle) thenbeginMessageBox(self.Handle, '没有找到窗口', '!!!', MB_OK);exit;end;ModuleHandle := LoadLibrary('Hook.dll');@InstallHook := GetProcAddress(ModuleHandle, 'InstallHook');@UnHook := GetProcAddress(ModuleHandle, 'UnHook');if InstallHook(FindWindow(nil, 'Untitled')) thenShowMessage('Hook OK');end;procedure TForm1.Button2Click(Sender: TObject);beginUnHookend;这段代码讲解;找到winsock 中send和Recv 地址来回替换,send和recv是封包发送,接受的函数,其中参数,buf为其中的数据封包,就是本段程序要的,自己定义m yseng和myrecv来替换。
HOOK的原理
这种DLL注入方式有两个优点: 这种机制在Win 9x/Me和Win NT/2K中都是得到支持的,预计在以后的版本中也将得到支持;钩子DLL可以在不需要的时候,可由我们主动的调用 UnHookWindowsHookEx来卸载,比起使用注册表的机制来说方便了许多。尽管这是一种相当简洁明了的方法,但它也有一些显而易见的缺点:首先值得我们注意的是,Windows钩子将会降低整个系统的性能,因为它额外增加了系统在消息处理方面的时间;其次,只有当目标进程准备接受某种消息时,钩子所在的DLL才会被系统映射到该进程的地址空间中,钩子才能真正开始发挥作用,因此如果我们要对某些进程的整个生命周期内的API调用情况进行监控,用这种方法显然会遗漏某些API的调用 。
通常可采用的几种注入方式:
1.利用注册表
如果我们准备拦截的进程连接了User32.dll,也就是使用了User32.dll中的API(一般图形界面的应用程序都是符合这个条件),那么就可以简单把你的钩子驱动器DLL的名字作为值添加在下面注册表的键下: HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs 值的形式可以为单个DLL的文件名,或者是一组DLL的文件名,相邻的名称之间用逗号或空格间隔。所有由该值标识的DLL将在符合条件的应用程序启动的时候装载。这是一个操作系统内建的机制,相对其他方式来说危险性较小,但它也有一些比较明显的缺点:该方法仅适用于NT/2K操作系统,显然看看键的名称就可以明白;如果需要激活或停止钩子的注入,只有重新启动Windows,这个就似乎太不方便了;最后一点也很显然,不能用此方法向没有使用User32.dll的应用程序注入DLL,例如控制台应用程序等。另外,不管是否为你所希望,钩子DLL将注入每一个GUI应用程序,这将导致整个系统性能的下降!
e语言 超级hook原理
e语言超级hook原理超级Hook原理是一种常见的黑客技术,被广泛应用于软件逆向工程、漏洞利用和恶意软件攻击等领域。
本文将介绍超级Hook原理的基本概念、实现原理和应用场景。
一、超级Hook原理的基本概念超级Hook原理是指在Windows操作系统中,通过修改目标函数的地址,来实现对目标函数的重定向或篡改的一种技术手段。
超级Hook技术可以被用来绕过软件的安全检测、修改软件行为、隐藏恶意代码等,因此在黑客攻击中被广泛应用。
二、超级Hook原理的实现原理超级Hook技术的实现原理主要依赖于Windows操作系统的PE 文件格式和动态链接库(DLL)的加载机制。
下面是一个基本的超级Hook实现步骤:1. 选定目标函数。
超级Hook技术需要先选定一个目标函数,然后通过修改目标函数的地址,来实现对目标函数的重定向或篡改。
2. 获取目标函数地址。
在Windows操作系统中,每个PE文件都有一个导出表,用来记录该文件中可供外部程序调用的函数名称和地址。
因此,可以通过查找目标函数在导出表中的地址,来获取目标函数的地址。
3. 修改目标函数地址。
在Windows操作系统中,每个进程都有自己的地址空间,其中包括模块的基地址和导入表地址。
因此,可以通过修改目标函数在导入表中的地址,来实现对目标函数的重定向或篡改。
4. 执行修改后的代码。
一旦目标函数的地址被修改,程序在执行时会跳转到修改后的代码,从而实现对目标函数的重定向或篡改。
三、超级Hook原理的应用场景超级Hook技术可以被用来绕过软件的安全检测、修改软件行为、隐藏恶意代码等,因此在黑客攻击中被广泛应用。
下面是一些超级Hook技术的应用场景:1. 绕过软件安全检测。
一些软件会使用安全检测技术来防止被破解或篡改,如数字签名、反调试等。
超级Hook技术可以被用来绕过这些安全检测技术,从而实现软件的破解或篡改。
2. 修改软件行为。
超级Hook技术可以被用来修改软件的行为,如禁用某些功能、增加某些功能等。
python hook 函数原理
python hook 函数原理Hook函数是一种常见的编程方法,它用于在程序运行过程中拦截并处理系统或应用程序的事件。
在Python中,hook函数通常用于在用户执行特定操作时触发一些操作或执行某些代码。
本文将介绍Python中hook函数的原理及其实现方法。
一、hook函数的作用1. 监听网络连接事件在Python中,可以使用socket模块来创建网络连接,可以使用hook函数来监听网络连接事件。
网络连接事件可以是连接打开、连接关闭、连接异常等事件。
2. 监听文件IO事件在Python中,可以使用文件对象进行文件读写操作,可以使用hook函数来监听文件IO事件。
文件IO事件可以是文件读取、文件写入、文件关闭等事件。
3. 监听鼠标键盘事件在Python中,可以使用第三方库(如PyHook)来监听鼠标和键盘事件。
鼠标和键盘事件可以是按键、鼠标移动、鼠标单击等事件。
4. 监听系统事件Hook函数的原理是基于事件驱动编程的思想。
当系统或应用程序发生特定事件时,hook函数会被系统或应用程序自动调用。
在此过程中,hook函数会传递相应的参数给被调用的函数,以便在事件发生后进行相应的处理。
在Python中,hook函数可以使用装饰器或回调函数的形式进行实现。
使用装饰器实现hook函数时,可以在函数执行前或执行后进行调用,处理特定的事件。
使用回调函数实现hook函数时,可以在事件发生时将相应的函数(回调函数)注册到事件上,事件发生时自动调用。
在Python中,可以使用装饰器或回调函数的形式实现hook函数。
以下是两种实现方法的示例代码:1. 使用装饰器实现hook函数:```pythondef connect(func):def wrapper(*args, **kwargs):print('Connecting to the server...')return func(*args, **kwargs)return wrapper@connectdef send_data(data):print(f'Sending data: {data}')在上面的示例代码中,我们定义了`connect()`装饰器函数,并将其应用到`send_data()`函数上。
frida java层hook原理
frida java层hook原理Frida Java层Hook原理Frida是一款强大的动态分析工具,可以用于对Android应用进行逆向分析和应用程序的动态修改。
在Android开发中,Java层是应用程序的核心,在Java层进行Hook可以实现对应用程序的修改和控制。
本文将介绍Frida在Java层进行Hook的原理和实现方法。
一、Hook的基本概念和原理Hook是指在应用程序中拦截和修改函数调用的过程。
在Android 应用程序中,通过Hook可以截获应用程序的函数调用,修改其参数或返回值,甚至可以替换原有的函数实现。
Hook技术可以用于实现诸如函数跟踪、代码注入、动态调试等功能。
Frida是一款基于动态注入的Hook工具,它通过在目标进程中注入自己的代码来实现对应用程序的Hook。
Frida支持多种操作系统和架构,包括Android、iOS、Windows和macOS等。
在Android平台上,Frida主要通过Java层和Native层两种方式进行Hook。
二、Frida在Java层进行Hook的原理Frida在Java层进行Hook的原理主要有两个步骤:寻找目标函数和替换目标函数。
1. 寻找目标函数在Java层进行Hook时,首先需要确定目标函数的位置。
Frida提供了一些API来辅助寻找目标函数,比如通过类名和方法名来查找目标函数。
通过调用Frida提供的Java API,可以获取到目标函数的Method对象,进而获取到目标函数的地址。
2. 替换目标函数在找到目标函数之后,就可以通过Frida的Java API来替换目标函数了。
Frida提供了一些函数来实现Hook,比如intercept、replace等。
通过调用这些函数,可以将自定义的函数替换目标函数,实现对目标函数的修改和控制。
三、Frida在Java层进行Hook的实现方法在Frida中,可以使用JavaScript来编写Hook的代码。
利用HOOK拦截封包原理
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 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 dwPIDWatched;
HMODULE hLib;
if( dwCurrentPID == 0 )
{
dwCurrentPID = GetCurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
深⼊分析C#键盘勾⼦(Hook)拦截器,屏蔽键盘活动的详解钩⼦(Hook),是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。
当消息到达后,在⽬标窗⼝处理函数之前处理它。
钩⼦机制允许应⽤程序截获处理window消息或特定事件。
钩⼦实际上是⼀个处理消息的程序段,通过系统调⽤,把它挂⼊系统。
每当特定的消息发出,在没有到达⽬的窗⼝前,钩⼦程序就先捕获该消息,亦即钩⼦函数先得到控制权。
这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。
运⾏机制1、钩⼦链表和钩⼦⼦程:每⼀个Hook都有⼀个与之相关联的指针列表,称之为钩⼦链表,由系统来维护。
这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的回调函数,也就是该钩⼦的各个处理⼦程。
当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。
⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。
最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。
Windows 并不要求钩⼦⼦程的卸载顺序⼀定得和安装顺序相反。
每当有⼀个钩⼦被卸载,Windows 便释放其占⽤的内存,并更新整个Hook 链表。
如果程序安装了钩⼦,但是在尚未卸载钩⼦之前就结束了,那么系统会⾃动为它做卸载钩⼦的操作。
钩⼦⼦程是⼀个应⽤程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
⽤以监视系统或某⼀特定类型的事件,这些事件可以是与某⼀特定线程关联的,也可以是系统中所有线程的事件。
钩⼦⼦程必须按照以下的语法:复制代码代码如下:LRESULT CALLBACKHookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应⽤程序定义的名字。
hook原理
hook原理
Hook原理是一种编程手段,它可以在不修改源代码的情况下,通过在应用程序的关键步骤之前或之后插入特定的代码,来实现对应用程序的功能增强、维护或检测。
Hook原理是一种“挂钩”机制,即在应用程序运行时,通过挂钩机制,将第三方软件插入原来的程序中,从而实现功能拓展,是一种常用的API和操作系统级别的编程技术。
Hook原理可以用来实现各种功能,如增强处理器性能、实现数据存储、实现调试技术、运行安全性检查、更新应用程序、保护数据和确保安全等等。
Hook原理的实现可以通过几种方法,包括直接在应用程序的关键函数上添加hook代码,将hook代码作为程序的一部分添加,或使用已有的应用程序接口(API)来实现hook原理。
首先,要实现hook原理,就必须在应用程序的关键函数上添加hook代码,即在函数的入口处和出口处添加hook 代码,以便在函数的入口处检查函数的参数,在函数的出口处检查函数的返回值,并在此基础上实现相应的功能增强。
其次,可以将hook代码作为应用程序的一部分添
加,即在调用函数的入口处添加hook代码,以便在调用函数之前和之后进行检查,实现相应的功能增强。
另外,也可以利用已有的应用程序接口(API)来实现hook原理。
API中有一组特殊的函数,可以在应用程序的关键步骤之前或之后插入特定的代码,以便实现功能增强、维护或检测。
比如,Windows系统中的SetWindowHookEx函数,可以让用户在应用程序的特定消息发生时,即时地收到消息,从而实现功能增强或检测。
以上就是hook原理的实现方式。
hook原理广泛应用于编程中,可以实现各种功能,有助于提高应用程序的性能和安全性。
android hook技术原理
android hook技术原理Android Hook技术原理Android Hook技术是指通过修改Android系统或应用程序代码,以便在运行时拦截和修改程序的功能或行为。
通过Hook技术,可以实现对Android应用程序的各种操作,如修改应用程序的界面、修改应用程序的行为、监控应用程序的运行状态等。
本文将对Android Hook技术的原理进行详细介绍。
一、Hook技术的原理1. 什么是HookHook是一种技术手段,可以在程序运行的过程中,拦截并修改程序的行为。
在Android系统中,Hook技术可以通过修改系统的API调用,来改变应用程序的行为,实现对应用程序的控制。
2. Hook的实现方式在Android系统中,Hook技术可以通过两种主要的方式来实现:静态Hook和动态Hook。
静态Hook是通过修改应用程序的代码来实现的,需要对应用程序的源代码进行修改,并重新编译成新的应用程序。
这种方式需要对应用程序的代码结构和运行机制有较深的了解,并且需要有相应的开发工具和环境。
动态Hook是通过在应用程序运行时修改应用程序的行为来实现的,不需要对应用程序的源代码进行修改。
这种方式不需要对应用程序的代码结构和运行机制有深入的了解,只需要在运行时注入一些代码即可。
3. 动态Hook的原理动态Hook的实现主要依赖于Android系统的底层机制和技术,主要包括以下几个步骤:(1)定位目标方法:首先需要确定要Hook的目标方法,即需要拦截和修改的方法。
(2)获取目标方法的地址:通过反射等方式,获取目标方法在内存中的地址。
(3)修改目标方法的地址:通过修改目标方法在内存中的地址,将其指向Hook方法。
(4)实现Hook方法:Hook方法是指在目标方法执行前或执行后需要执行的代码。
可以通过编写一个Hook回调函数,来实现Hook方法的功能。
(5)完成Hook操作:将Hook方法的地址写入目标方法的地址中,完成Hook操作。
应用程序网络数据进行拦截
PJmpCode = ^TJmpCode;
TJmpCode = packed record
JmpCode: BYTE;
Address: TSockProc;
MovEAX: Array [0..2] of BYTE;
end;
//--------------------函数声明---------------------------
有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手来DIY吧.
拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方法是自己实现一个代理的DLL.在这里我们使用HOOK API的方法,这样易于实现,而且也不会得到大量的无用数据(如第一种方法就会监视到所有的网络数据).
if FHandle = 0 then Exit;
end else Exit;
DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData = nil then
case Reason of
DLL_PROCESS_ATTACH:
begin //建立文件映射,以实现DLL中的全局变量
FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ffff, 'MYDLLDATA');
hook函数的作用
hook函数的作用一、概述在软件开发中,hook函数指的是一种函数回调机制,用于拦截、修改或扩展原有函数的行为。
通过在特定时机注册hook函数,我们可以在目标函数执行前或执行后插入自定义代码,从而达到对目标函数行为的控制和定制。
二、hook函数的原理hook函数利用了函数指针的特性,通过在目标函数执行前后注册回调函数的方式,将自定义代码插入到目标函数的执行过程中。
具体而言,hook函数的原理如下:1.找到目标函数的函数指针。
2.将目标函数的函数指针保存起来,以便后续调用。
3.修改目标函数的函数指针,指向hook函数。
4.在hook函数中,执行自定义代码。
5.在hook函数中,调用保存的目标函数的函数指针,执行原有的目标函数。
通过这种方式,我们可以在目标函数执行之前或之后,插入自定义的代码逻辑,实现对目标函数行为的拦截、修改或扩展。
三、hook函数的应用场景hook函数广泛应用于软件开发中,常见的应用场景有:1. 动态修改函数行为通过hook函数,我们可以动态修改已经存在的函数的行为。
例如,我们可以在目标函数执行前打印日志,或者在目标函数执行后进行额外的处理。
这种方式可以实现在不修改源码的前提下,对已有功能进行定制和扩展。
2. 注入代码hook函数可以在特定的函数调用时,将自定义的代码注入到目标函数中。
通过在目标函数执行前或执行后插入代码,我们可以实现对目标函数行为的修改。
这种方式常用于调试、跟踪函数执行路径,或者在部分函数执行前做一些额外的处理。
3. 监控函数调用通过hook函数,我们可以监控特定函数的调用情况。
例如,我们可以在函数调用前后记录时间戳,统计函数的调用次数和耗时信息。
这种方式对于性能优化、统计分析等任务非常有用。
4. 系统级别的行为拦截和修改hook函数还可以在系统级别上实现行为的拦截和修改。
例如,在操作系统中,我们可以通过hook函数来拦截系统调用,并对调用进行修改,实现对系统行为的定制和控制。
hook 加密函数
hook 加密函数Hook加密函数是一种在计算机科学中常用的技术,用于保护数据的安全性。
通过对数据进行加密,可以防止未经授权的人员访问、修改或窃取数据。
本文将介绍Hook加密函数的原理、应用场景以及常见的加密算法。
一、Hook加密函数的原理在计算机科学中,Hook是一种用于拦截和修改函数调用的技术。
在加密函数中,Hook技术可以用于拦截数据的加密过程,从而实现对加密算法的修改或增强。
通过Hook加密函数,可以在数据加密的过程中插入额外的处理逻辑,以提高数据的安全性。
二、Hook加密函数的应用场景1. 数据库加密:Hook加密函数可以用于对数据库中的敏感数据进行加密,如用户密码、信用卡号等。
通过Hook技术,可以在数据存储或读取过程中对数据进行加密和解密。
2. 网络通信加密:Hook加密函数可以用于对网络通信中的数据进行加密,以保护数据的安全性。
通过拦截网络库中的加密函数,可以实现对数据的加密和解密,从而防止数据在传输过程中被窃取或篡改。
3. 文件加密:Hook加密函数可以用于对文件进行加密,以保护文件的机密性。
通过Hook技术,可以在文件读写过程中对数据进行加密和解密,从而防止文件被未经授权的人员访问或篡改。
三、常见的加密算法1. 对称加密算法:对称加密算法使用相同的密钥进行数据的加密和解密。
常见的对称加密算法有DES、AES等。
通过Hook加密函数,可以对对称加密算法进行增强,如增加密钥长度、增加加密轮数等,以提高数据的安全性。
2. 非对称加密算法:非对称加密算法使用一对密钥,即公钥和私钥,进行数据的加密和解密。
常见的非对称加密算法有RSA、DSA等。
通过Hook加密函数,可以对非对称加密算法进行修改,如增加密钥长度、增加加密算法复杂度等,以提高数据的安全性。
3. 哈希算法:哈希算法将任意长度的数据映射为固定长度的哈希值,常用于数据的完整性校验和数字签名。
常见的哈希算法有MD5、SHA1等。
通过Hook加密函数,可以对哈希算法进行增强,如增加哈希值的位数、增加哈希算法的复杂度等,以提高数据的安全性。
Hook(钩子技术)基本知识讲解,原理
Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。
就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。
HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。
xposed hook原理
xposed hook原理Xposed框架是一个用于Android系统的模块化框架,它可以通过实现各种模块来为Android系统增加一些功能和特性。
其中,最为重要的就是Xposed Hook原理,即通过在目标应用程序的代码中添加一些钩子函数,实现对应用程序的修改和控制。
这篇文章将详细介绍Xposed Hook 原理的工作原理和应用。
1. Hook原理的基本概念Hook原理是一种在计算机编程中非常常见的技术,它用于在运行时改变程序的行为。
Hook机制通过修改或替换目标函数的调用方式,从而实现对程序的控制或修改效果。
在Xposed框架中,Hook机制就是通过注入相关代码到目标应用程序中,在目标应用程序的方法和变量上添加一些定制的钩子,从而实现对目标应用程序的修改和控制。
2. Xposed Hook原理的工作流程在Xposed Hook原理中,Hook机制通过在程序运行时拦截、修改和替换目标函数的调用方式,以实现对目标应用程序的修改和控制。
其基本工作流程如下:1.安装Xposed框架。
Xposed框架的安装需要root权限,安装完成后会对系统进行相应的修改和配置。
2.编写或下载对应的Xposed模块。
Xposed框架支持用Java语言编写模块、反编译和修改目标应用程序的代码、以及利用已有的模块和工具等方式制作模块。
3.将编写好的Xposed模块安装到系统中。
在模块安装的过程中,会将模块中的相关代码注入到目标应用程序中,以实现对目标应用程序的修改和控制。
4.启动目标应用程序。
在目标应用程序启动时,Xposed框架会将其中的相关函数和变量进行Hook,以实现其他模块的修改和控制。
总的来说,Xposed Hook原理的工作流程需要进行三个阶段的操作:安装框架、安装模块、以及Hook目标应用程序的相关函数和变量。
3. Xposed Hook原理的应用场景Xposed Hook原理是一种十分强大的技术,它可以实现对目标应用程序的修改和控制,为Android系统提供更多的功能和特性。
安卓hook框架的原理
安卓hook框架的原理一、概述安卓hook框架是一种用于修改或替换应用程序行为的技术。
通过hook框架,可以在不修改应用程序源代码的情况下,实现对应用程序的修改和定制化。
本文将介绍安卓hook框架的原理。
二、Hook技术Hook技术是指在应用程序运行时,通过修改函数调用表或者中间代码(JIT)等方式,使得原始函数调用被替换为自定义函数调用。
Hook 技术可以实现对应用程序的动态修改和定制化。
三、Xposed框架Xposed框架是一种流行的安卓hook框架。
Xposed框架通过在系统启动时加载一个虚拟机,在虚拟机中运行自定义模块,从而实现对应用程序的hook。
具体来说,Xposed框架通过以下步骤实现hook:1. 在系统启动时,Xposed框架会创建一个虚拟机,并将自定义模块加载到虚拟机中。
2. 当用户打开一个应用程序时,Xposed框架会检测该应用程序是否被指定为需要hook的目标。
3. 如果该应用程序被指定为需要hook的目标,则Xposed框架会在目标进程中注入一个代理库,并将代理库与原始库进行替换。
4. 当应用程序调用原始库中的函数时,代理库会拦截该函数调用,并将其转发到自定义模块中的对应函数。
5. 自定义模块中的函数可以修改参数、返回值,或者完全替换原始函数。
四、Substrate框架Substrate框架是另一种流行的安卓hook框架。
Substrate框架通过在目标进程中注入一个动态链接库(Dylib),并使用LD_PRELOAD 环境变量将其加载到目标进程中,从而实现对应用程序的hook。
具体来说,Substrate框架通过以下步骤实现hook:1. 在系统启动时,Substrate框架会创建一个虚拟机,并将自定义模块加载到虚拟机中。
2. 当用户打开一个应用程序时,Substrate框架会检测该应用程序是否被指定为需要hook的目标。
3. 如果该应用程序被指定为需要hook的目标,则Substrate框架会在目标进程中注入一个代理库,并使用LD_PRELOAD环境变量将代理库加载到目标进程中。
android hook原理
android hook原理Android Hook技术是一种基于Java层的反射机制,通过修改系统的一些关键API,来达到篡改Android应用程序的目的,从而获取或控制应用程序的行为。
本文将详细介绍Android Hook的原理和实现方法。
1. Hook的原理Hook可以分为两种:静态Hook和动态Hook。
静态Hook是指Hook在应用程序启动前,通过修改系统中的类、方法等来达到影响应用程序行为的目的。
动态Hook是指Hook在应用程序运行时,通过注入Hook代码来实现影响应用程序行为的目的。
静态Hook在安卓4.x之前是比较流行的,基本上可以用来hook系统和第三方应用。
但随着系统发展,为了保证安全,在安卓4.x之后开始加强了安全机制,静态Hook的难度也随之提高。
而动态Hook具有更强的适应性和协作性,目前在逆向实践中,动态Hook方式逐渐成为主流。
Hook的核心原理就是替换原有的方法,使应用程序在调用原有方法时,实际上调用的是钩子函数。
例如要Hook的函数名为“test()”,通过Hook技术替换“test()”函数,在“test()”函数执行之前或之后注入手段对其进行修改或记录。
原始函数->钩子函数->原始函数返回值Hook技术主要使用反射机制,通过分析源代码,找到要Hook的函数的参数和返回值,就可以在Hook中重写该函数并调用原函数的参数和返回值,从而获得源代码的控制权。
根据不同的Hook目的和Hook对象,Hook技术可以分为以下三种:(1) 替换某个方法的实现:伪装成原始方法实现的外壳函数,放到系统中,通过调用这个外壳函数,同时可以偷偷读取原始函数的参数和返回值。
(2) 调用某个方法之前或之后增加其他功能:如AOP编程,如执行时间统计,打印调用堆栈信息等。
(3) 动态代理:通过动态代理技术,将Hook出来的对象接口交给代理,用来实现细节替换,最后调用原函数。
Hook技术的实现需要了解Java代码结构、反射机制和Java字节码等知识,还需要熟悉Android API的相关知识。
android java hook 原理
android java hook 原理下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在Android应用开发中,利用Java编程语言进行Hook是一种常见的技术手段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
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 );
DWORD dwOldBytes[3][2];
HANDLE hDebug = INVALID_HANDLE_value;
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
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 };
);
具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
::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 );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage;
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
if( dwCurrentPID == dwPIDWatched )
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",
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
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的执行结果返回给调用者。
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
hLib = LoadLibrary( "user32.dll" );
pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" );
之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
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 )
::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 );
::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
//Watch here after it's executed
{
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 );
::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
整个截获的过程就是这样。你可以把其中的写log部分改成你自己想要的操作。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,但这个我没有试验过。
截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。
首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下: