用JMP方法拦截API函数在WIN98下面不能用吗?

libertysigil 2005-02-05 05:47:22
//拦截方法没有用更改AIT, 而是用的JMP跳转, 在WIN2000/XP下面都能拦截. 就是在WIN98下面不能对指定的函数进行拦截, 不知道什么原因??
#include <windows>
#include <stdio.h>

typedef struct
{
FARPROC funcaddr;
BYTE olddata[5];
BYTE newdata[5];
}HOOKSTRUCT;
HOOKSTRUCT struct_DeleteFileA;
HOOKSTRUCT struct_DeleteFileW;

void HookOnOne(HOOKSTRUCT *hookfunc)
{
HANDLE hProc;
DWORD dwIdOld = GetCurrentProcessId();
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
VirtualProtect(hookfunc->funcaddr, 5, PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata, 5, 0);
VirtualProtect(hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}
void HookOffOne(HOOKSTRUCT *hookfunc)
{
HANDLE hProc;
DWORD dwIdOld = GetCurrentProcessId();
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
VirtualProtect(hookfunc->funcaddr,5, PAGE_READWRITE, &dwIdOld);
WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata, 5, 0);
VirtualProtect(hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}
//自定义的函数
BOOL WINAPI MyDeleteFileW(LPCTSTR lpFileName)
{
return TRUE;
}//自定义的函数
BOOL WINAPI MyDeleteFileA(LPCTSTR lpFileName)
{
return TRUE;
}
void MyFunc()
{
hookapi("kernel32.dll", "DeleteFileA", (DWORD)MyDeleteFileA, &struct_DeleteFileA);
hookapi("kernel32.dll", "DeleteFileW", (DWORD)MyDeleteFileW, &struct_DeleteFileW);
HookOnOne(&struct_DeleteFileA);
HookOnOne(&struct_DeleteFileW);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH)
MyFunc();

return TRUE;
}
...全文
221 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
classfree 2005-02-11
  • 打赏
  • 举报
回复
TO: rabo(不哭死人)
能不能把你的方法共享一下呢?
如何把拦截函数写进内核2GB的空间呢?
tabris17 2005-02-11
  • 打赏
  • 举报
回复


把HOOK处理函数写到内核的2GB空间就可以了
rabo 2005-02-10
  • 打赏
  • 举报
回复
俺98,2000都行。。。
baiyuanfan 2005-02-09
  • 打赏
  • 举报
回复
98下的API HOOK就有点类似NT下的nativeAPI HOOK了吧,呵呵,都要ring0
NowCan 2005-02-09
  • 打赏
  • 举报
回复
以前看过的一段代码,我没有试验过。
//
// 在Ring0状态下修改系统共享的代码
//
#define HookExceptionNo 5

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
}
}

BeRoy 2005-02-09
  • 打赏
  • 举报
回复
等答案。
Chice_wxg 2005-02-08
  • 打赏
  • 举报
回复
> 蓝屏到是没有。 只是不能拦截指定的API函数

就是因为没拦到


> 还有我在WIN2003里面拦截SendMessage时,目标进程会发生错误

方法问题吧。Win NT平台下不如用Detours库
Chice_wxg 2005-02-07
  • 打赏
  • 举报
回复






Win98 下 API 地址都是 0xB??????? ,位于高端2G空间中,是所有进程共享的,普通方法无权修改。





classfree 2005-02-07
  • 打赏
  • 举报
回复
蓝屏到是没有。 只是不能拦截指定的API函数
还有我在WIN2003里面拦截SendMessage时,目标进程会发生错误
Chice_wxg 2005-02-07
  • 打赏
  • 举报
回复



可以进ring 0,统统改掉。

而且有个前提,你的DLL也必须加载到高端内存里去。

否则其他进程没有这个DLL的映像,立刻兰屏。



classfree 2005-02-07
  • 打赏
  • 举报
回复
大家新年好. 谢谢大家的解答.
只是不知道WIN98下面还有什么办法能够拦截API呢?

更改IAT的方法不是很好. 有的函数拦不了
classfree 2005-02-07
  • 打赏
  • 举报
回复
难道WIN98下面就没有办法了吗??
  • 打赏
  • 举报
回复
关注。
najzni 2005-02-06
  • 打赏
  • 举报
回复
up
NowCan 2005-02-06
  • 打赏
  • 举报
回复
VirtualProtect(hookfunc->funcaddr, 5, PAGE_READWRITE,&dwIdOld);
怀疑在98下这个能不能成功,好像kernel32.dll,user32.dll,gdi32.dll中的函数在98下用这个方法hook都有问题。
EnochShen 2005-02-05
  • 打赏
  • 举报
回复
你可以试试这两个例子,第二个例子太长了,只能贴出关键的代码,我有一个这样的例子,如果有兴趣话给我发邮件EnochShen@QQ.com
EnochShen 2005-02-05
  • 打赏
  • 举报
回复
//新版本的Flip 这个是把缓存页面的东西Copy到主页面的函数
DefHookDApi(Flip7,HRESULT,(GUID FAR *lpGUID,LPDIRECTDRAWSURFACE7 lpdds, DWORD n))
{
//我们直接把东西Copy到后台页面
DrawText7(lpDDSB7,"Flip",0,0,RGB(0,0,0),RGB(255,255,0));
HRESULT ret=Real_Flip7(lpGUID,lpdds,n);
return ret;
}
//老版本的GetAttachedSurface 这个是绑定缓存页面到主页面的函数
DefHookDApi(GetAttachedSurface,HRESULT,(GUID FAR *lpGUID,LPDDSCAPS lpddscap,
LPDIRECTDRAWSURFACE FAR * lpdds))
{
//这里是得到游戏的缓存页面
HRESULT ret=Real_GetAttachedSurface(lpGUID,lpddscap,lpdds);
//保存缓存页面
lpDDSB=*lpdds;
return ret;
}
//新版本的GetAttachedSurface 这个是绑定缓存页面到主页面的函数
DefHookDApi(GetAttachedSurface7,HRESULT,(GUID FAR *lpGUID,LPDDSCAPS2 lpddscap,
LPDIRECTDRAWSURFACE7 FAR * lpdds))
{
//这里是得到游戏的缓存页面
HRESULT ret=Real_GetAttachedSurface7(lpGUID,lpddscap,lpdds);
lpDDSB7=*lpdds;
return ret;
}
//老版本的CreateSurface 这个是创建页面函数
DefHookDApi(CreateSurface,HRESULT,(GUID FAR *lpGUID,LPDDSURFACEDESC lpddsd,
LPDIRECTDRAWSURFACE FAR * lpdds,IUnknown FAR * pUnkOuter))
{
PROC p=NULL;
HRESULT ret=Real_CreateSurface(lpGUID,lpddsd,lpdds,pUnkOuter);
//判断页面是否是主页面
if(lpddsd->ddsCaps.dwCaps&DDSCAPS_PRIMARYSURFACE)
{
//保存主页面
lpDDSP=*lpdds;
//替换BltFast函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x1c);
HookDApi(BltFast,p);
if(lpddsd->dwFlags&DDSD_BACKBUFFERCOUNT)
{
//替换GetAttachedSurface函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x30);
HookDApi(GetAttachedSurface,p);
//替换Flip函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x2c);
HookDApi(Flip,p);
}
//替换Blt函数
p=*(PROC*)(*((DWORD*)lpDDSP)+0x14);
HookDApi(Blt,p);
}
//判断页面是否是离屏页面
if(lpddsd->ddsCaps.dwCaps&DDSCAPS_OFFSCREENPLAIN)
{

}
return ret;
}
//新版本的CreateSurface
DefHookDApi(CreateSurface7,HRESULT,(GUID FAR *lpGUID,LPDDSURFACEDESC2 lpddsd,
LPDIRECTDRAWSURFACE7 FAR * lpdds,IUnknown FAR * pUnkOuter))
{
PROC p=NULL;
HRESULT ret=Real_CreateSurface7(lpGUID,lpddsd,lpdds,pUnkOuter);
if(lpddsd->ddsCaps.dwCaps&DDSCAPS_PRIMARYSURFACE)
{
lpDDSP7=*lpdds;
if(lpddsd->dwFlags&DDSD_BACKBUFFERCOUNT)
{
p=*(PROC*)(*((DWORD*)lpDDSP7)+0x30);
HookDApi(GetAttachedSurface7,p);
p=*(PROC*)(*((DWORD*)lpDDSP7)+0x2c);
HookDApi(Flip7,p);
}
p=*(PROC*)(*((DWORD*)lpDDSP7)+0x14);
HookDApi(Blt7,p);
}
return ret;
}
//老版本DirectDrawCreate 创建DirectDraw函数
DefHookApi(DirectDrawCreate,HRESULT,(GUID FAR *lpGUID,LPDIRECTDRAW FAR *lplpDD,
IUnknown FAR *pUnkOuter))
{
// MessageBox(0,"DirectDrawCreate","",MB_OK);
HRESULT ret=Real_DirectDrawCreate(lpGUID,lplpDD,pUnkOuter);
if(*lplpDD!=NULL)
{
PROC p=NULL;
//保存DirectDraw指针
lpDD=*lplpDD;
//替换创建页面函数
p=*(PROC*)(*((DWORD*)lpDD)+0x18);
HookDApi(CreateSurface,p);
}
return ret;
}
//新版本DirectDrawCreateEx 创建DirectDraw7函数
DefHookApi(DirectDrawCreateEx,HRESULT,(GUID FAR * lpGuid, LPVOID *lplpDD,REFIID iid,
IUnknown FAR *pUnkOuter))
{
MessageBox(0,"DirectDrawCreateEx","",MB_OK);
HRESULT ret=Real_DirectDrawCreateEx(lpGuid,lplpDD,iid,pUnkOuter);
if((*((LPDIRECTDRAW7*)lplpDD))!=NULL)
{
PROC p=NULL;
//保存DirectDraw7指针
lpDD7=(LPDIRECTDRAW7)*lplpDD;
//替换创建页面函数
p=*(PROC*)(*((DWORD*)lpDD7)+0x18);
HookDApi(CreateSurface7,p);
}
return ret;
}

//不用看这个函数,他是3d游戏用来刷新的
DefHookDApi(SetTransform,HRESULT,(GUID FAR * lpGuid,D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix))
{
HRESULT ret;
if(State>D3DTS_VIEW)
// if(State>D3DTS_PROJECTION)
{
if(x>1.0f)
x=0.0f;
x=x+0.00001f;
D3DMATRIX m_matProj;
m_matProj._11 = pMatrix->_11+x;
m_matProj._12 = pMatrix->_12+x;
m_matProj._13 = pMatrix->_13+x;
m_matProj._14 = pMatrix->_14;
m_matProj._21 = pMatrix->_21;
m_matProj._22 = pMatrix->_22;
m_matProj._23 = pMatrix->_23;
m_matProj._24 = pMatrix->_24;
m_matProj._31 = pMatrix->_31;
m_matProj._32 = pMatrix->_32;
m_matProj._33 = pMatrix->_33;
m_matProj._34 = pMatrix->_34;
m_matProj._41 = pMatrix->_41;
m_matProj._42 = pMatrix->_42;
m_matProj._43 = pMatrix->_43;
m_matProj._44 = pMatrix->_44;
return Real_SetTransform(lpGuid,State,&m_matProj);
}
ret=Real_SetTransform(lpGuid,State,pMatrix);
return ret;
}

BOOL Win=FALSE;
//d3d8的CreateDevice 这个是3d游戏的创建函数
DefHookDApi(CreateDevice,HRESULT,(GUID FAR * lpGuid,UINT Adapter,D3DDEVTYPE DeviceType,
HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,
LPDIRECT3DDEVICE8* ppReturnedDeviceInterface))
{
//窗口模式
pPresentationParameters->Windowed = TRUE;
//必须关闭下面两个参数
pPresentationParameters->FullScreen_RefreshRateInHz=0;
pPresentationParameters->FullScreen_PresentationInterval=0;
//这个大家都见多了
if(!Win)
{
Win=TRUE;
LONG style,exstyle;
style= GetWindowLong(hFocusWindow,GWL_STYLE);
style=style | WS_CAPTION ;
SetWindowLong(hFocusWindow,GWL_STYLE,style);//修改窗体的exstyle属性
exstyle=GetWindowLong(hFocusWindow,GWL_EXSTYLE);
exstyle=exstyle | WS_EX_APPWINDOW | WS_EX_WINDOWEDGE ;
SetWindowLong(hFocusWindow,GWL_EXSTYLE,exstyle);//设置窗体的位置,取消其最前端显示,为图简单807,632是我自己随便设的//当然最好是先用AdjustWindowRect函数调整一下大小
SetWindowPos(hFocusWindow,HWND_NOTOPMOST,0,0,800,600,SWP_SHOWWINDOW);
ShowWindow(hFocusWindow,SW_SHOWNORMAL);
}
HRESULT ret=Real_CreateDevice(lpGuid,Adapter,DeviceType,hFocusWindow,BehaviorFlags,
pPresentationParameters,ppReturnedDeviceInterface);

if(*ppReturnedDeviceInterface!=NULL)
{
lpD3DDevice=*ppReturnedDeviceInterface;
PROC p=*(PROC*)(*((DWORD*)lpD3DDevice)+0x94);
HookDApi(SetTransform,p);
}
return ret;
}
//d3d的Direct3DCreate8 这个是创建D3D8函数
DefHookApi(Direct3DCreate8,LPDIRECT3D8,(UINT SDKVersion))
{
if( NULL==(lpD3D=Real_Direct3DCreate8(SDKVersion)))
return lpD3D;
PROC p=NULL;
p=*(PROC*)(*((DWORD*)lpD3D)+0x3c);
HookDApi(CreateDevice,p);
return lpD3D;
}
//锁定鼠标区域
DefHookApi(ClipCursor,BOOL,(RECT *lpRect))
{
// BOOL ret=Real_ClipCursor(lpRect);
return TRUE;
}

//设置窗口函数
BOOL SetWindow(HWND hWnd)
{
BOOL ret;
Win=TRUE;
LONG style,exstyle;
style= GetWindowLong(hWnd,GWL_STYLE);
style=style | WS_CAPTION ;
SetWindowLong(hWnd,GWL_STYLE,style);//修改窗体的exstyle属性
exstyle=GetWindowLong(hWnd,GWL_EXSTYLE);
exstyle=exstyle | WS_EX_APPWINDOW | WS_EX_WINDOWEDGE ;
SetWindowLong(hWnd,GWL_EXSTYLE,exstyle);//设置窗体的位置,取消其最前端显示,为图简单807,632是我自己随便设的//当然最好是先用AdjustWindowRect函数调整一下大小
ret=SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,800,600,SWP_SHOWWINDOW);
ShowWindow(hWnd,SW_SHOWNORMAL);
return ret;
}

//注入时的替换Api函数
VOID ReplaceApi(VOID)
{
//中断了DirectDrawCreate
HookApi(DirectDrawCreate);
//中断了DirectDrawCreateEx
HookApi(DirectDrawCreateEx);
//中断了Direct3DCreate8
// HookApi(Direct3DCreate8);
//中断了ClipCursor
// HookApi(ClipCursor); //为了解除鼠标限定区域
}
//程序初始化时运行:在未替换api前
VOID InitApp(VOID)
{
}
//程序退出时运行:在恢复api前
VOID ExitApp(VOID)
{
}
/////////////////////////////////////////////////////////////////
EnochShen 2005-02-05
  • 打赏
  • 举报
回复
//HookApi.cpp文件,定义函数过程
#include "stdafx.h"
#include "detours.h"
#include "HookApi.h"
#include "ReplaceApi.h"
#include "ddraw.h"
#include "d3d8.h"
#include "d3dx8math.h"

//////////////////////////////////////////////////////////////
//替换方法
//静态定义
//DefHookAPI(源API函数名,源API函数类型,源API函数参数) 参数格式:(参数1,参数2...)
//{
// //调用源函数方法:Real_源函数名(参数)
// return 返回值;
//}
//在ReplaceApi函数里添加HookAPI(源API函数名);
//**********************************************************
//动态
//DefHookDApi(源API函数名,源API函数类型,源API函数参数) 参数格式:(参数1,参数2...)
//{
// //调用源函数方法:Real_源函数名(参数)
// return 返回值;
//}
//HookDAPI(源API函数名,源API函数地址)
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
//DirectX老版本的 老版本指的是IDirectDraw接口
LPDIRECTDRAW lpDD=NULL;
LPDDSURFACEDESC lpDDSD=NULL;
LPDIRECTDRAWSURFACE lpDDSP=NULL;
LPDIRECTDRAWSURFACE lpDDSB=NULL;
//DirectX新版本的 新版本指的是IDirectDraw7接口
LPDIRECTDRAW7 lpDD7=NULL;
LPDDSURFACEDESC2 lpDDSD7=NULL;
LPDIRECTDRAWSURFACE7 lpDDSP7=NULL;
LPDIRECTDRAWSURFACE7 lpDDSB7=NULL;
//D3D8的
LPDIRECT3D8 lpD3D=NULL;
LPDIRECT3DDEVICE8 lpD3DDevice=NULL; // D3D设备
LPDIRECT3DVERTEXBUFFER8 lpD3DVB=NULL; // 顶点缓冲区

//保存的坐标偏移量
FLOAT x=0.0f;
//这是D3D用到的顶点结构
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
struct CUSTOMVERTEX
{
FLOAT x, y, z;// 顶点坐标
DWORD color;// 顶点颜色
};
//这个是往HDC写字的函数-老版本 这个函数我也不大明白,从别的的放抄的
HRESULT DrawText(LPDIRECTDRAWSURFACE m_pdds,TCHAR* strText,DWORD dwOriginX,DWORD dwOriginY,
COLORREF crBackground,COLORREF crForeground)
{
HDC hDC = NULL;
HRESULT hr;
HFONT hFont=NULL;
if( m_pdds == NULL || strText == NULL )
return E_INVALIDARG;

// Make sure this surface is restored.
if( FAILED( hr = m_pdds->Restore() ) )
return hr;

if( FAILED( hr = m_pdds->GetDC( &hDC ) ) )
return hr;

// Set the background and foreground color
SetBkColor( hDC, crBackground );
SetTextColor( hDC, crForeground );

if( hFont )
SelectObject( hDC, hFont );

// Use GDI to draw the text on the surface
TextOut( hDC, dwOriginX, dwOriginY, strText, strlen(strText) );

if( FAILED( hr = m_pdds->ReleaseDC( hDC ) ) )
return hr;

return S_OK;
}
//这个是往HDC写字的函数-新版本
HRESULT DrawText7(LPDIRECTDRAWSURFACE7 m_pdds,TCHAR* strText,DWORD dwOriginX,DWORD dwOriginY,
COLORREF crBackground,COLORREF crForeground)
{
HDC hDC = NULL;
HRESULT hr;
HFONT hFont=NULL;
if( m_pdds == NULL || strText == NULL )
return E_INVALIDARG;

// Make sure this surface is restored.
if( FAILED( hr = m_pdds->Restore() ) )
return hr;

if( FAILED( hr = m_pdds->GetDC( &hDC ) ) )
return hr;

// Set the background and foreground color
SetBkColor( hDC, crBackground );
SetTextColor( hDC, crForeground );

if( hFont )
SelectObject( hDC, hFont );

// Use GDI to draw the text on the surface
TextOut( hDC, dwOriginX, dwOriginY, strText, strlen(strText) );

if( FAILED( hr = m_pdds->ReleaseDC( hDC ) ) )
return hr;

return S_OK;
}
//老版本的BltFast 这个是从离屏页面Copy图片到后台页面的函数
DefHookDApi(BltFast,HRESULT,(DWORD x,DWORD y,LPDIRECTDRAWSURFACE lpdds, LPRECT lprc,DWORD n))
{
//我们直接把东西Copy到离屏页面
DrawText(lpdds,"BltFast",0,0,RGB(0,0,0),RGB(255,255,0));
HRESULT ret=Real_BltFast(x,y,lpdds,lprc,n);

return ret;
}
//老版本的Blt 这个是从后台页面Copy主页面的函数
DefHookDApi(Blt,HRESULT,(GUID FAR *lpGUID,LPRECT lprc,LPDIRECTDRAWSURFACE lpdds,LPRECT lprc1,
DWORD n, LPDDBLTFX n1))
{
//我们直接把东西Copy到后台页面
DrawText(lpdds,"Blt",0,0,RGB(0,0,0),RGB(255,255,0));
HRESULT ret=Real_Blt(lpGUID,lprc,lpdds,lprc1,n,n1);
return ret;
}
//新版本的Blt 这个是从后台页面Copy主页面的函数
DefHookDApi(Blt7,HRESULT,(GUID FAR *lpGUID,LPRECT lprc,LPDIRECTDRAWSURFACE7 lpdds,LPRECT lprc1,
DWORD n, LPDDBLTFX n1))
{
//我们直接把东西Copy到后台页面
DrawText7(lpdds,"Blt",0,0,RGB(0,0,0),RGB(255,255,0));
HRESULT ret=Real_Blt7(lpGUID,lprc,lpdds,lprc1,n,n1);
return ret;
}
//老版本的Flip 这个是把缓存页面的东西Copy到主页面的函数
DefHookDApi(Flip,HRESULT,(GUID FAR*lpGUID,LPDIRECTDRAWSURFACE lpdds, DWORD n))
{
//我们直接把东西Copy到缓存页面
DrawText(lpDDSB,"Flip",0,0,RGB(0,0,0),RGB(255,255,0));
HRESULT ret=Real_Flip(lpGUID,lpdds,n);
return ret;
}
EnochShen 2005-02-05
  • 打赏
  • 举报
回复
参考

#include "windows.h"
#include "dllhook1.h"

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(!init())
{
MessageBoxA(NULL,"Init","ERROR",MB_OK);
return(FALSE);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(bHook)
{ UninstallHook();
break;
}
}
return TRUE;
}

LRESULT Hook(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数
{
return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}

EXPORT BOOL InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary("dllhook1.dll");
g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);
if (!g_hHook)
{
MessageBoxA(NULL,"SET ERROR","ERROR",MB_OK);
return(FALSE);
}
return(TRUE);
}

EXPORT int UninstallHook()//输出御在钩子函数
{
return(UnhookWindowsHookEx(g_hHook));
}

BOOL init()//初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令
{
hModule=LoadLibrary("user32.dll");
pfMessageBoxA=GetProcAddress(hModule,"MessageBoxA");

if(pfMessageBoxA==NULL)
return FALSE;
_asm
{
lea edi,OldMessageBoxACode
mov esi,pfMessageBoxA
cld
movsd
movsb
}
NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧