转自互联网:
相信这次不少烧录卡都扑倒在SE新出的恐怖游戏7日死的怨念下~经过几次详细研究~然后再比对上当时FFCC的那个几分钟试玩的检验代码~最终本人得到一个很令人不愿接受的结论~
这些一切都是SE的新烧录验证程序在作祟~SE已经有足够的技术检验出玩家是在使用Z版卡还是烧录卡~并且用一切近乎于羞辱的方式令玩家无法正常游戏(FFCC是给试玩时间后BAN掉~7日死还故意给放个片头LOGO才死机……)
按照这个势头~甚至可以断然~在马上将出的DQ5中~SE将会采用该技术继续玩弄烧录玩家~甚至采用新的检测技术~
所以这里我们十分有必要了解一下现有烧录检测技术的详情~
虽然之前我也有在帖子里说过这个问题~不过这里我认为还是有必要专门发一帖来介绍一下这个问题~
废话不多说了~首先以7日死的代码为例分析一下该检测程序的功能和实现~
首先说下ROM的载入~
在烧录里ROM都是由烧录前端引导程序载入到内存中然后放行的~开始游戏后程序会先进行一系列的初始化步骤~然后切到主循环~
因此要检测烧录~必须在进入主循环之前~也就是说代码在之前的初始化部分里~
这里我把反汇编后的7日死的检测程序入口帖出~:
:02000BF0 E92D4008 stmdb r13!,{r3,r14}
:02000BF4 FA01BD6A blx 020701AC ;(这里还有个编译错误~这跳转的地址应该是20701A4)
这里这个2000BF0的地址一般是游戏从2000800的初始化程序结束后用bl r1跳转到滴第一个地址~也就是正式程序部分的最开头~(有的游戏是在2000C00)
这个ROM非常厚道的把烧录检测程序放在了整个程序代码的最开头部分~……
然而大家也许注意到了~这里的跳转指令是blx而不是常用的bl~这其中最大的区别在于用blx的跳转后的代码是使用THUMB压缩格式的~……这使得我们现有的反汇编程序都对此无能为力……
因此现在换上CT2~因为在CT2的反汇编菜单里可以选择编译方式~选择到ARM9:THUMB指令后~我们看到20701A4这里终于顺利显示出了代码~如下:
020701a4 4804 ldr r0,[pc,10h] ;[020701b8]=0x040000d4
020701a6 6800 ldr r0,[r0,0h]
020701a8 2800 cmp r0,0h
020701ac d001 beq 20701b0h
这里看到了检测代码的真面目~……读取0x040000d4的值~然后看是否等于0~如果不等于0的话就判定为使用烧录~……
也许这样说还不能理解这个代码的真实含义~因此这里介绍一下0x040000d4这个I/O口的作用~在权威开发文档GBATEK里是这么介绍的:
GBA DMA Transfers
Overview
The GBA includes four DMA channels, the highest priority is assigned to DMA0, followed by DMA1, DMA2, and DMA3. DMA Channels with lower priority are paused until channels with higher priority have completed.
The CPU is paused when DMA transfers are active, however, the CPU is operating during the periods when Sound/Blanking DMA transfers are paused.
…………
DMA3 - can be used to write to Game Pak ROM/FlashROM (but not GamePak SRAM).
Beside for that, each DMA 0-3 may be used for whatever general purposes.
…………
40000D4h,0D6h - DMA3SAD - DMA 3 Source Address (W) (any memory)
简单的说40000D4就是DS(GBA)的4个DMA通道之一的DMA3的源地址寄存器~是使用该通道所必须设置的一个寄存器~
那DMA通道又是什么呢?~相信计算机考过级的人大概多多少少见过一点~所谓DMA就是一种让计算机(或类似设备)的各个I/O设备~存储设备之间能够不经过CPU而进行通信的硬件系统~所谓的DMA通道正式这样的一个桥梁~CPU所需要做的事情只是设置好该通道~而具体的传输过程是由专门的DMA芯片完成~无需CPU插手~
总是是一种十分便捷的数据传输方式~在DS中~通常用于内存和显存之间的传递~
回到之前说过的ROM载入方法上~由于检测代码被安插在游戏的最开头~该时刻由于游戏本该没做任何事情~所以也是不可能调用了DMA的~因此此时检测DMA3的源地址~无疑应该为0才对~
但是如果玩家使用了烧录卡则情况就完全不同了~……由于前期引导程序的存在~此时再在游戏开头检测该寄存器的话~……就会检测到烧录卡上次调用DMA的痕迹~无疑此时游戏就将玩家给认定为烧录玩家了~……
原理分析结束~接下来就是介绍对策~
由于该段代码有一个很显著的特点~就是调用0x040000d4这个地址~因此这样就有比较简单的方式来处理以后的ROM中有该检测代码的情况了~下面我用FFCC美版ROM来简单介绍对策~
首先用CT2打开ROM~直接在数据中搜D4 00 00 04 也就是上面那个地址在内存中保存的地址~可能会搜到不少值~但是因为只有ARM9.BIN中的代码才是我们关注的~所以基本上那些很靠后~用FSI查看已经偏出ARM9范围的值都可以直接忽略掉~
也就是说这里只用关注搜索出的第一个值~本例中该值在0202870C的位置~
然后将窗口切换到ASM反汇编窗口~指令方式切换到ARM9:THUMB~然后在这个位置上面一点的地方开始找~果然出现了刚才所说的那段代码~
020286f8 4804 ldr r0,[pc,10h] ;[020701b8]=0x040000d4
020286f8 6800 ldr r0,[r0,0h]
020286f8 2800 cmp r0,0h
020286f8 d001 beq 2028704h
居然和上面7日死的代码一模一样~……因此甚至可以在搜索中直接搜索 04 48 00 68 00 28 01 d0
找到位置后剩下的就是改了~……看最下面一行beq~……这里给改成b指令就一切OK了~简单的说~就是把该地址对应的那个 d0 改成 e0 就一切完工了~……
其实在知道原理后做起来就是这么简单~不过上面所述的所有对策都仅仅是对于SE现有的反烧录技术~而如果SE或者别的什么厂商~哪天突然又发现了一个新方法能检测到烧录卡的存在的话~……那么以上这一切就又全部成了泡影~一切破解又需从头开始~……
最后在这里预祝一下~DQ5别用烧录检测~至少别用新的烧录检测代码就好~
PS:如果你想检测一下你的烧录卡是否有可能被SE的该技术检测到~请下载下面小程序~放在烧录卡上运行~如果结果显示出来的只有2个逗号~没有长串的数字和字母的话~那么恭喜~你的烧录卡完美模拟~这次没有破绽~SE检测不出来~以上文章内容你大可完全无视就好了~
否则的话~……
否则的话~请协助我的测试~将你烧录卡的类型和显示的内容帖在回帖上~谢谢~