首页
论坛
专栏
课程

[调试逆向] [原创]Securom通用破解器SRLoader的逆向分析

2018-8-6 23:54 4928

[调试逆向] [原创]Securom通用破解器SRLoader的逆向分析

2018-8-6 23:54
4928

Securom通用破解器SRLoader的逆向分析

首先申明,这篇文章主要逆向分析了SRLoader程序,该分析过程对分析securom壳帮助甚微。但是,通过对其分析,我们可以学习 一种 破解补丁制作思路,拓宽视野。

两年多前了解到国内大牛公开了一款针对securom的通用破解程序-----srloader,关于securom的资料网上不多,经过使用之后,发现其确实能对当时采用securom的许多游戏进行破解。感到十分震撼。本人由于是对游戏破解充满了好奇而开始的逆向学习之旅。所以决定对其进行分析,查看其如何实现的破解。

至于为何两年过后再进行发文,其一是,两年过后发现居然没有一篇针对该工具的分析文章,感到十分可惜。其二是,毕业多年,发现在校学弟都在看雪发了多篇精华感到汗颜。其三是,最近逆向分析了一款软件,毕业后多年未进行逆向分析,感觉又回到了年轻的时候。

最后对该工具作者致以敬意。本人以前也分析过一些破解补丁,但是它们多数都加了强壳,其一可能是为了防止厂商进行破解分析来进行反制,其二,却也阻挡了大多数热爱逆向的人通过补丁进行学习。但是srloader这款工具却并未加任何壳,也一定程度体现了作者的无私。再次强调,通过对其分析,对securom的脱壳帮助不大,但是我们可以知道,国内一些人多年前对其逆向以及加密算法已经分析的比较透彻了。

说了这么多废话,那么开始正题了。

 

程序主要是两部分,一部分是前台程序SRLoader.exe,另一个是SRLoaderHook.dll。前台程序通过将dll注入,来获取解密所需信息。程序分三阶段,前两阶段都是获取密钥计算信息,第三阶段将解密的信息填入程序对应区域,完成破解。


首先分析SRLoader.exe,由于其需要加载游戏程序,于是我就通过CreateProcess来进行启动游戏的定位。

对该函数使用ida进行反编译,基本上能断定在运行程序后进行dll注入。如果有怀疑的话,可以进行动态调试确认。本文主要采取静态分析的方式,其一是,静态分析对于理解其破解方式已经足够,其二是,由于其进行多阶段dll注入,动态分析需要同时追踪主程序以及其运行的注入程序,较为繁琐。

然后通过ida交叉引用,往上找调用。

这就是点击启动游戏时所执行的函数。首先创建了共享文件映射,该映射在dll中也会建立。是前台程序和dll之间的通讯方式。然后对其进行了初始化。

 

其次,创建了线程函数,同时启动游戏并注入。由于执行顺序是前台和dll互相交互运行,我将沿着自己对于程序执行的理解,在两个程序间交互式分析,以期达到便于理解程序的目的。接下来我们对注入的dll进行分析。首先直接到达DllMain。

可以看到注入的dll也打开了通讯用的共享文件映射。

然后一路向下分析,到达0x10001560,这是dll进行patch的主要函数。可以看到,为了方便分析,我已经对mapviewoffile中进行了数据结构定义。

首先注入程序运行到0x10001c70函数,该函数主要任务是在程序中搜索字符串,51 83 C1 08 51 FF,然后将找到的地址存入mapviewoffile->search_addr1中,用来作为后续进行hook的地址,该地址主要用来获取解密所需信息。

 


获得hook地址后,程序就调用TerminateProcess退出。此时第一阶段结束。然后我们回到前台程序。此时当发现hook地址找到后,就重启游戏程序。


接着回到dll程序,此时hook地址已经找到,调用0x100016b0。其通过对我们刚才找到的地址进行hook,根据0x68,0xc3。我们可以看到采用hook的方式为push hook_target,ret的方式。同时将原来指令存储下来,用作恢复。并且src存储hook地址,用作hook结束之后恢复运行的起始地址。接下来就是分析hook_getinfo函数。 

 


首次运行到hook_getinfo函数时,将执行最后一个分支。

该分支用来获取machine_info。然后恢复hook。

 

之后再寻找patch点,

字节为AD 01 00 00 02 00

或者 AD 05 00 00 02 00

该patch点最后是用来填写解密后的密钥,此时还需要部分信息,此时key_ok为0。作者将其偏移0x95处填充为0xff,猜测可能会对后续获取的解密字段进行影响。本文只对其行为进行分析,并未对加解密算法做深入分析。

 

然后再次hook,此时是hook原来search_addr1后13字节,该hook点主要用来计数,根据不同的计数,原来的hook点执行不同行为。相当于,在原来的hook点上根据后面13字节运行到的次数,来决定自己接下来所做的行为以及获取的信息。


 

当首次运行到此处hook时,再次hook原来地址,再次进入hook_getinfo分支 时,此时run_count=1 。该处两个函数主要是获取gameid,和Modulus,并将Modulus写入文件,具体意义不明,但是这些都是为了计算所需密钥。完成后关闭程序。此时第二阶段结束。

 

此时我们又回到前台程序中,由于module文件已经创建成功,说明所需注册信息完全获得,将调用calc_key函数进行密钥计算,具体计算方法感兴趣的可以自己分析,同时再次启动游戏程序进行注入。将算出秘钥填入相关位置。

回到dll程序。由于此时key已经计算出来,我们执行key_ok分支,其关键为0x10001d70h函数。

 

之前我们已经分析过了,它寻找patch点,

字节为AD 01 00 00 02 00

或者 AD 05 00 00 02 00

此时由于key已经算出,我们填充算出的key而不是0xff。至此破解完成。

 

分析到这里,SRLoader的破解方法已经分析完成了,其主要通过dll注入获取计算密钥的信息,然后将密钥填到适当位置进行破解。其中分为三阶段,第一阶段获得hook地址,第二阶段通过hook位置获得解密所需数据,第三阶段将解密数据填入相应位置进行破解。这些参数的意义,密钥的算法,获取关键信息的位置如何得来。本文并不能给出一个解答,这需要对securom深入的分析。

流程稍微有点复杂,相关文档都附在压缩包中。最后,细心的朋友可以发现程序中有许多log函数,可能程序比较复杂,作者也通过log来辅助编写。为了更加明晰的了解该程序,我也将srloader进行简单patch一下,使其打印出log信息。可以与我的分析相互作为参考。

 

最后再次感谢作者的奉献的如此优秀的工具。以及耐心读到这里的读者。



[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最后于 2018-8-7 08:15 被cuannuo编辑 ,原因:
上传的附件:
打赏 + 1.00
打赏次数 1 金额 + 1.00
 
赞赏  junkboy   +1.00 2018/08/07
最新回复 (0)
游客
登录 | 注册 方可回帖
返回