Themida给程序加保护时,经常会碰到某个DLL、插件或者代码区域不适合继续处理。比如第三方模块对加载方式比较敏感,或者某段代码加入虚拟化后运行异常,这时就要把它从当前保护范围里拿出来。Themida对不同对象的处理方式并不完全一样,独立DLL、Protection Macro和XBundler里的文件要分别判断。排除以后仍然发现相关代码发生变化,也要看它是不是又被其他保护选项处理了。
一、Themida怎么排除指定模块
Themida以当前输入程序为主要保护对象,并没有一个适用于所有对象的统一“模块排除”按钮。处理时先确认要排除的是独立文件,还是已经加入程序内部的保护代码块,再决定怎么调整。
1、先确认需要排除的对象
程序里提到的“模块”可能对应不同内容,先把对象找准,后面才不会改错位置。
①、打开当前【Themida Project】。
②、进入【Application Information】确认正在处理的【Input Filename】。
③、查看【Protection Macros】中的代码保护区域。
④、进入【XBundler】检查已经加入的DLL和数据文件。
⑤、进入【Plugins】查看当前嵌入的插件模块。
⑥、记录需要排除对象所在的位置。
2、关闭指定Protection Macro
①、进入【Protection Macros】。
②、在宏列表中找到需要排除的代码块。
③、选中对应的【Protection Macro】。
④、关闭该代码块的保护状态。
⑤、保存当前【Project File】。
⑥、重新执行【Protect】生成测试程序。
Themida允许单独停用Protection Macros中的具体代码块,这种方式比较适合排查某段虚拟化代码引起的运行异常,不必一次把全部宏都关闭。
3、让独立DLL保持原始状态
①、确认目标DLL没有作为新的【Input Filename】单独执行保护。
②、进入【XBundler】检查该DLL是否被加入。
③、不需要嵌入时从【XBundler】中移除目标文件。
④、检查【Plugins】中是否存在同名DLL。
⑤、重新保存【Themida Project】。
二、Themida排除规则设置后仍被保护如何调整
已经关闭某个保护区域,生成文件后却仍然感觉模块被处理,往往要继续检查其他选项。同一个对象可能没有使用VM Macro,但依旧受到API-Wrapping、字符串加密或者XBundler等功能影响。
1、确认修改的是当前实际使用的工程
工程文件较多时,很容易改了一份配置,构建脚本却还在调用另一份。
①、打开准备使用的【Themida Project】。
②、核对【Input Filename】路径。
③、检查【Output Filename】。
④、确认当前加载的【Protection Macros】状态。
⑤、重新保存【Project File】。
⑥、手动执行一次【Protect】进行对照。
2、检查是否还有其他保护宏覆盖同一区域
①、进入【Protection Macros】。
②、查看目标代码附近的其他【VM Macro】。
③、检查是否还有【MUTATE】相关宏。
④、确认同一函数是否通过【MAP File】再次加入。
⑤、关闭重复保护项。
⑥、重新生成【Protected File】。
3、排查全局Protection Options的影响
①、进入【Protection Options】。
②、检查【Advanced API-Wrapping】。
③、查看【Encrypt Strings in VM macros】。
④、检查【Entry Point Obfuscation】。
⑤、暂时关闭怀疑存在兼容问题的选项。
⑥、重新执行【Protect】并测试目标模块。
关闭Protection Macro只代表该代码块不再按宏方式处理,并不代表整个程序中的其他保护功能一起停止。如果问题来自API调用包装或入口处理,就要从Protection Options继续查。
4、检查XBundler和插件设置
如果目标DLL已经从代码保护范围中拿掉,却仍然出现加载方式变化,可以看看它有没有被Themida作为嵌入文件继续处理。
①、打开【XBundler】。
②、搜索目标【DLL】。
③、确认它是否仍被嵌入输出文件。
④、不需要捆绑时删除对应条目。
⑤、进入【Plugins】检查同名模块。
⑥、重新生成程序并测试。
三、Themida模块排除后怎么确认
排除设置完成以后,建议保留一个单独的测试版本。这样可以确认模块确实脱离了相关保护,也不会把其他配置变化混进结果里。
1、用前后两个版本进行对照
①、保留修改前的【Protected File】。
②、生成排除模块后的新【Protected File】。
③、分别运行相同功能。
④、测试目标DLL或代码区域。
⑤、查看【Protection Log】中的处理信息。
⑥、确认异常是否随排除操作消失。
如果关闭某一项后程序马上恢复正常,后续就可以围绕这项保护继续缩小范围,而不用把整个项目的安全配置重新调整一遍。
2、保留已经确认的排除配置
①、保存当前【Themida Project】。
②、记录关闭的【Protection Macro】。
③、记录修改过的【Protection Options】。
④、保存【XBundler】和【Plugins】状态。
⑤、后续继续测试时另存新的工程文件。
总结
Themida里排除指定模块时,先弄清楚对象属于代码宏、独立DLL还是嵌入文件会省事不少。某个宏关掉以后仍然看到变化,也不用急着判断排除失败,因为API包装、入口处理和XBundler都可能继续影响程序。把保护方式一项项拆开测试,再保留一份已经运行正常的工程配置,后面遇到类似兼容问题时会更容易查清来源。
