VMProtect的调试信息到底要怎么去清理干净,还有那些没清掉的调试信息残留下来,又会对保护的效果造成哪些影响,这个事情的重点,是要把程序自己内部带着的那些调试符号,跟在构建目录里面放着的PDB、MAP这一类的辅助文件给区分开来。前者是有可能直接就暴露在发布出去的程序里面的,后者呢,虽然不一定会被打包进那个可执行的文件,可要是跟着安装包一块儿被交付出去的话,一样也会把分析代码的难度给降下来。在做清理的时候,不能光是把文件给删掉就算完事了,编译、链接,还有VMProtect项目里面的那些相关的选项,也是要跟着去检查的。
一、VMProtect调试信息怎么清理
调试信息这个东西,通常是编译器和链接器给生成出来的,VMProtect它负责去处理的,是最后那个输入的文里面所包含的相关内容。一种比较稳妥的流程,是在内部留好一套用来调试的版本,然后再单独去生成一份专门拿来交付的保护版本。
1、调试信息清理的选项要被启用
把VMProtect的项目给打开了以后,在保护的选项当中,去把【Strip Debug Information】这一项给启用起来,然后再去重新生成一份受到保护的文件。
这个选项,就是专门被用来把应用程序里面的调试信息给移除掉的,用它来让函数和符号的那些信息能够少往外暴露一些。对于那些用.NET写的程序,它还会去对没有被排除掉的类、方法、属性,还有字段,动手进行重命名的处理。
2、符号文件不能跟着安装包一块儿被发布出去
要去检查一下发布目录里面的【PDB】、【MAP】,还有调试的日志和中间构建的那些文件,只把程序真正运行起来需要用到的那点内容给保留下来。
PDB和MAP这种东西,是可以在内部被拿来定位函数、导入要被保护的对象,还有分析崩溃原因用的,但并不适合直接就交到普通的用户手上去。VMProtect的那个许可系统的示例,它所采用的方式,也是不在程序里面保留调试的信息,同时呢,又单独去生成一份MAP文件,来专门供保护阶段去使用。
3、被清理的应当是发布目录而不是开发目录
可不要直接跑去把开发环境里面的全部符号文件都给删了。一种更合理的做法,是把原始的程序、符号的文件,还有保护的项目,都放进那种受到管控的归档里面去,然后再去建立一个独立的、用来做Release输出的目录。
这样子去处理的话,线上跑着的版本就不会再带着调试信息了,而内部又能够在崩溃现象出现的时候,根据对应的版本号去找回那些符号。要是光只留下一份被保护过的程序,等到后面再想去把异常的地址给定位出来,就会变得很困难了。
二、调试信息残留会影响哪些保护效果
调试信息的残留,一般来说并不会让虚拟化、变异,或者是压缩这些功能直接就失去作用,但它却能帮助那些做分析的人,让他们可以更快地去把程序的结构给理清楚。保护的那一层虽然还在,可是定位到关键函数和业务模块所要付出的成本,却有可能是会明显地被降下来的。
1、函数和代码的结构会被暴露出来
符号的名字是有可能直接把函数的用途给说明白的,就比如授权验证、配置加载、加密处理,或者是网络请求这类,就算那些关键的函数已经被做过虚拟化了,可一个清楚的名字再加上调用关系,还是照样能够给分析提供一个方向的。
源文件的名称、行号,还有类型的那些信息,也是有可能帮着外面的人,把汇编代码跟原来那个工程的结构给对上号的。去清理调试信息,它主要的价值,差不多就是用来减少这一类的额外线索的。
2、重命名和混淆的效果会被降低
.NET的程序,要是把类型和成员的名字保留得太过完整的话,那么类和类之间的职责划分,通常就比较容易被人给判断出来。在把调试信息的清理给启用了以后,VMProtect是会去对那些没被排除掉的类、方法、属性,还有字段,进行重命名的,所以说,那些残留下来的符号,是有可能会把名称混淆所带出来的效果给削弱掉的。
不过话又说回来,那些要依赖于反射、序列化、配置的绑定,或者是按名称来调用的成员,它们是不能够随随便便就被把名字给改掉的。在处理这一类型的程序的时候,是应当先把排除项给设置好,然后再去对程序的启动、授权、插件的加载,还有数据的读写这些环节进行测试,看看它们还是不是正常的。
3、版本和崩溃信息的泄露会被增加
调试文件、日志,还有异常的堆栈里面,是有可能会带上本地的路径、工程的名称、模块的名字,以及构建的一些信息的。这些东西,倒是不一定就会直接把核心的算法给暴露出去,可它们终究是会帮着外面的人去判断,到底用了什么框架,模块是怎么划分的,版本之间又有哪些差异。
三、清理完了以后要怎么去验证
调试信息被清理完成了之后,可不能光是去看输出目录里面是不是少了几个文件就完事了,还得去确认一下,程序的功能、保护的项目,还有内部的诊断流程,是不是都还能够接着被正常地使用。
1、发布包的内容要被检查一下
要去核对一下安装包和更新包里面,是不是还夹带着PDB、MAP、临时的日志、做测试用的配置,还有没被保护过的原始文件。同时也要去检查一下压缩包、增量更新的目录,还有那些自动发布脚本,要避免出现主目录虽然被清过了,可别的交付路径里面还在带着旧文件的那种情况。
2、依赖名称的那些功能要被测试到
对于.NET的程序来说,应当重点去测试一下反射、序列化、插件的发现、配置的绑定,还有界面资源的加载这些地方。要是清理做完了以后,某些模块开始出现找不到类型或者找不到方法的情况,那就需要去调整一下重命名的排除范围,而不是简单地把整个清理选项给关掉了事。
3、内部符号的归档要被保留下来
要照着【产品的版本】、【构建的编号】,还有【发布的时间】这些维度,去把没有被保护过的程序、PDB、MAP,连同VMProtect的项目文件都给保存好。当线上发生崩溃,只留下地址信息的时候,就可以用跟它对应版本的那些符号,在内部去进行还原,不必非得把调试文件给塞进用户的环境里面。
总结
关于VMProtect调试信息怎么清理,还有调试信息残留会影响哪些保护效果,主要的做法,就是去启用Strip Debug Information这个功能,把交付目录当中的PDB、MAP,还有中间文件都给清掉,与此同时,在内部把符号归档给保留好。调试信息的残留,一般不会直接就让代码虚拟化或者变异保护失去作用,可它会通过暴露函数的名称、类型的结构,还有源代码的线索,来把分析的门槛给拉低。清理做完了之后,还得去测试那些对名称有依赖的功能,不能为了把符号给藏起来,反而影响到了程序正常地去跑。
