能力值:
( LV3,RANK:20 )
2 楼
:)
最后于 2022-6-16 18:10
被fatcateatrat编辑
,原因:
能力值:
( LV3,RANK:30 )
3 楼
发样本,没看懂你的意思
能力值:
( LV6,RANK:80 )
4 楼
像这样的错误 有两个可能性,第一个是你的Detour函数 调用约定声明不对,第二个 用release编译
能力值:
( LV7,RANK:140 )
5 楼
你这里出现了VirtualAlloc和VirtualAllocEx,是不是哪里搞混了
能力值:
( LV2,RANK:10 )
6 楼
戒烟
发样本,没看懂你的意思
所有的代码都贴在最上面了。。
能力值:
( LV2,RANK:10 )
7 楼
yeyeshun
你这里出现了VirtualAlloc和VirtualAllocEx,是不是哪里搞混了
没有混的。。。
能力值:
( LV2,RANK:10 )
8 楼
黑洛
像这样的错误 有两个可能性,第一个是你的Detour函数 调用约定声明不对,第二个 用release编译
/////////////////////////////////////////////////////////////////
// 第13章 Hook技术 《加密与解密(第四版)》 //
// //
// Author: achillis(黑月教主) //
// Blog : http://www.cnblogs.com/achillis/ //
// QQ : 344132161 //
// Email : achillis@126.com //
// 转载请保留作者信息 //
// (c) 看雪学院 www.kanxue.com 2000-2018 //
/////////////////////////////////////////////////////////////////
//本程序的功能是对VirtualAlloc函数进行call Hook
#include <windows.h>
#include <stdio.h>
#include <CONIO.H>
ULONG g_PointerToRawData = 0 ;
ULONG g_RawOffset = 0 ;
LPVOID GetAddress(char *,char *);
LPVOID WINAPI DetourVirtualAllocEx(
HANDLE hProcess, // process within which to allocate memory
LPVOID lpAddress, // desired starting address of allocation
DWORD dwSize, // size, in bytes, of region to allocate
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
BOOL Inline_InstallHook(void);
BOOL Inline_UnInstallHook();
VOID TestHook();
int main(int argc, char* argv[])
{
TestHook();
Inline_InstallHook();
TestHook();
//Inline_UnInstallHook();
printf( "yes i am ok\n" );
getchar();
return 0;
}
VOID TestHook()
{
LPVOID lpAddr = VirtualAlloc(NULL,0x1000,MEM_COMMIT,PAGE_READWRITE);
}
LPVOID WINAPI DetourVirtualAllocEx(
HANDLE hProcess, // process within which to allocate memory
LPVOID lpAddress, // desired starting address of allocation
SIZE_T dwSize, // size, in bytes, of region to allocate
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
)
{ LPVOID lpAddr = NULL ;
printf("[DetourVirtualAllocEx] VirtualAllocEx called.\n");
lpAddr = VirtualAllocEx(hProcess,lpAddress,dwSize,flAllocationType,flProtect);
printf("[DetourVirtualAllocEx] Alloced Buffer = 0x%X\n",lpAddr);
return lpAddr;
}
DWORD G_OldAddress = 0;
DWORD G_NewAddress = 0;
/*
7C809AF1 > 8BFF mov edi,edi
7C809AF3 55 push ebp
7C809AF4 8BEC mov ebp,esp
7C809AF6 FF75 14 push dword ptr ss:[ebp+14]
7C809AF9 FF75 10 push dword ptr ss:[ebp+10]
7C809AFC FF75 0C push dword ptr ss:[ebp+C]
7C809AFF FF75 08 push dword ptr ss:[ebp+8]
7C809B02 6A FF push -1
7C809B04 E8 09000000 call kernel32.VirtualAllocEx
7C809B09 5D pop ebp
7C809B0A C2 1000 retn 10
*/
BOOL Inline_InstallHook()
{
HMODULE hModule_ = LoadLibraryA( "kernel32.dll" );
//准备Hook
BOOL bFound = FALSE;
BOOL bResult = FALSE ;
ULONG addrTemp = 0 ;
ULONG addrTargetFun = (ULONG)GetAddress("kernel32.dll","VirtualAllocEx");
PBYTE pFun = (PBYTE)GetAddress("kernel32.dll","VirtualAlloc");
PBYTE pBase = pFun;
int i = 0 ;
for (i=0;i<0x30;i++,pFun++)
{
// 7C809B04 E8 09000000 call kernel32.VirtualAllocEx
// 9413e875 ff 25 9413e875 jmp kernel32._imp__VirtualAllocEx
// ssj 2022.6.16
// 这里的思想是搜索kernel32.dll中的VirtualAlloc,他会jmp去调用kernel32._imp__VirtualAllocEx
// 在这个vs2010里面,我们找到jmp指令的值是ff,25,修改里面的地址为自定义的函数。
if (pFun[0] == 0xff && pFun[1] == 0x25)
{
union{
byte bb_[4];
DWORD address_;
};
bb_[0] = pFun[2];
bb_[1] = pFun[3];
bb_[2] = pFun[4];
bb_[3] = pFun[5];
G_OldAddress = address_;
DWORD *jmpAddress_ = reinterpret_cast<DWORD*>( G_OldAddress );
MEMORY_BASIC_INFORMATION mbInfor_;
VirtualQuery( jmpAddress_, &mbInfor_, sizeof( mbInfor_ ) );
SIZE_T wwww;
addrTemp = (LONG)DetourVirtualAllocEx;
G_NewAddress = addrTemp;
DWORD oldProtect_;
VirtualProtect( mbInfor_.BaseAddress, mbInfor_.RegionSize, PAGE_EXECUTE_READWRITE, &oldProtect_ );
bResult = WriteProcessMemory( GetCurrentProcess( ), jmpAddress_, &addrTemp, sizeof(LONG), &wwww);
VirtualProtect( mbInfor_.BaseAddress, mbInfor_.RegionSize, oldProtect_, nullptr );
int aa = 0;
bResult = FALSE;
break;
//addrTemp = (ULONG)pFun + 5 + *(LONG*)(pFun+1);
//if (addrTemp == addrTargetFun) //判断call的目标地址是不是VirtualAllocEx
//{
// bResult = TRUE;
// break;
//}
}
}
if (bResult)
{
//开始Hook
g_PointerToRawData = (ULONG)pFun + 1 ;
g_RawOffset = *(LONG*)(pFun+1) ;
addrTemp = (LONG)DetourVirtualAllocEx - (LONG)pFun - 5 ;
bResult = WriteProcessMemory(GetCurrentProcess(),pFun+1,&addrTemp,sizeof(LONG),NULL);
}
return bResult;
}
BOOL Inline_UnInstallHook()
{
DWORD addrTemp = g_RawOffset ;
return WriteProcessMemory(GetCurrentProcess(),(LPVOID)g_PointerToRawData,&addrTemp,sizeof(LONG),NULL);
}
//获取指定模块中指定API的地址
LPVOID GetAddress(char *dllname,char *funname)
{
HMODULE hMod=0;
if (hMod=GetModuleHandle(dllname))
{
return GetProcAddress(hMod,funname);
}
else
{
hMod=LoadLibrary(dllname);
return GetProcAddress(hMod,funname);
}
}
能力值:
( LV2,RANK:10 )
9 楼
yeyeshun
你这里出现了VirtualAlloc和VirtualAllocEx,是不是哪里搞混了
我编译成release版本也是
能力值:
( LV4,RANK:50 )
10 楼
VirtualAlloc 4个参数 ret 10h VirtualAllocEx 5个参数 ret 14h
能力值:
( LV2,RANK:10 )
11 楼
LPVOID WINAPI DetourVirtualAllocEx( HANDLE hProcess, // process within which to allocate memory LPVOID lpAddress, // desired starting address of allocation SIZE_T dwSize, // size, in bytes, of region to allocate DWORD flAllocationType, // type of allocation DWORD flProtect // type of access protection ) { LPVOID lpAddr = NULL ; printf("[DetourVirtualAllocEx] VirtualAllocEx called.\n"); lpAddr = VirtualAllocEx(hProcess,lpAddress,dwSize,flAllocationType,flProtect); printf("[DetourVirtualAllocEx] Alloced Buffer = 0x%X\n",lpAddr); return lpAddr; } 我这里定义的也是5个参数呢。。
能力值:
( LV13,RANK:570 )
12 楼
黑月教主是那位写易语言C编译器的大佬嘛
能力值:
( LV2,RANK:10 )
13 楼
addrTargetFun是VirtualAllocEx,pFun却是VirtualAlloc,用VirtualAllocEx hook VirtualAlloc?
能力值:
( LV2,RANK:10 )
14 楼
superlover
addrTargetFun是VirtualAllocEx,pFun却是VirtualAlloc,用VirtualAllocEx hook VirtualAlloc?
我是用DetourVirtualAllocEx来hook掉VirtualAllocEx
能力值:
( LV8,RANK:120 )
15 楼
刚看了下,新系统里面有stub存在,有可能是你get VirtualAlloc的时候,取的是VirtualAllocStub,然后在里面搜索ff 25 的时候,搜索出来的还是 VirtualAlloc。
你可以把你get出来的地址,u一下看下汇编代码
KERNEL32!VirtualAllocStub:
75855ed0 8bff mov edi,edi
75855ed2 55 push ebp
75855ed3 8bec mov ebp,esp
75855ed5 5d pop ebp
75855ed6 ff2510138c75 jmp dword ptr [KERNEL32!_imp__VirtualAlloc (758c1310)]
75855edc cc int 3
能力值:
( LV2,RANK:10 )
16 楼
hello,hook
LPVOID WINAPI DetourVirtualAllocEx(
HANDLE hProcess, // process within which to allocate memor ... 正是因为你定义的是5个参数,所以RENT 14啊,RENT 10的virtualalloc函数,这个函数只有4个参数,这不是很明白的吗。另外我WIN7系统kernel32.virtualalloc函数内部通过JMP跳转的到的是kernelbase.virtualalloc而不是kernel32.virtualallocex,所以通过替换JMP后面的数值的话替换的是kernelbase.virtualalloc,这个函数同样只有4个参数,需要RENT 10才能正常运行
最后于 2022-6-17 20:52
被htpidk编辑
,原因:
能力值:
( LV7,RANK:140 )
17 楼
zhouws
刚看了下,新系统里面有stub存在,有可能是你get VirtualAlloc的时候,取的是VirtualAllocStub,然后在里面搜索ff 25 的时候,搜索出来的还是 VirtualAlloc ...
我觉得你说的靠谱
能力值:
( LV2,RANK:10 )
18 楼
你说的是对的,这个jmp到kernelbase的VirtualAlloc了,不是我认为的VirtualAllocEx(5个参数)。而kernelbase的VirtualAlloc中的参数是4个。所以问题出现了。非常感谢大家!
能力值:
( LV2,RANK:10 )
19 楼
htpidk
hello,hook
LPVOID WINAPI DetourVirtualAllocEx(
HAN ...
你说的是对的
能力值:
( LV2,RANK:10 )
20 楼
htpidk
hello,hook
LPVOID WINAPI DetourVirtualAllocEx(
HAN ...
把第一个参数去掉就ok了。。。