一、smc的概念
所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据。计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。现在,很多加密软件(或者称为“壳”程序)为了防止Cracker(破解者)跟踪自己的代码,也采用了动态代码修改技术对自身代码进行保护。
二、smc的具体实现
这里涉及到函数指针和mprotect函数开段权限,因为我们要在程序执行过程中对代码进行修改,也就是说要有写的权限。
1、调用mprotect函数
给text段一个写的权限,一般这么定义:
1 | mprotect(0x400000, 0xF000, PROT_READ | PROT_WRITE | PROT_EXEC); |
这样子,代码段就能被附上写的权限了,我们就能在执行时对代码块中的机器码进行修改
2、函数指针的使用
因为需要定位到我们想要加密的函数的位置,所以需要利用c语言中的函数指针,这里我们这样子定义:
1 | int (*p)(char *s); |
这样子pt就是我们函数的启始地址,于是pt[i]就能得到每一个代码的机器码,从而实现加密。
3、简单的smc加密利用
1 | void smc() |
这里是对每一个机器码都进行了异或加密,但是这是对运行时进行解密的算法,所以我们gcc编译出来的程序,需要先手动加密一波,自己写个脚本:
1 | #!/usr/bin/env python |
从而得到效果
其实smc的重点在于加密算法,这里的是异或加密算是比较简单的类型,还可以加tea等算法其实,会更好玩。