本文章由AyamiKaze首发在论坛平台,转载请标明出处
大家好,本人菜鸟一枚,研究了一个比较简单的被denuvo保护的drm(DMM旗下johren平台的drm认证。这个平台是DMM海外游戏业务拓展,上架全年龄/R18游戏。其中PC单机游戏部分会加上这个drm。之所以判断是Denuvo是在最初挖掘代码时看到了Denuvo Anti-Temper字样,加上DMM宣布过加入Denuvo保护,遂确定使用了denuvo,虽然不清楚版本是多少)。最开始是在没有过drm验证的情况下破解,结果发现难度实在太高,便买了一个来过验证再来破解。下面说下我是怎么脱掉denuvo的drm。
一、定位OEP
用x32dbg打开程序,直接点.text段,可以发现大部分代码并没有被虚拟化或者加密,那我们可以直接在401000处下F2断点,跑起来。
程序直接停在oep处,这样oep就被找到了。
二、修复IAT
三、V掉的函数处理
最后我们dump+fix一下,运行程序,发现程序还是会崩溃。回调试器看看,发现有代码跳出text段,说明drm动掉一部分代码,而这段代码被v掉了。
我们仔细跟踪,发现有个地方push两个不同寻常的立即数,call进去后有部分导入,然后又call到vm代码里面了。那我们首先要知道这个函数是干什么的。
对比一下其他程序相同的地方,可以确定这里是循环读取执行一个函数表的函数,而那两个push在原版来看是push了函数表的起始。那我们现在只需要还原这个函数就行。还原这个函数的关键就是找到对应的函数表里的函数,也就是要找到他执行了哪几个函数。这里很简单,只要在401000处下F2断点,只要程序执行到text段就会停下。
这里还有一个规律,vm到对应的函数的调用方式是jmp eax这种方式执行,所以也可以直接判断eax=eip就能找到。
需要注意的是,这种函数不止开头有,程序执行完毕释放时也有可能有,同样需要自己找齐函数地址,模拟循环。
这样简单写个脚本就能找齐。写一个dll来hook模拟一下就行。
总结一下,我破的这个drm在denuvo加密的drm中应该算最简单的了,拿来练练手还是不错的。不过部分步骤还是有点困难。
更多【【新手初试】挑战最简单的脱杀Denuvo DRM加密】相关视频教程:www.yxfzedu.com