首页
社区
课程
招聘
[原创]VC6实现一个简单的SMC(小白学习的第一个保护技术)
发表于: 2020-4-16 21:23 6274

[原创]VC6实现一个简单的SMC(小白学习的第一个保护技术)

2020-4-16 21:23
6274

自己做re经常碰到smc,折腾久了也会手痒痒自己弄一个,算是对PE结构的巩固。。。技术本身也不太难懂,折腾完发现也没弄出啥有技术含量的东西,就算作学习加密技术的一个开端吧

pe结构

一丢丢C语言功底

相对汇编编写smc,C语言编写smc一大缺点就是难以准确定位到某个函数,所以要用到添加段的操作,以区块为加密单位,所以将要加密的代码放到一个新区块中

#pragma code_seg(".SMC") 表示将代码放入 .SMC 段中

后面还要跟一个 #pragma code_seg( ) 是为了把其余代码放入原本的段中

#pragma comment(linker, "/SECTION:.SMC,ERW") 设置段的属性位可读写,没有这一步也可以用 VirtualProtect 进行修改

运行程序应该看到fun()是可以正常运行的,若使用 vs20xx 可能需要修改一下编译的设置才能成功生成新段

首先需要定位到镜像文件的基址

通过基找到程序的 DOS 头(PIMAGE_DOS_HEADER 类型),再通过 DOS 头找到 PE 文件头(PIMAGE_NT_HEADERS32 类型):

利用 PE 文件头找到第一个段和段的总数:

通过遍历 Snum 个段,对比段的 name 就可以定位到想要的段了。

集合上述方法编写了一个查找指定区段的函数:

对代码的操作有一点麻烦,用上面得到的目标段得到段首的偏移再加上映像文件的基址得到定位到真正的段首地址。

然后先把代码开始的位置转成一个 void 类型的指针,再把数据转成 BYTE 类型输出。

打印出来颇有一种一位位读取机器码的效果。

编写赋值语句尝试对机器码的值进行修改,动调查看流程确认无误后加入 key 对代码进行加密

利用异或以外的加密方式可以提高 smc 的威力

把各个步骤整合到一起,编译

但是编译好的代码并没有对敏感代码进行加密,于是我们还需要直接对生成好的 pe 文件动刀,方法也很简单,只有找到位置一个个 BYTE 改就ok了,这里我做了一个读取文件的 demo ,因为代码不太长,所以试了试直接用 winhex 一位位抠也是可行的。。。。

最后把写好的程序放在这里:
密码是:2077
smc 还是要配合上其他加密算法和保护手段才能发挥其真正威力,回头看自己折腾出来的代码总觉得很幼稚。。。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-4-17 15:43 被ljahum编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (3)
雪    币: 14539
活跃值: (17553)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
mark,楼主辛苦了
2020-4-17 00:19
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
学习了,请问 “若使用 vs20xx 可能需要修改一下编译的设置才能成功生成新段” 编译设置怎么改啊,我的#pragma code_seg没有用啊
2020-4-17 10:06
0
雪    币: 299
活跃值: (605)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
alphc 学习了,请问 “若使用 vs20xx 可能需要修改一下编译的设置才能成功生成新段” 编译设置怎么改啊,我的#pragma code_seg没有用啊
我用的vs2013,对着项目右键然后找 属性--> 配置属性--> c/c++ -->优化  把“优化”里面的所有优化选项关掉就ok了,其他版本的vs还没有试过,如果有其他大佬有更好的方法也请一定分享一下。。。
最后于 2020-4-17 15:37 被ljahum编辑 ,原因:
2020-4-17 15:36
0
游客
登录 | 注册 方可回帖
返回
//