能力值:
( LV2,RANK:10 )
|
-
-
2 楼
难不成我还抢了个沙发,支持下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
学习了......
|
能力值:
( LV4,RANK:40 )
|
-
-
4 楼
有收获。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
收藏~~~~~
|
能力值:
( LV7,RANK:110 )
|
-
-
6 楼
shafa,
|
能力值:
(RANK:10 )
|
-
-
7 楼
Thanks for share.
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
来学习一下,支持了
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
有码就是好 谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
用了楼主的方法去测试了下不成功啊,你给一个你的测试实例来看看吧!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
虽然我还看不懂,帮顶一个先
|
能力值:
( LV6,RANK:90 )
|
-
-
12 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
刚下载,支持一下。。
|
能力值:
( LV5,RANK:70 )
|
-
-
14 楼
while(pImageImportDescriptor != 0)
{
...
pImageImportDescriptor++;
}
这里若是一直匹配不到恐怕要崩溃吧?判断条件应该是pImageImportDescriptor->Characteristics != 0。
|
能力值:
( LV6,RANK:90 )
|
-
-
15 楼
多谢星逝兄提醒,判断条件应该改为数组里的任意一个成员不为零
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
东西不错,留个脚印
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
thanks for sharing .
you were wrong.
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
支持支持,下载下来看看
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
不错不错。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
细节问题还有,pImageImportDescriptor->Name 是ansi字符串,强转为LPCTSTR会有问题的。得用A2W转一下
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
附一个修改版+测试代码
BOOL IATHook( IN HMODULE hModule, IN LPCTSTR pImageName, IN LPCVOID pTargetFuncAddr, IN LPCVOID pReplaceFuncAddr )
{
IMAGE_DOS_HEADER* pImgDosHdr = ( IMAGE_DOS_HEADER* )hModule;
IMAGE_OPTIONAL_HEADER* pImgOptHdr = ( IMAGE_OPTIONAL_HEADER* )( ( DWORD )hModule + pImgDosHdr->e_lfanew + 24 );
IMAGE_IMPORT_DESCRIPTOR* pImgImportDes = ( IMAGE_IMPORT_DESCRIPTOR* )( ( DWORD )hModule + pImgOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress );
IMAGE_THUNK_DATA* pImgThunkData = NULL;
wstring TargetLibraryName;
DWORD Value = 0;
DWORD OldProtect = 0;
DWORD NewProtect = 0;
LPDWORD FuncAddress = NULL;
while ( pImgImportDes->Characteristics != 0 )
{
USES_CONVERSION;
LPCTSTR lpszName = A2W( ( ( LPCSTR )( DWORD )hModule + pImgImportDes->Name ) );
TargetLibraryName = lpszName;
if ( TargetLibraryName.compare( pImageName ) == 0 )
{
pImgThunkData = ( IMAGE_THUNK_DATA* )( ( DWORD )hModule + pImgImportDes->FirstThunk );
break;
}
pImgImportDes++;
}
if ( pImgThunkData == NULL )
{
return FALSE;
}
while ( pImgThunkData->u1.Function )
{
//循环查找目标函数地址所在的位置
FuncAddress = ( LPDWORD ) & ( pImgThunkData->u1.Function );
if ( *FuncAddress == ( DWORD )pTargetFuncAddr )
{
//找到目标函数的地址,然后修改为钩子函数的地址
VirtualProtect( FuncAddress, sizeof( DWORD ), PAGE_READWRITE, &OldProtect );
if ( !WriteProcessMemory( ( HANDLE ) - 1, FuncAddress, &pReplaceFuncAddr, 4, NULL ) )
{
return FALSE;
}
VirtualProtect( FuncAddress, sizeof( DWORD ), OldProtect, 0 );
return TRUE;
}
pImgThunkData++;
}
return FALSE;
}
typedef int ( WINAPI* SysMessageBoxW )( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType );
SysMessageBoxW g_MessageBoxW = 0;
int WINAPI MyMessageBoxW( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType )
{
return g_MessageBoxW( NULL, _T( "hello world" ), _T( "caption" ), MB_OK );
}
BOOL Rookits(HMODULE hModule,LPCTSTR pImageName,LPCSTR pTargetFuncName)
{
HMODULE hLib = LoadLibrary( pImageName );
if ( NULL != hLib )
{
g_MessageBoxW = ( SysMessageBoxW )GetProcAddress( hLib, pTargetFuncName );
BOOL bRet = IATHook( hModule, pImageName, g_MessageBoxW, MyMessageBoxW );
FreeLibrary( hLib );
return bRet;
}
return FALSE;
}
void Test()
{
Rookits( GetModuleHandle( NULL ), _T( "USER32.dll" ), ( "MessageBoxW" ) );
MessageBox( NULL, _T( "h" ), 0, 0 );
}
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
mark
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
学习!顶一个
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
mark
|
能力值:
( LV1,RANK:0 )
|
-
-
25 楼
不错,支持一下~
|
|
|