首页
社区
课程
招聘
[原创]某些游戏对于特征码检测修改程序段的实现
发表于: 2009-9-1 04:18 15041

[原创]某些游戏对于特征码检测修改程序段的实现

2009-9-1 04:18
15041

未经作者许可,禁止转载.

如果您有更好的方法.请跟贴告诉我..这个方法不知道别人有没有讲过..随便写写.不要丢鸡蛋给我(要丢就丢money吧)

很多游戏对自身的程序段做了效验.如果修改的话,直接退出..比如冒险岛.我个人使用的方法实现很烦琐.有时候得直接内联很多游戏的函数去实现..如果能找到游戏的效验部分.那直接能解决..如果找不到呢?..那只好试试我的方法吧.毕竟功能能实现了.烦琐点又如何呢?.第一次发贴,如有不对之处,请指正

现在开始讲.(游戏名字不说了)

改之前
004D2080    55              push    ebp
004D2081    8BEC            mov     ebp, esp
004D2083    56              push    esi
004D2084    8BF1            mov     esi, ecx
004D2086    8A86 6C040000   mov     al, byte ptr [esi+46C]
004D208C    84C0            test    al, al
004D208E    0F84 E5000000   je      004D2179        假如我们要把这里的je 改成jmp,从而实现我们需要的功能
004D2094    E8 A790FBFF     call    0048B140
004D2099    84C0            test    al, al
004D209B    75 0B           jnz     short 004D20A8

改之后
004D2080    55              push    ebp
004D2081    8BEC            mov     ebp, esp
004D2083    56              push    esi
004D2084    8BF1            mov     esi, ecx
004D2086    8A86 6C040000   mov     al, byte ptr [esi+46C]
004D208C    84C0            test    al, al
004D208E    0F84 E5000000   jmp   004D2179        改了这里
004D2094    E8 A790FBFF     call    0048B140
004D2099    84C0            test    al, al
004D209B    75 0B           jnz     short 004D20A8

如果游戏对4d2080-4d209B的位置这里做了效验的话,那么没多久就会断线或者自动关闭,至少np,hs我遇到的都是这种情况,不改又实现不了我们的功能.

我们可以返回上一级.看看, CTRL+F9返回

0042565F    8B07            mov     eax, dword ptr [edi]
00425661    53              push    ebx
00425662    53              push    ebx
00425663    53              push    ebx
00425664    53              push    ebx
00425665    53              push    ebx
00425666    8BCF            mov     ecx, edi
00425668    FF90 84020000   call    dword ptr [eax+0C]  <--返回到这里.

00425668    FF90 84020000   call    dword ptr [eax+0C]  这是个虚函数调用..
所有程序都会有虚函数调用..

我们可以从这里入手.我这里是打个比方,并非是所有CALL返回上一级都是虚函数调用的.也许有2级`或者3级..4.5.6.级. 返回几级,就得内联几级函数调用..

我们先来找eax 的值..

假设为d [[908854]]+C. = call    dword ptr [eax+0C] (004D2080)

写个DLL..
注入到目标程序内,注入代码我就不多废话了.
自己写个函数
__declspec(naked) VODI WINAPI Test(DWORD dwUnknow1, DWORD dwUnknow2, DWORD dwUnknow3, DWORD dwUnknow4, DWORD dwUnknow5)
{
        __asm
       {
                push    ebp
                mov     ebp, esp
                push    esi
                mov     esi, ecx
                mov     al, byte ptr [esi+46C]
                test    al, al
                jmp      004D2179     //直接修改这里为跳转jmp
                call    0048B140
                test    al, al
                jnz     short 004D20A8
                .....
                ....
               .....
               .....
       }
}

OD有直接复制代码函数的插件.直接抓出来就可以用了..

直接将  d [[908854]]+C 的函数入口指向Test里即可实现所想要的功能了.
*(PDWORD)(*(PDWORD)PtrToULong(*(PDWORD)PtrToULong(0x00908854))+0xC) = ULongToPtr(Test);

不管几层,都得内联,找到调用源为虚函数调用的位置即可修改.
也可以自己加个全局变量控制功能的开关..

睡觉去了......(完毕)


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 248
活跃值: (129)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
http://bbs.pediy.com/showthread.php?t=96876
看完帖子有空的话帮偶看看这个问题,苦恼了好久了
2009-9-1 04:22
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[[908854]]+C 的函數指針一般在主程序內,自己的一般在高端。

我遇到用此辦法就沒成功,估計效驗了[[908854]]+C 的函數指針。
2009-9-1 11:22
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
'虚函数' 谢谢指点。

既然虚函数表里的函数编号都是固定的。为什么不直接call xxx而要用call [xxx+xxx]
2009-9-1 22:08
0
雪    币: 248
活跃值: (129)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=许胜;680008]'虚函数' 谢谢指点。

既然虚函数表里的函数编号都是固定的。为什么不直接call xxx而要用call [xxx+xxx][/QUOTE]

人物怪物都有action.的话。。
如果你是写程序的话,你会人物动作和怪物动作分开写一个函数么?.
之所以叫虚函数..
是调用类..
假设
class CAction
{
    BOOL WINAPI Action_(DWORD dwObject); < 对象ID
}

如果人物调用的话
直接
Action_(人物ID); 而人物对象调用此类的话`反汇编出来就是上面所说的[xxx+xxx]了
2009-9-2 03:22
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
6
呵呵,现在都是直接检测虚表了。
2009-9-2 13:41
0
雪    币: 381
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
就凭这个,2009-09-01, 04:18   顶  呵呵~~
2009-9-2 18:11
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对于国内的某个名为“XXXXXX"缩写"XXX"的横板格斗游戏的校验管用么?

我不能od调试XXX游戏(crtl+f9用不了) 怎么能实现你的功能呢?

还有假如程序校验所有代码段怎么办?
2009-9-3 21:46
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
什么东西?什么原理? 如何绕过? 大牛明示!
2009-9-3 22:02
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
team509翻译的reverse c++,这个应该对理解虚表,乃至c++的逆向工程有帮助。
超有趣的。
上传的附件:
2009-9-3 22:27
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主说的就绕过所有代码段检测。这是编译器留给我们的绿色通道。
[]这玩意在数据段。呵呵
MXD VS XXX
2009-9-3 23:09
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
绕过所有代码段检测?
2009-9-5 21:02
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
拜读了学习了~
2009-9-12 20:17
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
拜读后,获益匪浅.
2009-9-12 21:05
0
游客
登录 | 注册 方可回帖
返回
//