Api_hook 拦截 messageBox 等函数
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 等函数的更多相关文章
- 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数
1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...
- Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good
API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭. const IDTIMEDOUT = 32000; function MessageBoxTim ...
- C#-MessageBox全部函数重载形式及举例
Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...
- 详解MessageBox(),MsgBox函数的正确使用
//或者使用chr(13),chr(10)效果一样 MsgBox "a"&chr(13)&"b"&chr(10)&"c ...
- 第22章 DLL注入和API拦截(3)
22.6 API拦截的一个例子 22.6.1 通过覆盖代码来拦截API (1)实现过程 ①在内存中对要拦截的函数(假设是Kernel32.dll中的ExitProcess)进行定位,从而得到它的内存地 ...
- 实现拦截API的钩子(Hook)
道理不多讲,简单说就是将系统API的跳转地址,替换为我们自己写的API的地址,所以要求我们自定义的API函数要和被拦截的API有相同的参数.在用完后,记得恢复. 因为要挂全局的钩子,所以Hook的部分 ...
- 20145319 《网络渗透》免考—API拦截技术
20145319 <网络渗透>免考-API拦截技术 概述 本次实验在window环境下进行,主要通过编写hook代码和注入程序,将我们的hook代码通过dll文件的形式注入到目标中,拦截其 ...
- 《windows核心编程系列》二十二谈谈修改导入段拦截API。
一个模块的导入段包含一组DLL.为了让模块能够运行,这些DLL是必须的.导入段还包含一个符号表.它列出了该模块从各DLL中导入的符号.当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函 ...
- 【windows核心编程】一个API拦截的例子
API拦截 修改PE文件导入段中的导入函数地址 为 新的函数地址 这涉及PE文件格式中的导入表和IAT,PE文件中每个隐式链接的DLL对应一个IMAGE_IMPORT_DESCRIPTOR描述符结构, ...
随机推荐
- python用于web题里写解密脚本
题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...
- 02 DML(DataManipulationLanguage)
1.插入记录 基本语法 : INSERT INTO tbl_name (col_name ,col_name1,..,col_nameN) VALUES (val1,val2, ...
- 《ES6标准入门》(阮一峰)--7.数值的扩展
1.二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...
- pixi的图片处理
pixi的图片处理 var texture = PIXI.Texture.fromImage('sprite.png');var sprite = new PIXI.Sprite(texture) ...
- 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
在项目中添加src中添加NativeIO类 /** * Licensed to the Apache Software Foundation (ASF) under one * or more con ...
- DRF项目之通过业务逻辑选择数据集和序列化器
在REST后台开发中,我们需要通过业务逻辑来选择数据集或者序列化器. 选择数据集: # 重写get_queryset实现通过业务逻辑选择指定数据集 def get_queryset(self): '' ...
- enlipse 快捷键
ctrl+shift+o 去掉多余的引用类
- winfrom窗体的透明度
在VS中创建一个Winform项目,其默认的窗体名称为 Form1. 在VS设计界面中对 Form1 的 Opacity 属性值设置为 50%. 没错,就这样就可以了. 方法2: ...
- 实验吧-隐写术-刷新 刷新 快刷新(f5-steganography)
题目:刷新 刷新 快刷新 其实这就算是很好的提示了,刷新的时候就是F5嘛,这个题就是F5隐写,用f5-steganography来解题. 题中的图片: f5-steganography下载链接:htt ...
- Python MySQL 入门
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...