软件加壳以后,很多人往往只盯着程序能不能正常启动,却很少注意到在运行的时候,内存里的代码和数据是不是还容易被别人直接抓走。所以,要把Themida的防转储功能用好,先得弄明白两件事:一是这个防转储功能到底从哪里去打开,二是万一防转储被触发了,程序会表现出哪些不一样的现象。这几点主要跟保护选项里面的Anti-Dumping、防调试,还有对运行环境的检测有关。Themida本身就是一款专门给Windows软件做保护的工具,它的作用就是尽量不让别人把自己的程序直接拿去做反汇编、反编译、修改,或者把内存内容给转存出去。
一、Themida防转储功能怎么开启
防转储这类保护,开始调试的时候最好不要直接往正式的发布包上面去套,比较稳妥的做法是先单独复制一份工程配置出来,用专门拿来测试的程序包去验证一遍,看看启动、授权、在线更新还有出错日志是不是都正常,等这些都确认没毛病了,再把这一套设置合并到正式的保护流程里面去。
1、打开保护工程
先把Themida启动起来,把需要保护的那个EXE或者DLL给加载进去,然后仔仔细细地核对一下,输入的文件路径对不对,最终生成的文件要放到哪个位置,授权那一块儿有没有配好,以及整个保护工程是不是都设置正确了。还没有保护过的原始文件,和经过Themida处理之后生成出来的新文件,这两个一定要分开存放,千万别让新文件把源码编译出来的产物给盖掉了。
2、进入Protection Options
在Themida窗口左边那排保护选项里面,找到跟Anti-Dumping、Anti-Debugger、Advanced Protection这些相关的页面。不同版本界面上的叫法可能会有一点点不同,但大致上我们只要盯住那些带着dump、memory dump、unpack、debugger detection字样的选项就不会跑偏。Themida官方的FAQ里面,也是把防调试、崩溃转储,还有保护以后程序跑得不正常这些问题,统统归到了Protection Options这块来讨论。
3、启用Anti-Dumping
把防转储相关的那些选项勾上以后,头一次生成测试包的时候,最好先按它默认的保护强度来,不要一下子就把一大堆高级选项全都打开,万一后面程序启动的时候直接失败了,我们根本分不清楚到底是防转储在起作用,还是防调试、虚拟机检测,或者API包装哪一个环节弄出来的问题。
4、配合其他保护策略
光靠防转储这一个功能,是不可能把所有问题都挡住的。如果程序里面有一些非常关键的处理逻辑需要保护,那就要同时把代码虚拟化给用上,把那些敏感的字符串加密起来,再配合好授权校验,还有对关键函数的单独保护,这些手段一起用上去才行。Themida后续的更新记录里面,也一直在对虚拟化、API Wrapper、字符串加密这些保护功能做兼容性上的改进。
二、Themida防转储触发后会有什么表现
防转储一旦被触发,它不一定会像普通软件那样弹一个明明白白的提示框出来,很多时候从外面看,就像是程序突然崩掉了、打开就闪退,或者是调试怎么也跑不起来,所以得结合当时运行的环境一块儿来判断。
1、程序直接退出
当Themida检测到有人在偷偷地做内存转储、正在调试它,或者有异常的内存读取动作时,程序很可能一句话都不说,直接就关掉了。在普通用户的视角里,就只能看到窗口一闪就没了,也没有任何看得见的错误提示,这样做当然可以减少把保护信息泄露出去的风险,可是等到自己团队的技术支持去排查的时候,难度也就跟着上去了。
2、启动后卡住或异常返回
在另外一些时候,程序可能并不是闪退,而是打开以后就卡死在某个画面上,怎么也进不到主界面里去,或者授权那一块儿会返回一些不太正常的报错信息。尤其是在客户电脑上既装着杀毒软件,又开着沙箱、企业EDR还有调试工具这些的情况下,Themida的保护逻辑很可能会把人家正常的运行环境也给误判成是不安全的。
3、崩溃转储信息不可用
程序被保护过之后,如果还是发生了崩溃,生成的DMP文件可能就不再像原来那样装着可读的原始执行信息了。Themida的FAQ里也专门提到过这一点,说保护后产生的崩溃转储文件,很可能没办法再像没有保护的程序那样去做正常的堆栈分析,想从里面找出崩溃原因会很吃力。
4、内存转储结果不完整
就算别人想办法用外部的工具成功生成了一份内存转储文件,这份文件里面也可能少了很多能直接还原出代码、导入表,或者关键数据的内容,拿到的也只是一些残缺不全的碎片。Themida的保护目标,本来就是要让程序在运行时的分析和内存数据的还原变得足够麻烦,所以出现这种情况也是意料之中的。
三、Themida防转储误触发怎么排查
当防转储功能开启以后,如果就连正常的客户电脑也没法把程序跑起来,这时候千万不要把所有的保护一股脑儿全给关掉,而是应该一项一项地把范围缩小,慢慢查出到底是哪一条规则在捣乱。
1、先做最小保护测试
我们可以先生成一个只开了最基础的外壳保护、其他什么额外选项都没加的版本,然后再按顺序,一次只打开Anti-Dumping、Anti-Debugger、虚拟机检测和高级保护中的一项,每多开一个选项,就从头到尾去跑一遍启动、登录、授权,还有核心功能,看看是在哪一步开始出毛病的。
2、检查安全软件干扰
很多企业终端上装的安全软件,会对被保护的程序做一些注入、扫描内存,或者拦截API调用这些动作,而这些行为恰好就很容易被Themida当成是恶意的攻击。可以在专门测试的机器上,暂时把这类防护关掉,或者把被保护的程序加进信任名单里面去,然后再对比一下前后的表现,看看是不是这一层干扰在作怪。
3、检查第三方DLL和插件
要是在程序跑起来以后,还会去加载一些额外的插件、内嵌的DLL,或者.NET程序集,那就需要先搞清楚,这些多出来的模块到底是不是也一块儿纳入了保护的范围。在一些公开的技术问答里面也有人说过,单独嵌进去的程序集,不一定能按我们想象中的那样被Themida稳妥地保护起来,先把这些分散的模块合并到主程序里面之后,再对主程序做加壳保护,效果往往会更稳一些。
4、保留保护配置版本
每次只要动过Themida里面的任何一个保护选项,都顺手把工具的版本号、这次打开的是哪几项,还有最后的测试结果,一块儿记下来。这样等到有客户反馈说程序闪退的时候,我们就可以马上翻看记录,判断这一次的问题到底是从哪一次保护策略的改动里面冒出来的,而不是只能靠猜从头再排查一遍。
总结
Themida的防转储功能,一般都是在Protection Options里面去启用,重点关注Anti-Dumping,还有跟它相关的防调试和高级保护选项。这些保护被触发之后,表现出来的可能是程序闪退、启动后卡死、崩溃文件没法分析,或者抓出来的内存转储内容残缺不全。在正式发布给用户之前,一定要拿着测试包对着每一项保护设置去慢慢验证,万一碰到了误触发的情况,就按着先测最小保护、再查安全软件影响、然后检查第三方模块、最后核对配置版本的顺序去排查,这样既能把保护强度给保住,又不至于让正常的使用者受到太多干扰。
