前言
在程序代码安全,为了防止开发的代码被反编译或者破解等.需要对常见的安全机制有一定了解.通常,我们的代码经过编译之后,已经是汇编代码,然后再连接,汇编.转为二进制代码.还原其实是一个逆向过程.通常,我们的程序被破解可以分为两种思路,有时候也会结合.静态分析,动态注入.
静态分析
对于二进制的代码,我们通常需要使用工具进行反编译或者调试.这里常见的加密有加壳.加壳是隐藏真正的一个程序执行代码段.对应的,想要加壳,我们需要了解windows的文件PE结构.
加壳之后,并不能阻断通过断点调试来debug我们的程序,所以.我们还需要对常见的debug断点进行检测.所以,这里在PE我们需要对windows的中断的使用与检测进行了解,在程序发现断点调试的时候,进行拦截或者退出处理.
还有一步,可以对代码进行混淆.这个其实没多大用.主要是加壳+调试器检测.
动态注入
windows本身的程序其实已经做了一些安全机制.但是通常比较容易绕过. 例如进程不能访问其他进程的内存数据.进程占用的内存是相互独立的.但是可以通过一个windwos的API来进行绕过.例如通过调试分析获取到某个函数的地址,在注入的dll里面直接进行调用.
通常我们需要可以进行检测自身程序加载的模块.定时扫描 来检测是否有别的模块加载进来.
我们在内核层,对一些访问自身程序内存的windows api 进行hook,返回一些错误数据.或者进行检测等.在这一层,我们需要对已有的外挂技术手段进行不断的了解,例如一般使用的api会有哪些,应该对哪些api进行保护.
学习的顺序: C/C++ -> 汇编 -> PE文件结构 -> 加密/解密壳 -> 注入 -> 内核安全 -> hook -> debug检测