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可以新建/引继帐号的设定着实过分,反正我也搞不懂运营的思路,安心咸鱼就对了。

3 thoughts on “PRCN – 再解密”

  1. 其实有简单的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了

发表评论

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

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