这个演示只能截取这个程序的Api,如何截获整个系统的Api呀!!!!(含制作API钩子,截获API的例子 源码)(16分)

  • 主题发起人 主题发起人 cntiny
  • 开始时间 开始时间
看了啊,可是小弟金钱有限,没能力,况且,我这也不是搞什么开发,只是想能明白为什么而已啊
希望大家帮忙!
 
to:薄荷
你的东东下载连接好像不能用了,能不能发个hookapi给我?
我的Email:xubaoqiang@taikang.com
 
怎么还没人最终解决啊??
 
to:薄荷
你的东东下载连接好像不能用了,能不能发个hookapi给我?
我的Email:mylove__47@sina.com
 
不是有本书叫《Delphi高级....》有现成的源代码
可惜书名忘记了,书在单位里
此书的附书光盘中有详细的源代码
在16位或32位下有不同的取词代码。
如果需要,我可以放在服务器中
可得要得到星期一啦,因为明后天是比休日,我的光盘在单位中!!!!
。。。。。
我就按此方法做了个Mouse Hook 来控制其他程序的鼠标按击及操作
如需要请留留个言,或发个MM vfphome@163.com
 
谁说非GUI进程不行,我也做了一个HookApi,Hook 消息,kernel32也可以注入。
我是Hook 注册表函数的。
但想问你们一下,是不是你们的HookApi在Win95/98/me下运行不正常,我的就是!
我也是用那种原理,递归找引用之DLL,然后找出对应函数地址,用writeprocessmemory
写入新函数地址。。。
在win2000/xp下正常,在win32系统就出错!!!!
 
to Rocklee
不会的啊 我写的hook winsock api的dll 在9x,2000/xp下 工作都很稳定
 
To panxiaosen:
你用的是不是我所说的方法?
 
前提是,用Delphi写的:(
 
查阅了一下你待答的问题就可得知,你不是用这种方法:(
http://www.delphibbs.com/delphibbs/dispq.asp?lid=847298
http://www.delphibbs.com/delphibbs/dispq.asp?lid=831132
 
to Rocklee
呵呵 那是以前的问题了 我现在也是用api hook的方法了
 
微软已经准备在下一个平台里关闭了Hook api的接口
 
可以讲一下你实现的原理不?
 
这个dll本来是用vc++写的 我用delphi重写了一下 在保持功能不变的情况下 体积从vc++的28k 变成了16K delphi写的软件体积不一定大哦 呵呵
原理就是替换api的头8个字节的内容
定义一个数组
btNewBytes:array[0..7] of byte = ($0B8, $0, $0, $40, $0, $0FF, $0E0, 0);
把这个数组的第一到第四个元素替换成api的地址就可以了 关键代码如下
ptextout := pdword(GetProcAddress( hLib, 'textouta' )); //得到原始textout地址
//读出老的函数前8个字节//
ReadProcessMemory(hProcess, ptextout, @dwOldBytes[0], sizeof(DWORD)*2, dwSize );
pdword(@btNewBytes[1])^:=DWORD(@new_textout);
WriteProcessMemory( hProcess,pointer(ptextout), @btNewBytes[0], sizeof(DWORD)*2, dwSize ); //然后用WriteProcessMemory函数重新写入
其中 new_textout是新的函数 我们在这个函数里先进行我们自己的操作 然后再调用原来的函数

这个代码我在9x 2000/xp下测试都很稳定 我利用这个dll写了一个软件 网址www.fxmake.com
 
好的,我吃完饭就试一下:))))
谢谢panxiaosen,双栖动物(C、Delphi)就是好:))
 
老大,还是不行,救命!
我按你的意思,把代码改成:
var btNewBytes: array[0..7] of byte = ($0B8, $0, $0, $40, $0, $0FF, $0E0, 0);
function PatchAddress(hProcess: Thandle; OldFunc, NewFunc: Pointer): Integer;
var BeenDone: TList;
function PatchAddressInModule(hModule: THandle; OldFunc, NewFunc: Pointer):
Integer;
const
SIZE = 4;
var Dos: PImageDosHeader; NT: PImageNTHeaders;
ImportDesc: PImage_Import_Entry; rva: DWORD;
Func: PPointer; DLL: string; f: Pointer; written: DWORD;
mbi_thunk: TMemoryBasicInformation;
dwOldProtect: DWORD;
nCount: DWORD;
Buf: array[0..3] of byte;
ptextout: pdword;
dwOldBytes: array[0..7] of byte;
begin
Result := 0;
if hModule < 32 then exit;
Dos := Pointer(hModule);
if BeenDone.IndexOf(Dos) >= 0 then exit;
BeenDone.Add(Dos);
//OldFunc := FinalFunctionAddress(OldFunc);
if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then exit;
if Dos.e_magic <> IMAGE_DOS_SIGNATURE then exit;
NT := Pointer(Integer(Dos) + dos._lfanew);
// if IsBadReadPtr(NT,SizeOf(TImageNtHeaders)) then exit;

RVA :=
NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

if RVA = 0 then exit;
ImportDesc := pointer(integer(Dos) + RVA);
while (ImportDesc^.Name <> 0) do begin
DLL := PChar(Integer(Dos) + ImportDesc^.Name);
PatchAddressInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
Func := Pointer(Integer(DOS) + ImportDesc.LookupTable);
while Func^ <> nil do begin
f := FinalFunctionAddress(Func^);
if f = FinalFunctionAddress(OldFunc) then begin
//WriteProcessMemory(GetCurrentProcess, Func, @NewFunc, 4, written);
VirtualQuery(Func, mbi_thunk,
sizeof(TMemoryBasicInformation));
{更改内存属性}
if not VirtualProtect(Func, SIZE,
//PAGE_EXECUTE_WRITECOPY or
PAGE_EXECUTE_READWRITE, mbi_thunk.Protect) then
log('VirtualProtectEx Error!')
else
log('VirtualProtectEx OK');
ptextout := pdword(OldFunc);
[red] ////////////////////这里/////////////////////[/red] ReadProcessMemory(hProcess, ptextout, @dwOldBytes[0], sizeof(DWORD) * 2, written);
pdword(@btNewBytes[1])^ := DWORD(@NewFunc);
if not WriteProcessMemory(hProcess, pointer(ptextout), @btNewBytes[0], sizeof(DWORD)*2, written)
{把新函数地址覆盖它}
then
log('Write memory error!')
else begin
log('Write memory OK!');
end;
if VirtualProtect(Func, SIZE, mbi_thunk.Protect,
dwOldProtect) then {恢复内存属性}
log('res:VirtualProtectEx OK!')
else
log('res:VirtualProtectEx error!');


if Written > 0 then
Inc(Result);
{log('Dll:'+dll+',Oldfun:'+
int2hex(integer(func),8)+
',Newfun:'+
int2hex(integer(@Newfunc),8));}
end;
Inc(Func);
end;
Inc(ImportDesc);
end;
end;


begin
if hProcess = 0 then exit;
BeenDone := TList.Create;
try
Result := PatchAddressInModule(GetModuleHandle(nil), OldFunc, NewFunc);
finally
BeenDone.Free;
end;
end;


而我原来的代码(在2000/XP里面可以)
function FinalFunctionAddress(Code: Pointer): Pointer;
var
func: PImportCode;
begin
Result := Code;
if Code = nil then exit;
try
func := code;
if (func.JumpInstruction = $25FF) then
{指令二进制码FF 25 汇编指令jmp [...]}
Func := func.AddressOfPointerToFunction^;
result := Func;
except
Result := nil;
end;
end;

function PatchAddress(hProcess: Thandle; OldFunc, NewFunc: Pointer): Integer;
var BeenDone: TList;

function PatchAddressInModule(hModule: THandle; OldFunc, NewFunc: Pointer):
Integer;
const
SIZE = 4;
var Dos: PImageDosHeader; NT: PImageNTHeaders;
ImportDesc: PImage_Import_Entry; rva: DWORD;
Func: PPointer; DLL: string; f: Pointer; written: DWORD;
mbi_thunk: TMemoryBasicInformation;
dwOldProtect: DWORD;
nCount: DWORD;
Buf: array[0..3] of byte;
begin
Result := 0;
if hModule < 32 then exit;
Dos := Pointer(hModule);
if BeenDone.IndexOf(Dos) >= 0 then exit;
BeenDone.Add(Dos);
//OldFunc := FinalFunctionAddress(OldFunc);
if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then exit;
if Dos.e_magic <> IMAGE_DOS_SIGNATURE then exit;
NT := Pointer(Integer(Dos) + dos._lfanew);
// if IsBadReadPtr(NT,SizeOf(TImageNtHeaders)) then exit;

RVA :=
NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

if RVA = 0 then exit;
ImportDesc := pointer(integer(Dos) + RVA);
while (ImportDesc^.Name <> 0) do begin
DLL := PChar(Integer(Dos) + ImportDesc^.Name);
PatchAddressInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc);
Func := Pointer(Integer(DOS) + ImportDesc.LookupTable);
while Func^ <> nil do begin
f := FinalFunctionAddress(Func^);
if f = OldFunc then begin
//WriteProcessMemory(GetCurrentProcess, Func, @NewFunc, 4, written);

VirtualQuery(Func, mbi_thunk,
sizeof(TMemoryBasicInformation));
{更改内存属性}
if not VirtualProtect(Func, SIZE,
//PAGE_EXECUTE_WRITECOPY or
PAGE_EXECUTE_READWRITE, mbi_thunk.Protect) then
log('VirtualProtectEx Error!')
else
log('VirtualProtectEx OK');
ReadProcessMemory(hProcess, Func, @Buf, SIZE, written);
if not WriteProcessMemory(hProcess, Func, @NewFunc, SIZE, written)
{把新函数地址覆盖它}
then
log('Write memory error!')
else begin
{if Comparetext('regedit.exe', ExtractName(GetModuleName(0))) <> 0 then
WriteProcessMemory(hProcess, Func, @Buf, SIZE, written);}
log('Write memory OK!');
end;
if VirtualProtect(Func, SIZE, mbi_thunk.Protect,
dwOldProtect) then {恢复内存属性}
log('res:VirtualProtectEx OK!')
else
log('res:VirtualProtectEx error!');


if Written > 0 then
Inc(Result);
{log('Dll:'+dll+',Oldfun:'+
int2hex(integer(func),8)+
',Newfun:'+
int2hex(integer(@Newfunc),8));}
end;
Inc(Func);
end;
Inc(ImportDesc);
end;
end;
begin
if hProcess = 0 then exit;
BeenDone := TList.Create;
try
Result := PatchAddressInModule(GetModuleHandle(nil), OldFunc, NewFunc);
finally
BeenDone.Free;
end;
end;
能帮我看看吗???
 
哎~~我的电脑还没好呢。有谁知道了解决的办法告诉我啊!!!实验成功了,帖出来大家看
 
天啊,说到实在的地方,就没人作声了。。。。。。
 
9494 , 这么好的帖子, 应该提前
怎么每人说话了
 
对付9x有些难度的!
 
后退
顶部