首页
社区
课程
招聘
[讨论]Securom7保护技术初步解密
发表于: 2007-1-5 19:59 6134

[讨论]Securom7保护技术初步解密

2007-1-5 19:59
6134
Securom7应该是现在最新版本的Securom了,现在我们来初步研究下。这次的目标是发明工坊2繁体版(其实被Securom7保护的游戏很多,但是像发明工坊2这样只有1CD容量的极少......)
    首先入口与前一代有了区别,在区段上这次多了一个.INIT段,入口也指向这个区段内,而前一代是指向.text段内,通过跟踪得知这个区段的作用仅仅是为了解码并填充.text区段的代码(文件中.text区段的文件大小是0)。然后为了以后能跳过这一步,我们在运行到达.text区段的时候dump并修正OEP。这样的文件并不会影响Securom7的正确运行。
    然后,从这里的OEP来看,Securom7像是用C++写的,当然这只是题外话。然后在他的WinMain里面才体现出与前一代明显的不同。这一次Securom7的代码非常的难以阅读,模式化的花指令使用,一片片的T标志位检查,还有对随处对代码的计算和的使用,其实如果只是前面2个,完全可以使用工具去处。但是第3个就会出问题,Securom7对代码计算和的使用有两种:一、判断是否与预期的计算和一致,不一致就引发异常;二、使用计算和参与2次加法运算,并以计算结果为下一个EIP。在这两种方法的交替使用下,想看懂代码确实很难。
    之后Securom将出现异常,原因是他将检查每个0x1000的整数倍的地址的起始字节是不是"MZ",从程序的ImageBase+ImageSize至0xC0000000,估计目的是枚举内存中的模块。
    下面如果你使用OD调试状态来运行,Securom会给你一个提示说一个必要的安全模块不能激活,不能继续执行。以分析而言,Securom7在运行中解压了一个DLL,它的注释是Securom context library for Explorer(好象是这个,忘了,因为后面并不需要关心它)。所以推测Securom在运行中会向父进程加载这个DLL,然后这个DLL在写入一些什么东西给Securom,以实现继续正确运行。
    鉴于此,我们使用其他方法获取了程序的OEP,并dump后使用PEID检测为Borland C++ 1999。
    下面我们来看这个dump出来的程序,首先我们看见区段表中不再有Securom的4个区段,然后我们使用OD载入之后发现IAT很完整,调用也没什么问题,但是有些call却是指向一个jmp [],其内存地址处于.Securom区段中,所以我们修改区段表,把被隐藏的Securom的部分重新补出。
    然后我们进入了第一个JMP [](地址忘了,不是在自己机器上写的这个帖子...),首先是3个PUSH,然后PUSHFD,修改[ESP+4],然后POPFD,然后RETN至解码重定向过程。当然我们可以例遍所有的重定向将他们还原。
    之后,我们看见大部分的这些跳转都回到了游戏的.text区段中,但是有一些还是在其他的地方,那些是Securom7的最大变态之处。这种偷代码的技术在很多保护软件中都有,但是像Securom7这种一偷就是一个过程,而且数量高达500个以上的我想不会太多。
    在被偷走的代码里,被变形的并不多,只是会在遇到call的时候进行下变形,会是下面几种可能:
push 下一段代码的起点
jmp 调用位置
垃圾字节
下一段代码开始
或者是:
push 下一段代码的起点
push 调用位置
retn
垃圾字节
下一段代码开始

    之中还会有一些对某个地址内的值减1的操作,然后你会发现减之前这些内存位置中的值就是1,为什么呢?其实只是为了下面那个je指令能成立,然后那个je指令会带我们回到游戏的.text区段中的一条让刚才做过减法的内存地址获得一个新的值,然后再下面是一个jmp指令回到前面je指令后面一条指令继续执行,也就是说实际上是一段没有任何意义的代码。
    当然其中还有另一种变形的方式,只不过用的相对较少:
push Loc1
push Loc1
retn
垃圾字节
Loc1:
mov reg, 常量1        <-随机产生,或者是某个垃圾字节的位置
xor reg, 常量2        <-随机产生,或者是某个垃圾字节的位置
push reg
add [esp+4], 常量3 <-修改返回的地址
retn
    好了,目前我也就到了这一步,希望没说什么让大家觉得奇怪的话。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 342
活跃值: (323)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
2
两个字,记性好
2007-1-5 20:49
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
3
记得Securom的Anti不算难
2007-1-5 21:22
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
现在还没有一个破解小组可以把所有SR7加密过的CALL都还原
所以用SR7加密过的游戏,速度一般都会比没有加密之前慢(为什么?很简单,因为调用一个API要走好几千条垃圾指令)
而且在内存里大量散发LJ,破解SR7很容易,但是想完美修复到和原版一样的话,基本不可能!(除非你肯手工做)
2007-1-5 22:24
0
游客
登录 | 注册 方可回帖
返回
//