能力值:
( LV5,RANK:60 )
在线值:
|
-
-
2 楼
我的就有 可惜你没看。
写个跳,判定edx是debug的值再压入0,否则还压入[ebx],直接压0必然重启。
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
3 楼
[QUOTE=小白壹个;1141058]我的就有 可惜你没看。
写个跳,判定edx是debug的值再压入0,否则还压入[ebx],直接压0必然重启。[/QUOTE] 我看了一下你的帖子,你是只有5处,我的不是。“我的也不是dnf而是另外一个游戏不知道是否不同”
大哥,不是额。现在有3处vm了。你说的vm是以前的一处push。现在多一处了。
这处vm我都贴了代码啊。他push的根本不是debug的值。而是我贴出的第2处清零函数头地址的前4个字节。
所以就是问下该怎么处理他对函数的写入,我猜测是对他检测以后,然后写回去。
如果是debug的值我就不问咯。
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
4 楼
解决没,同求答案
|
能力值:
( LV2,RANK:10 )
在线值:

|
-
-
5 楼
解决没,同求答案
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不会OD的飘过 .
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我也不会OD 目前还只是个临时用户好像转正呀
|
能力值:
( LV9,RANK:160 )
|
-
-
8 楼
学习了学习了学习了
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
9 楼
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
10 楼
持续运行多次的时候我们还会发现有一处地方的检测
TesSafe+0x22cc2:
b0edccc2 ff32 push dword ptr [edx]
TesSafe+0x22cc4:
b0edccc4 e98bf4ffff jmp TesSafe+0x22154 (b0edc154)
对于这一处的代码,因为这处的代码有VM处理。所以我们不能对这处的地址乱改。
在push的位置处,我们对代码进行hook的处理,当判断edx是检测函数首地址的时候,我们对其做一下处理,而当不是函数首地址的时候,而执行原来的代码。下面的是这一处的处理代码
__asm
{
pushfd
pushad
mov eax, g_uTpZero1
cmp edx,eax
je Detour
popad
popfd
push dword ptr [edx]
jmp g_uTPDetourPushAddr //这是本身程序要jmp过去的位置,jmp到tp模块里的位置处。
Detour:
popad
popfd
push 0
jmp g_uTPDetourPushAddr1
}
上面的解决方法我果真是看不明白,
以下是我的理解方法:我测试过了,不会重启,但是我不明白,为什么当 edx 是 被检测函数首地址的时候,改为 push 0 就可以跳过 校验,而且我对VMP不熟
Hook b0edccc4. 比较 edx 的值 如果是函数首地址,则esp+4 再push 0
VOID NAKED MyFunForHookCRC()
{ __asm
{
pushfd
pushad
mov eax, uCrc1 //uCrc1 是 被检测函数的首地址
cmp edx,eax
je Detour
popad
popfd
jmp uJmpCrcAddr1 //这是本身程序要jmp过去的位置= TesSafe+0x22154。
Detour:
popad
popfd
add esp,4 //将原push 的edx值出栈
push 0 //用0取代原来push的edx
jmp uJmpCrcAddr1
}
}
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
11 楼
b15fba85 ff32 push dword ptr [edx]
b15fba87 e96adcffff jmp TesSafe+0xcf6f6 (b15f96f6)
b15fba8c 5b pop ebx
这个貌似与前面两个vm的过法不一样,前两个edx就是eprocess+bc,而这个不是,不知道该怎么过,求助啊
|
|
|