怎么拦截系统函数

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

 
主  题:  怎么拦截系统函数?(超高度难题!)

 

  在Dos下,我们可以拦截中断,用自己的处理替换系统中断,然后调用原来的中断,在Windows中,没有了中断,只有函数,那么我们如何来拦截系统的函数,然后我们的函数又调用原来的系统函数呢?比如说系统有一个GetSystemDirectory()函数,我想用我自己的函数替换它,经过我的函数MyGetSystemDirectory()进行处理,然后由我的函数调用原来的GetSystemDirectory()进行处理,该如何做到!如果能够解决,我可以再开贴子送分!目前只能给150分。
 
 
 
 回复人: wzs(兔子) ( ) 信誉:99  2000-11-11 12:09:00Z  得分:0
 
 
 
vxd编程!
 
 
Top
 
 回复人: tchaikov() ( ) 信誉:100  2000-11-11 12:19:00Z  得分:0
 
 
 
化点时间去看看
http://www.sysinternals.com/ntinternals.htm
http://www.sysinternals.com/filemon.htm
或许对你有好处。
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-11 13:40:00Z  得分:0
 
 
 
  呵呵,用VXD?太烦了,我知道可以用Delphi的内嵌汇编可以做到,这才是我要的效果!我看见有的人已经可以做到这一点,编译后的DCU文件才3KB,谁能够给出例程?快来拿分啊!
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-11 21:02:00Z  得分:0
 
 
 
  呵呵,请各位高手该出手时就出手!呵呵,千万别叫我用VXD。给出例程,马上给分!金山词霸取词就是拦截了TextOut,TextOutA吧?原理应该是一样的。Help Me!
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-12 21:26:00Z  得分:0
 
 
 
  快回答啊,各位高手!
 
 
Top
 
 回复人: mutant(异类) ( ) 信誉:100  2000-11-13 10:03:00Z  得分:0
 
 
 
楼上的,说错了.你是拦截消息,用钩子当然可以了.人家是替换函数,钩子能行吗?
拜托你看清楚问题再回答.
 
 
Top
 
 回复人: gameboy999(-'_'-) ( ) 信誉:100  2000-11-13 13:26:00Z  得分:10
 
 
 
钩子不行,也不是vxd,对了kingron,你可否买了csdn程序员大本营2000的微软版??
在vc版块里有你所需要的文章!!!!我昨天刚买的.我在网吧,没法贴那篇帖子,但我可以肯定那必然是你所需要的,(既动态重定向系统内部函数).
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-13 13:58:00Z  得分:0
 
 
 
 2:tchaikov
 我的机器不能够上国外的网站,用代理也不太行。多谢你的指点,而且我的E文太好,呵呵。
 2: GameBoy999
 对了,就是这个!呵呵,给VC的也行!我会一点儿VC,可以把它翻译过来!我没有买CSDN(在这个偏远的小城也很难买到,不知道有没有卖),麻烦你把它贴出来!
  呵呵,快点儿,就可以拿分了!那位先贴出来,先给分!
 
 
Top
 
 回复人: gameboy999(-'_'-) ( ) 信誉:100  2000-11-13 14:25:00Z  得分:0
 
 
 
to kingron:我也很想,不过我们这里的网吧不让上载,我很头疼这事情,我的原码也不能发上来,哎,您还是拜托一下人家吧:)
 
 
Top
 
 回复人: vcx(vcx) ( ) 信誉:100  2000-11-13 16:48:00Z  得分:20
 
 
 
用Detours或APIHOOKS 2.0。我也在研究这个问题,不知怎么老没有成功, Detours的原理是把DLL注入另一进程空间,APIHOOKS2.0我只成功了本进程的HOOK,不知哪为高手能给个成功的例子
谢谢!
 
 
Top
 
 回复人: 6bytes(吴下阿蒙) ( ) 信誉:100  2000-11-14 01:28:00Z  得分:0
 
 
 
If you mean redirect an API function so that your function gets called
instead, then try this:

Get the Entry point of the exported function in the dll.
Replace it in memory with the address of your own function.
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-14 07:53:00Z  得分:0
 
 
 
2 6bytes:
  how to do it?请给出例程。Delphi,VC的都行!
 
 
Top
 
 回复人: uestclx(乐乐) ( ) 信誉:100  2000-11-14 12:21:00Z  得分:0
 
 
 
trap 技术
我好像有原码
 
 
Top
 
 回复人: gameboy999(-'_'-) ( ) 信誉:100  2000-11-14 12:58:00Z  得分:0
 
 
 
to kringron:叫人家帮帮忙,把程序员大本营微软篇的vc下的activex下的那篇叫什么"陷阱技术探密"的文章贴出来.
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-16 12:10:00Z  得分:0
 
 
 
那位兄弟帮个忙,贴一下啊!陷阱技术探密的文章!
 
 
Top
 
 回复人: wr960204(武稀松) ( ) 信誉:94  2000-11-16 15:36:00Z  得分:0
 
 
 
与金山词霸原理相同,射击到DLL重入,好象要先写一个DLL,将系统DLL函数在内存中的的地址指向你的函数.有很多Windows内核的书都讲到不过几乎都是C++的代码
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-16 15:45:00Z  得分:0
 
 
 
2 wr960204:
  也行!只要达到目的即可,VC的没关系,我自己可以翻译,麻烦你贴出有关的文章好吗?
  呵呵,我想这个问题基本上每个人都看了吧?赶快出手啊!150哦!
 
 
Top
 
 回复人: ab(ab) ( ) 信誉:100  2000-11-16 15:51:00Z  得分:30
 
 
 
大家别争了,微软已经提供了这种开发包,就是上面 VCX 说的 Detours,到
http://www.research.microsoft.com/sn/detours
去下载。不过随带的文档太少了。
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-11-25 14:56:00Z  得分:0
 
 
 
哪儿有Detours的库文件下载?(.dll or .lib or .c or .h or .ocx......)
 
 
Top
 
 回复人: CoolSlob(我拿青春赌明天) ( ) 信誉:102  2000-11-26 19:26:00Z  得分:0
 
 
 
关注,Kingron!!!有了答案,能不能给我一份??????先谢了
 
 
Top
 
 回复人: temps(青石) ( ) 信誉:99  2000-11-28 12:45:00Z  得分:0
 
 
 
关注!!! 有答案 temps@263.net也希望可以得到一分
 
 
Top
 
 回复人: tibetty(laoduan) ( ) 信誉:100  2000-11-28 13:01:00Z  得分:0
 
 
 
在水木清华的Programming版探讨了不下十次, Matt Pietrek的<<Windows 95 System Programming Secret>>以及Jeffery Richter的<<Advanced Windows Programming>>
里面都有专门的探讨.
 
 
Top
 
 回复人: zheng(一笑) ( ) 信誉:100  2000-11-28 13:06:00Z  得分:0
 
 
 
guanzhu
 
 
Top
 
 回复人: Jujus(某人) ( ) 信誉:99  2000-11-28 13:59:00Z  得分:50
 
 
 
装载一篇文章,也许有用,但我在MSDN上没有查到IMAGE_IMPORT_DESCRIPTOR的结构,Kingron:你把它转成Delphi代码后记得给我发一份哦


如何截获API函数(转)
该程序是基于HOOK原理,主要是将自己的函数放到目标PROCESS的地址空间,这里是使用HOOK实现.首先建立一个MOUSE的HOOK程序,然后在全局鼠标HOOK的DLL中做截获动作,可以在PROCESS_ATTACH时做,也可以在鼠标的HOOK链函数中做.
建立全局HOOK就不说了,可以在网上很多地方看到.主要是截获动作.通过PE格式(使用IMAGE)改变API函数在调用时的地址.DLL部分参考如下代码:
static int WINAPI MyMessageBoxW(HWND hWnd , LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)//自己的MessageBoxW函数
{return MessageBox(hWnd, "TNT"/*lpText*/, "TNT"/*lpCaption*/, uType);
}
我定义了一个结构
typedef struct tag_HOOKAPI
{
LPCSTR szFunc;//待HOOK的API函数名
PROC pNewProc;//新的函数指针
PROC pOldProc;//老的函数指针
}HOOKAPI, *LPHOOKAPI;
extern "C" __declspec(dllexport)PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportMod)
{//首先是DOS头
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;
if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return NULL;
PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDOSHeader + (DWORD)(pDOSHeader->e_lfanew));
if(pNTHeader->Signature != IMAGE_NT_SIGNATURE) return NULL;
//如果没有Import部分,返回失败
if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
return NULL;
//取Import部分
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
((DWORD)pDOSHeader + (DWORD)(pNTHeader->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
//寻找与szImportMod相配部分
while (pImportDesc->Name)
{
PSTR szCurrMod = (PSTR)((DWORD)pDOSHeader + (DWORD)(pImportDesc->Name));
if (stricmp(szCurrMod, szImportMod) == 0)
break; //找到
pImportDesc++;
}
if(pImportDesc->Name == NULL) return NULL;
return pImportDesc;
}
extern "C" __declspec(dllexport) HookAPIByName(HMODULE hModule/*被HOOK的目标进程MODULE*/, LPCSTR szImportMod/*如GDI32.DLL*/,LPHOOKAPI pHookApi/*指定函数名,如"MessageBoxW"*/)
{
PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
GetNamedImportDescriptor(hModule, szImportMod);
if (pImportDesc == NULL)
return FALSE; //需要改换的API不能取到正确描PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->OriginalFirstThunk));
PIMAGE_THUNK_DATA pRealThunk =
(PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->FirstThunk));
while(pOrigThunk->u1.Function)
{
if((pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG)
{
PIMAGE_IMPORT_BY_NAME pByName = (PIMAGE_IMPORT_BY_NAME)((DWORD)hModule + (DWORD)(pOrigThunk->u1.AddressOfData));
if(pByName->Name[0] == '/0')
return FALSE; //失败
if(strcmpi(pHookApi->szFunc, (char*)pByName->Name) == 0)
{
//改变thunk保护属性
MEMORY_BASIC_INFORMATION mbi_thunk;
VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);
//保存原来的API函数指针
if(pHookApi->pOldProc == NULL)
pHookApi->pOldProc = (PROC)pRealThunk->u1.Function;
//改变API函数指针
pRealThunk->u1.Function = (PDWORD)pHookApi->pNewProc;
//将thunk保护属性改回来
DWORD dwOldProtect;
VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
mbi_thunk.Protect, &dwOldProtect);
}
}
pOrigThunk++;
pRealThunk++;
}
SetLastError(ERROR_SUCCESS);
return TRUE;
}

 
 
Top
 
 回复人: Jera(天~~~~塌下来我也不怕...) ( ) 信誉:100  2000-11-28 16:11:00Z  得分:0
 
 
 
太难了
 
 
Top
 
 回复人: tender_edge(温柔一刀) ( ) 信誉:100  2000-12-01 03:27:00Z  得分:0
 
 
 
>>我看见有的人已经可以做到这一点,编译后的DCU文件才3KB,谁能够给出例程?快来拿分啊!

在哪里?给我来一份这个DCU如何?
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-12-01 14:17:00Z  得分:0
 
 
 
2 TENDER_EDGE:
  已经G给你了。
2 all:
  我想我的问题已经快解决了,不过欢迎大家继续讨论,我有了答案之后会贴出来,然后给分。但是我的时间比较紧张,可能要过一段时间。谢谢各位!
 
 
Top
 
 回复人: bbsboyy() ( ) 信誉:100  2000-12-01 17:42:00Z  得分:0
 
 
 
密切关注!
KINGRON:研究出来DELPHI 版一定别忘了给哥们来一份.
liujw@163.net
 
 
Top
 
 回复人: alwssoan(巧克力) ( ) 信誉:100  2000-12-01 21:44:00Z  得分:0
 
 
 
谁说windows下没有中断,用内欠汇编语句。获取中断描述表即可,
实在不行发email给我吧,okinetboy@sina.com.cn
 
 
Top
 
 回复人: wr960204(武稀松) ( ) 信誉:94  2000-12-11 14:25:00Z  得分:0
 
 
 
程序员大本营CD上VC中有例子,好几个呢。我比较喜欢超级解霸II源码中的函数截获例子。还有几篇技术文章你可以参考一下。反正我对VC++不太熟悉,翻译不了。有些例子有现成的。DLL文件可用。
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-12-12 10:24:00Z  得分:0
 
 
 
2 wr960204:
超级解霸II源码中的函数截获例子?麻烦你贴出来好吗?我这儿没有程序员大本营的CD!
有现成的。DLL文件可用?哪儿有下载?哪儿有说明?
谢谢!
 
 
Top
 
 回复人: catthunder(男儿何不带吴钩) ( ) 信誉:100  2000-12-12 21:22:00Z  得分:0
 
 
 
纠正一下,WinApi也是系统调用,也用中断,怎么说windows下无中断?
 
 
Top
 
 回复人: GoodHope(好望角) ( ) 信誉:100  2000-12-12 21:50:00Z  得分:50
 
 
 
Windows中有中断,但是跟Dos下的一般说的中断完全不同了。Windows中已经不怎么用中断来实现通用功能了,提及中断实际上是说的硬件的中断行为,一般是由硬件触发。而Dos下往往代表的通过中断实现特定的功能,一般是软中断。catthunder说的WinApi是系统调用是对的,但WinApi绝对不是中断。保护模式下,中断是用过中断门进入的,不是普通的函数调用。
 
 
Top
 
 回复人: WorldCreater(造化天尊) ( ) 信誉:99  2000-12-12 23:09:00Z  得分:0
 
 
 
研究结果出来后给我一份好吗
primary@email.com.cn
 
 
Top
 
 回复人: GoodHope(好望角) ( ) 信誉:100  2000-12-13 10:58:00Z  得分:50
 
 
 
to Jujus:
  你给出代码中缺一个回车。
return FALSE; //需要改换的API不能取到正确描PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->OriginalFirstThunk));
应该是
return FALSE; //需要改换的API不能取到正确描
PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc->OriginalFirstThunk));

另外IMAGE_IMPORT_DESCRIPTOR在WinNT.h中定义,声明如下:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    };
    DWORD   TimeDateStamp;                  // 0 if not bound,
                                            // -1 if bound, and real date/time stamp
                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders
    DWORD   Name;
    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;

我正在研究Delphi该怎么写。
 
 
Top
 
 回复人: Kingron(单身走我路……) ( ) 信誉:117  2000-12-13 15:34:00Z  得分:0
 
 
 
2 goodhope:
  多谢上次的帮忙,这次恐怕又要麻烦你了。写出来的Delphi版给我一份好吗?谢谢了。
 
 
Top
 
 回复人: jimusi() ( ) 信誉:100  2000-12-13 15:56:00Z  得分:0
 
 
 
欢迎到“软件开发者”——“Visual C++”——“严肃讨论...”参加讨论
 
 
Top
 
 回复人: GoodHope(好望角) ( ) 信誉:100  2000-12-13 16:21:00Z  得分:0
 
 
 
to: Kingron
  上次?我很少看名字的:)
 
 
Top
 
 回复人: wxy_2000(风月无痕) ( ) 信誉:100  2000-12-13 16:56:00Z  得分:0
 
 
 
to: goodhope
我敬佩你,请继续努力,研究出来了别忘了给老兄一份。
wxy_2000@263.net
 
 
Top
 
 回复人: tchaikov() ( ) 信誉:100  2000-12-13 17:01:00Z  得分:0
 
 
 
lu0.126.com 上好象有这方面的专题,去看看吧。
 
 
Top
 
 回复人: GoodHope(好望角) ( ) 信誉:100  2000-12-13 17:20:00Z  得分:0
 
 
 
哦,Ring0啊。:)
 
 
Top
 
 回复人: gypb(网螺) ( ) 信誉:99  2000-12-13 17:45:00Z  得分:0
 
 
 
给我发一个
1stchina@elong.com
 
 
Top
 
 回复人: GoodHope(好望角) ( ) 信誉:100  2000-12-15 13:44:00Z  得分:50
 
 
 
// 我只是照着翻译了一下,可以编译通过。代码本身不全,所以没有进行任何的调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值