PRCN – 再解密

已经是第三篇关于prcn的文章了呢

到底这个破游戏我为什么这么上心呢?明明早都退坑了,却一直继续研究。

时间再回到去年8月份,当时prcn刚刚架上cdb没多久,cy给全平台都上了CrackProof保护。

其中一个影响是coneshell.dll被保护了,但不仅如此,一直以来可以方便的直接阅读源码的Assembly-CSharp.dll也被保护了。dll中仅剩下了类/方法名和字符串,而所有的方法主体都被0掉了。

也正是因为这个原因,在165之后新加入的技能分析都比以前要困难很多,虽然dll依然可以直接看到传入的参数和成员名,但缺少具体算法只能看il2cpp的输出

CP的保护目前来讲做的还是比较厉害的,ios上我从来都打不开游戏,Clutch用了类似LoadLibrary的方法来加载程序让系统解密,然后提取代码。至于pc上整个游戏进程都被保护了起来,debugger或者内存dump都访问不到。

所以我后来就在想,有没有内核级的内存dump工具呢?

答案当然是有的。Belkasoft做了一个有正规驱动签名的Live RAM Capturer,通过内核驱动直接提取完整内存快照。

这当然是个好东西啊,但问题没这么简单。我下载后抓了一个快照出来,然后在这个8+4G的巨大文件里面搜索dll片段,搜到之后却发现整个内存是分页的,而我根本不会读取啊。

于是这个东西就这么搁浅了。


然后就到了今年的一月底,我在图书馆呆着的时候,又想起了这个问题。当时先是给Belka发了邮件询问分页读取。发完之后我就重新去搜索内存分页的相关内容,结果贴心的google给我扔了一个volatility

マジヤバクネー

在试了几次之后,本来我最初是想提取出一个可以用的coneshell,但是dlldump输出的依然是乱的内容,所以dll不可行。试完了dll我就搞了一个ramdump,在翻腾了几下之后在完整内存映像里面找到了c#dll的内容,但我按照文件偏移找到文件头的地方却没有应有的内容(后来问了人,dll加载后会被扩充,所以并不是像fread一个字符串一样)。

dll确实在里面,但这样要怎么找呢?

那就不如利用写过的方法吧,上面有着一个zero block检测,那找到最大的0块,再分别在dll和内存里找到某个字符串的偏移,然后填充这个0不就好了吗

PRCN-restore-dll.php


cy到此再没有升级加密混淆,所以目前还算是初音笔记的蜜月期吧。两边玩家也基本上都算是习惯了这种看数据排刀?

然后说道cgss,总感觉cy拿prcn练了封号经验,在这边积攒了一年之后终于拿去在cg上用了。只有日本ip可以新建/引继帐号的设定着实过分,反正我也搞不懂运营的思路,安心咸鱼就对了。

19 thoughts on “PRCN – 再解密”

  1. 大佬在吗,最近在尝试整日服的jjc排名推送,但是抓包时发现pack数据和之前不一样。
    所有请求数据和回传数据都变成了wN4AA开头,dump了dmm版本的assembly-csharp.dll , 发现pack方法中,有几个关键方法是链接到coneshell.dll,但是coneshell.dll dump出来之后dnspy没法打开,现在卡死在这一步没法操作了。
    还有什么办法能dump coneshell.dll 么? 或者有已经dump了的coneshell么?

  2. 这边的方法进行dll dump本来一段时间以来都能用
    但是最近发现不行了

    CE是死活找不到
    Assembly-CSharp.dll
    Assembly-CSharp-firstpass.dll
    这两个文件 其他的文件却全都有(一直提示什么not all the memory was readable)

    RamCapturer差不多等于同样的结果找出一堆没用的最关键的几个怎么都dump不出来
    不知道是不是cy又针对这个做了什么加密,但是我看初音笔记等等他们那边却又一直没问题

    或许是自己操作哪里有问题?
    顺便能否求一下你们dump过后的git地址,我已经差不多有一段时间搞不定这个问题了

    1. 我一直RamCapturer,同一套自动化脚本没啥改动。
      git的话给我你的profile链接,我之后发邀请

  3. 请问现在还有办法使用魔改dll吗?
    现在好像每次启动都有自验证改任何字节都要强制更新

        1. 注入嘛……反正我是知道这进程被保护了,你加油(

      1. 试了下也有别的歪路子。。自己用比如OD之类的东西直接改执行逻辑跳过更新直接运行
        缺点就是万一游戏有更新就gg

  4. 其实有简单的dump dll的方法
    使用Cheat Engine,Edit-Settings-Extra把上面两项勾上,就能读取prcn的内存了
    dump c# dll:
    在ce里直接搜索特征字节,比如最新的Assembly-CSharp.dll可以直接搜索AF 9F D6 EB,然后在结果上右键-Browse this memory region,就会打开Memory Viewer并定位到dll所在位置,使用View-Memory Regions,找到dll地址所在的区域,直接右键保存,然后编辑一下把“MZ”之前的字节全删了,就能直接使用dnspy打开了
    dump coneshell.dll
    直接打开Memory Viewer,View-Memory Regions,查看Extra信息找到coneshell.dll的地址,应该有两段,都选择一起保存,然后编辑文件删除开头CE自带的23个字节,将两个文件拼接一下,然后使用CFF Explorer修复一下dump的dll:将Optional Header-ImageBase修改成dump时的地址,修改Section Headers,把所有Section的Raw Size改成Virtual Size的值,Raw Address改成Virtual Address的值,就可以使用ida打开了,如果想要直接使用dll,还需要修复输入表等东西,不过既然在x86下了,可以直接照抄汇编还原算法

    1. 神仙.jpg

      Cheat Engine我好像试过不行?可能是记错了
      这个方法导出dll看着好多鼠标操作,我是ramdump这条路的半自动工具都写好了,所以也就这样磨固态了,懒
      然后coneshell吧……说是要研究到现在都再没看过了,因为魔改文件能用就没有管了,而我又对通信模拟客户端不感兴趣。所以其实如果真搞来我好想也没什么需求。
      (还有一点,我看到过几个版本cy会改一个注入字节码,所以这个东西搞出来也不长久)

      1. CE打不开进程基本是因为没有勾那两个选项

        操作看起来复杂因为我写的是导出某个特定dll,CE可以直接一键导出所有可读内存,然后一样写个程序搜索一下“MZ”头就能一口气导出全部dll了

    2. 请问Perfare神仙有什么在安卓上dump内存而且不被CrackProof检测到的方法吗?

      1. 噗,你这条评论没回复我现在才看到
        dump内存用gg就行了,把对游戏隐藏gg勾上就过了

    3. 窝回复了鸭QAQ,这博客貌似不能回复回复。
      gg能dump内存也是tql。。那么Android的so有没有什么修复relocation的工具?要不然估计没法直接跑

    4. 大佬,Assembly-CSharp.dll 地址要从哪里获取,AF 9F D6 EB 在2.8版本中无法搜索到,

回复 esterTion 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax