易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi Hook API 已疯狂

作者: yangyxd   转载请注明出处 http://hi.baidu.com/yangyxd   2009-3-12
     论坛里有关于HOOK API的贴子, 但其实现在方式显示得麻烦, 其实现在拦截API一般不用那种方式, 大都采用inline Hook API方式。其实也就是直接修改了要拦截的API源码的头部,让它无条件跳转到我们自己的处理过程。
   不多说别的了,开始我们自己的Hook API吧。
   我们今天要拦截的API如下:
   MessageBoxA、MessageBoxW、MessageBeep 和 OpenProcess 。
   首先,大家都知道要在整个系统范围中拦截,需要使用Dll来完成。现在我们打开Delphi 2009,新建一个Dll工程:hookDll。需要说明的是,Delphi是完全面向对象的编程语言,所以我们不要浪费,这个Dll打算用类的方式完成。于是,在新建的DLL工程中在添加一个Unit Pas,命名为unitHook, 用来写拦截类的处理。unitHook.pas中的代码如下:
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[0..7] 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=0 then DllModule:=LoadLibrary(PChar(DllName));
//得到模块入口地址(基址)
BaseAddr:=Pointer(GetProcAddress(DllModule,PChar(FuncName)));
//获取当前进程句柄
hProcess:=GetCurrentProcess;
//指向新地址的指针
NewAddr.MovEax:=$B8;
NewAddr.


相关文档:

Delphi中控制VBA 宏

如何在Delphi里面利用Word的VBA代码进行一些总结。
1、  生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动 ......

Delphi调用外部程序详解

WinExec主要运行EXE文件。如:
WinExec("Notepad.exe Readme.txt", SW_SHOW);
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
首先必须引用shellapi.pas单元:uses ShellAPI; 
1.标准用法 
   ShellExecute函数原型及参数含义如下: 
function ShellExecute(hWnd: HWND; Operati ......

是vc的bug还是delphi的bug?

最近一阵子,总是被一个莫名其妙的bug困扰。自己写的ocx(.net2005)在delphi7中调用,明明没有释放主动释放过内存,却被连续释放了两次。结果,程序退出时就down掉了。当然,这是在debug模式下才会出现,但是exe跑的时候会莫名奇妙的down掉,而且出错往往指向ocx,我想一定和ocx的调用有关。
上网找了purify,boundscheck ......

Delphi 开篇

Delphi
Delphi这是一个windows桌面编程软件,现在版本有很多,主要用的还是Delphi7,7以上的版本都需要装.net
静态调用和动态调用,静态调用就是直接往窗体上托控件,而动态调用就是编写代码调用控件的类实现一些功能。
通常情况下都是这两种方式相结合的使用,随着Delphi的深入,就会发现托控件不是万能的,很多时候都 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号