RE May 22, 2020

smc加密研究

Words count 4.8k Reading time 4 mins. Read count 0

一、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
2
3
int (*p)(char *s);
p = game5; //game是我们要加密的函数名
uint8_t *pt = (uint8_t *)p;

这样子pt就是我们函数的启始地址,于是pt[i]就能得到每一个代码的机器码,从而实现加密。

3、简单的smc加密利用
1
2
3
4
5
6
7
8
9
10
11
12
13
void smc()
{
int (*p)(char *s);
p = game5;
mprotect(0x400000, 0xF000, PROT_READ | PROT_WRITE | PROT_EXEC);
uint8_t *pt = (uint8_t *)p;
/*decrypt here*/
for (int i = 0; i < 100; i++)
{
uint8_t tmp = pt[i];
pt[i] = tmp ^ 0x87;
}
}

这里是对每一个机器码都进行了异或加密,但是这是对运行时进行解密的算法,所以我们gcc编译出来的程序,需要先手动加密一波,自己写个脚本:

1
2
3
4
5
6
7
#!/usr/bin/env python
ads = 0x402219
end = 0x4022F8
while ads <= end:
PatchByte(ads, Byte(ads) ^ 0x87)
ads += 1
print "OK"

从而得到效果

image-20200522121157036

image-20200522121228913

其实smc的重点在于加密算法,这里的是异或加密算是比较简单的类型,还可以加tea等算法其实,会更好玩。

0%