| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 785 人关注过本帖
标题:请问怎样堵住一个API函数的入口,使任何进程无法调用该函数[高难度]
只看楼主 加入收藏
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
收藏
 问题点数:0 回复次数:2 
请问怎样堵住一个API函数的入口,使任何进程无法调用该函数[高难度]

我想我要实用的回答,
最好有源代码

[此贴子已经被作者于2007-1-12 17:05:22编辑过]

搜索更多相关主题的帖子: API 函数 高难度 源代码 入口 
2007-01-12 17:03
radcat
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:306
专家分:45
注 册:2006-9-12
收藏
得分:0 

首先阐明你概念上的一个错误,所谓API函数只是系统提供给vc的一个接口,是一个vc源文件或一个dll文件,在编译过后编译器将其生成一系列的二进制代码,所以不能说堵住一个API函数的入口,但根据你的意思我想你大概是要阻止用户使用系统的某项功能,这是可以做到的,使用钩子函数可以监控系统中的所有消息,但具体做法会根据所要限制的不同而差别很大,甚至有的不需要编程实现,只需要修改注册表就行了,不知我说明白了没有.


2007-01-13 08:36
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 

那么请问怎样钩住ExitWindowsEx函数??
网上的代码根本无法编译!
请看:
[CODE]#include <windows.h>
#include <stdio.h>
#include <stddef.h>
#include <atlbase.h>
#include <ImageHlp.h>
#pragma comment(lib, "ImageHlp.lib")
#define HookExceptionNo 5
BOOL Init();
BOOL SysVer = true;
HMODULE g_hModule;
DWORD dwIdOld, dwIdNew;
//###############################################################
/* begin 这是拦截API所需要的代码*/
typedef struct
{
FARPROC funcaddr;
BYTE olddata[5];
BYTE newdata[5];
}HOOKSTRUCT;
HOOKSTRUCT MessageA_API;
void Ring0WriteMemory(void *dst, void *src, int copySize)
{
BYTE IDTR_1[6];
DWORD OldExceptionHook;
__asm
{
JMP __Continue

Ring0Proc:
PUSHAD

MOV AX,30h // 定义一个系统级别的数据段选择子

MOV BX,DS // 保存原DS与ES
MOV DX,ES

MOV DS,AX // 修改DS与ES
MOV ES,AX

REP MOVSB // 插入指令

MOV DS,BX // 复原DS与ES
MOV ES,DX
POPAD

IRETD //返回

__Continue:


SIDT FWORD PTR IDTR_1 // 修改中断门
MOV EAX,DWORD PTR IDTR_1+02h
ADD EAX,HookExceptionNo*08h+04h
CLI


MOV ECX,DWORD PTR [EAX] // 保存原异常处理例程入口
MOV CX,WORD PTR [EAX-04h]
MOV OldExceptionHook,ECX

LEA EBX,Ring0Proc // 指定新入口
MOV WORD PTR [EAX-04h],BX
SHR EBX,10h
MOV WORD PTR[EAX+02h],BX

PUSHAD // 配置参数
MOV EDI,dst
MOV ESI,src
MOV ECX,copySize

INT HookExceptionNo // 激活Ring0代码
POPAD

MOV ECX,OldExceptionHook // 复原入口
MOV WORD PTR[EAX-04h],CX
SHR ECX,10h
MOV WORD PTR[EAX+02h],CX

STI
}
}
void HookOnOne(HOOKSTRUCT *hookfunc)
{
if(SysVer)
{
HANDLE hProc;
dwIdOld = dwIdNew;
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
VirtualProtectEx(hProc, hookfunc->funcaddr, 5, PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata, 5, 0);
VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}
else
{
Ring0WriteMemory(hookfunc->funcaddr, hookfunc->newdata, sizeof(hookfunc->newdata));
}
}
//---------------------------------------------------------------------------
void HookOffOne(HOOKSTRUCT *hookfunc)
{
if(SysVer)
{
HANDLE hProc;
dwIdOld = dwIdNew;
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
VirtualProtectEx(hProc, hookfunc->funcaddr,5, PAGE_READWRITE, &dwIdOld);
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata, 5, 0);
VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}
else
{
Ring0WriteMemory(hookfunc->funcaddr, hookfunc->olddata, sizeof(hookfunc->olddata));
}
}
//获取被拦截函数信息
BOOL hookapi(char *dllname, char *procname, DWORD myfuncaddr, HOOKSTRUCT *hookfunc)
{
g_hModule = LoadLibrary(dllname);
hookfunc->funcaddr = GetProcAddress(g_hModule, procname);
if(hookfunc->funcaddr == NULL)
{
MessageBox(NULL, "获取原函数地址失败", "error", MB_OK);
return false;
}

memcpy(hookfunc->olddata, hookfunc->funcaddr, 5);
hookfunc->newdata[0] = 0xe9;
DWORD jmpaddr = myfuncaddr - (DWORD)hookfunc->funcaddr - 5;
memcpy(&hookfunc->newdata[1], &jmpaddr, 5);
return true;
}
int WINAPI MyMessageBoxA(HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType)
{
int runt;
HookOffOne(&api_MessageBoxA);
runt = ::MessageBoxA(hWnd, "拦截成功", lpCaption, uType);
HookOnOne(&api_MessageBoxA);
return runt;
}
BOOL Init() {
hookapi("user32.dll", "MessageBoxA", (DWORD)MyMessageBoxA, &api_MessageBoxA);
HookOnOne(&api_MessageBoxA);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
OSVERSIONINFO verinfo;
verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
dwIdNew = GetCurrentProcessId();
GetVersionEx(&verinfo);
if(verinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
SysVer = TRUE;
else
SysVer = FALSE;
return Init() ;
break;
case DLL_PROCESS_DETACH:
if(g_hModule != NULL)
FreeLibrary(g_hModule);
break;
}
return TRUE;
}[/CODE]
你能帮我整理成VC++源文件吗?(可以编译的)


天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2007-01-13 08:48
快速回复:请问怎样堵住一个API函数的入口,使任何进程无法调用该函数[高难度]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015213 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved