能力值:
( LV2,RANK:10 )
|
-
-
2 楼
[QUOTE=;]...[/QUOTE]
早上起来继续搞,发现昨天的dll只有注入VC的程序才有效,VB、DELPHI都不能成功HOOK到,我的dll是用VC做的,难道只能HOOK用VC做的程序中的API ?
|
能力值:
( LV9,RANK:850 )
|
-
-
3 楼
发你的dll出来看下
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
#define HookModName "kernel32.dll" //HOOK的模块和API
#define HookApiName "ReadProcessMemory"
//修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8个字节
BYTE g_dwOldBytes[8] = { 0x00, 0x0, 0x0, 0x00, 0x0, 0x00, 0x00, 0x0 };
//API地址
void * m_AddrAPI;
//定义自己的API,参数表和原函数一致,MyHookAPI中调用的也一样
int WINAPI MyHookAPI(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T * lpNumberOfBytesRead // number of bytes read
);
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH)
{
//找到API地址
HMODULE hWsock = LoadLibrary(HookModName);
m_AddrAPI = (void *)GetProcAddress( hWsock,HookApiName);
//保存原始字节
ReadProcessMemory((void *)GetCurrentProcess(),m_AddrAPI, ( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
//将00400000替换为我们函数的地址
*( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )MyHookAPI;
//改写API跳向MyHookAPI
WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
//::memcpy(m_AddrAPI,g_btNewBytes,8);
}
return TRUE;
}
int _stdcall MyHookAPI(
HANDLE hProcess, // handle to the process
LPCVOID lpBaseAddress, // base of memory area
LPVOID lpBuffer, // data buffer
SIZE_T nSize, // number of bytes to read
SIZE_T * lpNumberOfBytesRead // number of bytes read
)
{
//恢复原入口
WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
//调用
::ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
if ( 12345678 == *(PDWORD)lpBuffer)
*(PDWORD)lpBuffer = 87654321; //半路打劫
//重新改写,为下次调用
WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
return 0;
}
说明下:
MFC扩展DLL,思路很简单,第一次加载后修改原API入口为JMP MyHookAPI,在自定义的API里:先还原--执行原API--发现感兴趣的东西(半路打劫)--设置好下次打劫准备
请指点下哪里出的问题,目前只能用于HOOK VC的程序,MFC 和 SDK的都能成功,VB DELPHI E语言都不成功,别的没测试
|
能力值:
( LV9,RANK:850 )
|
-
-
5 楼
上面的代码我编译了一次。测试vb和一个加tmd的delphi都可以正常hook,不知你说不成功的是什么状况
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我在目标程序中写入 12345678 ,用VC的读时能被HOOK,数据改为 87654321,用别的语言做的程序,就只能读到原数据 12345678,难道是我机器的问题?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
大财大哥:
你稍等下,我把HOOK的函数改成MessageBox,这样好测试,然后我给你发个delphi的程序,你测试下,稍等
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
[QUOTE=;]...[/QUOTE]
改成HOOK MessageBox的了,麻烦你编译下
#define HookModName "user32.dll" //HOOK的模块和API
#define HookApiName "MessageBoxA"
//修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8个字节
DWORD g_dwOldBytes[8] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
//API地址
void * m_AddrAPI;
//定义自己的API,参数表和原函数一致,MyHookAPI中调用的也一样
int WINAPI MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH)
{
//找到API地址
HMODULE hWsock = LoadLibrary(HookModName);
m_AddrAPI = (void *)GetProcAddress( hWsock,HookApiName);
//保存原始字节
ReadProcessMemory(INVALID_HANDLE_VALUE,m_AddrAPI, ( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
//将00400000替换为我们函数的地址
*( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )MyHookAPI;
//改写API跳向MyHookAPI
WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
}
return TRUE;
}
int _stdcall MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
//恢复指令
WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
//调用
int Ret = ::MessageBox(hWnd,lpText,"HOOK",uType);
//重新改写,为下次调用
WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
return Ret;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
[QUOTE=;]...[/QUOTE]
在进入 MyHookAPI 后加一条命令
OutputDebugString("HOOK");
观察DebugView窗口,VC的程序都被HOOK到了,别的程序没有
|
能力值:
( LV9,RANK:850 )
|
-
-
10 楼
刚测试了一个delphi, 一切正常,正常调试了一遍。直接copy编译,没有修改。
难道是.............(rp )
您还是进od里看一下吧
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
OD用的不好,不会跟踪,老大可以加你QQ,把我的delphi传你测试下不?不会上传附加,刚刚来论坛
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
我怎么点不了 “附件管理”呀,我的QQ:402053239,加我给你传下试试
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
多谢大财,万分感谢,看雪太需要这样的热心会员了,再次感谢
|
能力值:
(RANK:300 )
|
-
-
14 楼
如果可能尽量在版里讨论。
不要用这样留QQ,留Email的私下讨论方式..........
技术分享嘛....
|