[原创]【新手初试】挑战最简单的脱杀Denuvo DRM加密
3小时前 219
大家好,本人菜鸟一枚,研究了一个比较简单的被denuvo保护的drm(DMM旗下johren平台的drm认证。这个平台是DMM海外游戏业务拓展,上架全年龄/R18游戏。其中PC单机游戏部分会加上这个drm。之所以判断是Denuvo是在最初挖掘代码时看到了Denuvo Anti-Temper字样,加上DMM宣布过加入Denuvo保护,遂确定使用了denuvo,虽然不清楚版本是多少)。最开始是在没有过drm验证的情况下破解,结果发现难度实在太高,便买了一个来过验证再来破解。下面说下我是怎么脱掉denuvo的drm。
用x32dbg打开程序,直接点.text段,可以发现大部分代码并没有被虚拟化或者加密,那我们可以直接在401000处下F2断点,跑起来。
程序直接停在oep处,这样oep就被找到了。
然后修复IAT,直接用scylla检查,发现缺少kernel32.dll的相关API。这里我们跟进一下,找一个被替代后的call跟进去。
可以发现有一串类似的函数,过掉里面第一个call,就可以发现里面的第二个
push ret就变成kernel32.dll里面的函数了,而且不止是当前的call,这一串所有的call最后都被还原了。
我们在内存里面看一下,发现是一连串的call表,我们直接把这个表复制到IAT里缺少的部分,这样IAT就修好了。
最后我们dump+fix一下,运行程序,发现程序还是会崩溃。回调试器看看,发现有代码跳出text段,说明drm动掉一部分代码,而这段代码被v掉了。
我们仔细跟踪,发现有个地方push两个不同寻常的立即数,call进去后有部分导入,然后又call到vm代码里面了。那我们首先要知道这个函数是干什么的。
对比一下其他程序相同的地方,可以确定这里是循环读取执行一个函数表的函数,而那两个push在原版来看是push了函数表的起始。那我们现在只需要还原这个函数就行。还原这个函数的关键就是找到对应的函数表里的函数,也就是要找到他执行了哪几个函数。这里很简单,只要在401000处下F2断点,只要程序执行到text段就会停下。
这里还有一个规律,vm到对应的函数的调用方式是jmp eax这种方式执行,所以也可以直接判断eax=eip就能找到。
需要注意的是,这种函数不止开头有,程序执行完毕释放时也有可能有,同样需要自己找齐函数地址,模拟循环。
这样简单写个脚本就能找齐。写一个dll来hook模拟一下就行。
总结一下,我破的这个drm在denuvo加密的drm中应该算最简单的了,拿来练练手还是不错的。不过部分步骤还是有点困难。
[2023春季班]2023,新的征程,脱壳机更新、iOS/eBPF、赠送云手机套装!一块裸板虚拟化五个容器云手机!3月25日起同时上调价格并赠送新设备!