library hookdll;

uses
SysUtils,
Windows,
Classes,
unitHook in 'unitHook.pas'; {$R *.res} const
HOOK_MEM_FILENAME = 'tmp.hkt'; var
hhk: HHOOK;
Hook: array[..] of TNtHookClass; //内存映射
MemFile: THandle;
startPid: PDWORD; //保存PID {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //拦截 MessageBoxA
function NewMessageBoxA(_hWnd: HWND; lpText,
lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
type
TNewMessageBoxA = function (_hWnd: HWND; lpText,
lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
lpText := PAnsiChar('已经被拦截 MessageBoxA');
Hook[].UnHook;
Result := TNewMessageBoxA(Hook[].BaseAddr)(_hWnd, lpText, lpCaption, uType);
Hook[].Hook;
end; //拦截 MessageBoxW
function NewMessageBoxW(_hWnd: HWND; lpText,
lpCaption: PWideChar; uType: UINT): Integer; stdcall;
type
TNewMessageBoxW = function (_hWnd: HWND; lpText,
lpCaption: PWideChar; uType: UINT): Integer; stdcall;
begin
lpText := '已经被拦截 MessageBoxW';
Hook[].UnHook;
Result := TNewMessageBoxW(Hook[].BaseAddr)(_hWnd, lpText, lpCaption, uType);
Hook[].Hook;
end; //拦截 MessageBeep
function NewMessageBeep(uType: UINT): BOOL; stdcall;
type
TNewMessageBeep = function (uType: UINT): BOOL; stdcall;
begin
Result := True;
end; //拦截 OpenProcess , 防止关闭
function NewOpenProcess(dwDesiredAccess: DWORD;
bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
type
TNewOpenProcess = function (dwDesiredAccess: DWORD;
bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
begin
if startPid^ = dwProcessId then
begin
result := ;
Exit;
end;
Hook[].UnHook;
Result := TNewOpenProcess(Hook[].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);
Hook[].Hook;
end; {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //安装API Hook
procedure InitHook;
begin
Hook[] := TNtHookClass.Create('user32.dll', 'MessageBoxA', @NewMessageBoxA);
Hook[] := TNtHookClass.Create('user32.dll', 'MessageBeep', @NewMessageBeep);
Hook[] := TNtHookClass.Create('user32.dll', 'MessageBoxW', @NewMessageBoxW);
Hook[] := TNtHookClass.Create('kernel32.dll', 'OpenProcess', @NewOpenProcess);
end; //删除API Hook
procedure UninitHook;
var
I: Integer;
begin
for I := to High(Hook) do
begin
if Assigned(hook[I])then //zl自己加的判断
FreeAndNil(Hook[I]);
end;
end; {--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--} //内存映射共享
procedure MemShared();
begin
MemFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MEM_FILENAME);
//打开内存映射文件
if MemFile = then
begin //打开失败则衉c2建内存映射文件
MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, ,
, HOOK_MEM_FILENAME);
end;
if MemFile <> then
//映射文件到变量
startPid := MapViewOfFile(MemFile,FILE_MAP_ALL_ACCESS,,,);
end; //传递消息
function HookProc(nCode, wParam, lParam: Integer): Integer; stdcall;
begin
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
end; //开始HOOK
procedure StartHook(pid: DWORD); stdcall;
begin
UninitHook;//zl自己加的 startPid^ := pid;
hhk := SetWindowsHookEx(WH_CALLWNDPROC, HookProc, hInstance, ); InitHook;////zl自己加的
end; //结束HOOK
procedure EndHook; stdcall;
begin
if hhk <> then
begin
UnhookWindowsHookEx(hhk);
UninitHook;//zl自己加的
end;
end; //环境处理
procedure DllEntry(dwResaon: DWORD);
begin
case dwResaon of
//DLL_PROCESS_ATTACH: InitHook; //DLL载入 //zl自己屏蔽的
DLL_PROCESS_DETACH: UninitHook; //DLL删除
end;
end; exports
StartHook, EndHook; begin
MemShared; { 分配DLL程序到 DllProc 变量 }
DllProc := @DllEntry;
{ 调用DLL加载处理 }
DllEntry(DLL_PROCESS_ATTACH);
end. unit unitHook; interface uses
Windows, Messages, Classes, SysUtils; type //NtHook类相关类型
TNtJmpCode=packed record //8字节
MovEax:Byte;
Addr:DWORD;
JmpCode:Word;
dwReserved:Byte;
end; TNtHookClass=class(TObject)
private
hProcess:THandle;
NewAddr:TNtJmpCode;
OldAddr:array[..] of Byte;
ReadOK:Boolean;
public
BaseAddr:Pointer;
constructor Create(DllName,FuncName:string;NewFunc:Pointer);
destructor Destroy; override;
procedure Hook;
procedure UnHook;
end; implementation //==================================================
//NtHOOK 类开始
//==================================================
constructor TNtHookClass.Create(DllName: string; FuncName: string;NewFunc:Pointer);
var
DllModule:HMODULE;
dwReserved:DWORD;
begin
//获取模块句柄
DllModule:=GetModuleHandle(PChar(DllName));
//如果得不到说明未被加载
if DllModule= then DllModule:=LoadLibrary(PChar(DllName));
//得到模块入口地址(基址)
BaseAddr:=Pointer(GetProcAddress(DllModule,PChar(FuncName)));
//获取当前进程句柄
hProcess:=GetCurrentProcess;
//指向新地址的指针
NewAddr.MovEax:=$B8;
NewAddr.Addr:=DWORD(NewFunc);
NewAddr.JmpCode:=$E0FF;
//保存原始地址
ReadOK:=ReadProcessMemory(hProcess,BaseAddr,@OldAddr,,dwReserved);
//开始拦截
Hook;
end; //释放对象
destructor TNtHookClass.Destroy;
begin
UnHook;
CloseHandle(hProcess); inherited;
end; //开始拦截
procedure TNtHookClass.Hook;
var
dwReserved:DWORD;
begin
if (ReadOK=False) then Exit;
//写入新的地址
WriteProcessMemory(hProcess,BaseAddr,@NewAddr,,dwReserved);
end; //恢复拦截
procedure TNtHookClass.UnHook;
var
dwReserved:DWORD;
begin
if (ReadOK=False) then Exit;
//恢复地址
WriteProcessMemory(hProcess,BaseAddr,@OldAddr,,dwReserved);
end; end. procedure StartHook(pid: DWORD); stdcall; external 'hookdll.dll';
procedure EndHook; stdcall; external 'hookdll.dll'; implementation {$R *.dfm} procedure TfrmMain.btnHookClick(Sender: TObject);
begin
StartHook(GetCurrentProcessId);
end; procedure TfrmMain.btnUnhookClick(Sender: TObject);
begin
EndHook;
end; procedure TfrmMain.Button1Click(Sender: TObject);
begin
MessageBox(, '呵呵健健康康', nil, );
end;

Api_hook 拦截 messageBox 等函数的更多相关文章

  1. 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  2. Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good

    API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭. const IDTIMEDOUT = 32000; function MessageBoxTim ...

  3. C#-MessageBox全部函数重载形式及举例

    Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  4. 详解MessageBox(),MsgBox函数的正确使用

    //或者使用chr(13),chr(10)效果一样 MsgBox "a"&chr(13)&"b"&chr(10)&"c ...

  5. 第22章 DLL注入和API拦截(3)

    22.6 API拦截的一个例子 22.6.1 通过覆盖代码来拦截API (1)实现过程 ①在内存中对要拦截的函数(假设是Kernel32.dll中的ExitProcess)进行定位,从而得到它的内存地 ...

  6. 实现拦截API的钩子(Hook)

    道理不多讲,简单说就是将系统API的跳转地址,替换为我们自己写的API的地址,所以要求我们自定义的API函数要和被拦截的API有相同的参数.在用完后,记得恢复. 因为要挂全局的钩子,所以Hook的部分 ...

  7. 20145319 《网络渗透》免考—API拦截技术

    20145319 <网络渗透>免考-API拦截技术 概述 本次实验在window环境下进行,主要通过编写hook代码和注入程序,将我们的hook代码通过dll文件的形式注入到目标中,拦截其 ...

  8. 《windows核心编程系列》二十二谈谈修改导入段拦截API。

    一个模块的导入段包含一组DLL.为了让模块能够运行,这些DLL是必须的.导入段还包含一个符号表.它列出了该模块从各DLL中导入的符号.当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函 ...

  9. 【windows核心编程】一个API拦截的例子

    API拦截 修改PE文件导入段中的导入函数地址 为 新的函数地址 这涉及PE文件格式中的导入表和IAT,PE文件中每个隐式链接的DLL对应一个IMAGE_IMPORT_DESCRIPTOR描述符结构, ...

随机推荐

  1. cmf公共函数解析

    cmf公共函数解析-common.php 路径:thinkcmf\simplewind\cmf\common.php方法: 方法 作用 返回值 cmf_get_current_admin_id    ...

  2. javascript实现ul中列表项随机排列

    方法1 <!DOCTYPE html><html lang="en"><head> <script type="text/jav ...

  3. NIO 组件Buffer

    重要属性 属性 描述 Capacity 容量, 即可以容纳的最大数据量; 在缓冲区创建时被设定并且不能改变 Limit 表示缓冲区的当前终点, 不能对缓冲区超过极限的位置进行读写操作, 且极限是可以修 ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-chevron-right

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. poj 2376 Cleaning Shifts 最小区间覆盖

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40751   Accepted: 9871 ...

  6. P1003 我要通过!

    转跳点:

  7. golang 读取 chrome保存的网站账号信息

    package main import ( "database/sql" "fmt" "log" "os" " ...

  8. SSM整合搭建过程中的一个怪异问题

    好久没有搭建框架了,昨天开始试图搭建一个SSM框架,各种配置文件搭建成功,服务器也启动正确,但是在运行过程中,发现总是不能获取JDBC,不能够创建连接池工厂,报错如下:网页报500错误码 SEVERE ...

  9. 使用git提交远程仓库

    git pull    更新 git add 文件名   将文件添加到暂存区 git commit -m ‘注释’   提交 git push origin master   提交到远程仓库

  10. css画布

    绘制基本图形 绘制直线 <style> .canvas{ } </style> <canvas id="myCanvas1" style=" ...