首页
社区
课程
招聘
[原创]cxk壳的流程实现和复盘
发表于: 2019-6-30 21:49 17636

[原创]cxk壳的流程实现和复盘

2019-6-30 21:49
17636

在开始正文之前, 说一些题外话。

1.这是本人在论坛注册后的第二次发帖,如果有格式错误, 发布的版块错误, 请各位明示指出。管理员也可以删帖。

2.因为本人水平有限, 某些地方写的可能是错的, 也请各位大佬指正, 不胜感激。

3.以下文章提到的壳子是本人编写的第二个壳子。编写过程中, 面临毕业找工地搬砖,以及学习新知识,等一系列事情。所以做的并不好。

4.这个壳子并没有起名字, 某些大佬称它为 cxk壳 。壳子中代码 回滚加密 和字符串加密 是我一个同学实现的, 这篇文章只写我自己实现和参与实现的部分。

5.这个帖子是本人对写壳过程的一次复盘。会写一些经验教训, 错误总结, 整体实现思路,和一些没有实现但是觉得很有用的点。

6.为什么要发这个帖子?

       1)本人在学习的时候, 大量阅读了论坛的优秀文章, 受益良多,饮水思源, 自己有一些经验也想分享出来,希望跟我一样的小白可以受益。

7.各位看这个帖子能得到什么?

       1) 在写壳过程中我自己的一些思路(老师指点和个人总结)。   

       2) 两个可用反调试。

       3) 写壳过程中,所有我走过的弯路, 踩过的坑, 大家可以引以为鉴。

       4) 写壳过程中, 一些虽然没有实现, 但是我觉得很棒的思路, 大佬们以后或者可以用以下。

       5) 加壳源码以及shellcode。


加壳语言:                     c++

目标软件文件格式:       PE

加壳平台:                     win32 / win64 (最开始写的时候 只希望在w7 32位平台可以运行)


    软件加壳是为了更好的保护软件, 目前世面上各种成熟的商业壳很多。从技术上讲, 攻防无绝对, 很多很厉害的商业壳被更厉害的大佬脱的干干净净。

    目前强度很高, 最富盛名的壳子是VMP。

    当然VMP壳也有对应的脱壳方法, 有人做过工作量计算, 如果一个大佬一个人全职脱壳(体量不大的情况下), 大概半年能完全脱掉。

    厉害的壳子并不是完全杜绝破解者破解, 因为大佬无穷多, 总是有对应的解决办法。厉害的壳子是像VMP壳一样, 拉长破解者破解的时间。大概是那种,我知道各位很厉害, 我也知道各位一定能破解的了, 我只是希望能多托各位几天。

      在这种理念前提下, 写壳的时候, 更多就是计算攻防双方的时间成本。


以下是一个表格,  以攻防双方水平差不多为大前提.

举例不同手法下, 防守方实现防守手段时间,和攻击方成功破解所花费时间。n表示 > 1的未知数。



由上可见, 在写壳的过程中:

        最理想的情况是:设计出一套 高性价比手法的加壳方案(实现起来简单, 破解起来麻烦)。

        退而求其次的是:设计一些 中性价比的方案, 争取攻防双方消耗同等时间。

        极力要避免的是:低性价比的手法, 防守方实现起来无比麻烦, 攻击方三两下干掉。


在明确加壳宗旨前的写壳计划:



在经过老师指点,明确加壳宗旨后,修改的工作计划

1)对原计划的更改


这里本应该放弃 编号2 编号3 两个低性价比的方案, 但是在调整方案前, 编号2第性价比的方案就已经写完。所以只放弃了编号3性价比低的方案。


2)新增的工作计划




导入表相关:

导入表这里一共做了3个操作:

1 目标文件原导入表被清0, 运行时在堆区申请空间, 填写API地址, 把堆区地址写入IAT, 完成IAT混淆。

2 堆区填写IAT地址的时候, 为防止破解直接跳转到关键点, 写了6段垃圾代码, 随机选用填充。

3 在填写API时候, 并未直接出现函数名的字符串对比,而是对函数名算了个hash, 通过Hash对比填写API地址


把上面的操作一步一步展开说:

    1)原文件导入表清空填0 代码如下

     (受限于篇幅 这里贴了部分代码 完整代码看附件)


2)垃圾代码填充 申请堆区空间 完成IAT混淆 代码如下

    (受限于篇幅 这里贴了部分代码 完整代码看附件)

这里注意!

这里注意!

这里注意!

填充的垃圾代码有注意事项

 1) 不能修改寄存器的值 如果要修改寄存器的值, 一定要事先保存, 然后恢复。

 2) 也最好不要修改 eflag寄存器的值 

因为执行一些API的时候, 会用寄存器做参数传递, 这里切记不要破坏环境。

因为之前犯了这个错误, 调bug调了几个小时。


正确的姿势如下实例: 

以下代码对应的缓冲区为 sz_code_buf3



当前方案的缺点:

     当前的垃圾代码只有6段,细心一点的破解者完全可以识别一下6段垃圾代码特征,针对不同的代码跳到不同的位置。秒破。    


未实现的更好的思路:

     比起手写垃圾代码 随机选用不同的填充。还有一个更好的思路。但是这个壳子并没有实现。

     这个思路就是随机生成垃圾代码。

     随机生成的好处: 破解者修正的时候 无法定位到关键的地址。

     此思路要结合其他条件,比如不能让破解者定位到返回随机数的关键点。不然每次返回一样的随机数就凉了。


3)使用hash对比获取函数地址

为何要这样做:  如果直接用字符串进行对比的话, 很容易被攻击者定位还原

实现思路:         读取原程序的导入表信息 对函数名计算一个hash值, 存到外壳程序。获取函数地址的时候 从外壳中取出 hash 进行对比。



以下为hash算法源码   加壳器和外壳hash算法一致


原文件导入表读取函数名, 获取hash后序列化到文件的代码



在这一步踩过的坑 需要注意的点:

这里注意 !

这里注意!

这里注意!

千万不能用MD5 !!!! 或者是我用md5的姿势不对

因为用了md5算hash的话 特别卡。。实测一个1m多一点的程序使用md5对比获取函数地址的时候。双击运行,大概10分钟之后才跑起来。

所以这里大家可以自己写一个简单的hash算法。



已经烂大街的用过无数次的反调试, 被调试器各种检测的反调试 这里就不再赘述了。

这里会提到两个至今可以用的。 偏冷门一点的反调试。


在提到之前。首先说一下。当前这个壳子在触发反调试后的操作

    1) 触发反调试后。退出进程

    2) 触发反调试后,继续运行,但是会修改关键数据。输入正确序列号会算出一个错误的值。

    3) 触发反调试后,对代码段进行异或处理。被修改的代码段执行后一定会崩掉。


之所以设计以上三个流程。是为了让破解者产生一种错觉。

类似于 "这次程序没退出,这货的反调试应该被我清干净了"。


可用反调试1 


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

最后于 2020-1-31 21:51 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 11
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  天水姜伯约   +5.00 2019/08/19 精品文章~
最新回复 (22)
雪    币: 412
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持一下
2019-7-1 01:15
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
3
果然周末发出来了。多多交流!
2019-7-1 07:46
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
4
挺厉害的!
2019-7-1 11:20
0
雪    币: 457
活跃值: (338)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2019-7-1 11:27
0
雪    币: 11160
活跃值: (3115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
厉害了
2019-7-1 11:49
0
雪    币: 1790
活跃值: (3786)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
很不错的思路,不在于技术难度,而在于运用思路上。
2019-7-1 11:50
0
雪    币: 3407
活跃值: (1242)
能力值: ( LV13,RANK:335 )
在线值:
发帖
回帖
粉丝
8
致敬
2019-7-1 20:33
0
雪    币: 5190
活跃值: (9717)
能力值: ( LV9,RANK:181 )
在线值:
发帖
回帖
粉丝
9
666,这是发帖就精啊!
2019-7-2 08:18
0
雪    币: 9955
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
 awesome
2019-7-2 08:40
1
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
2019-7-2 09:59
0
雪    币: 1887
活跃值: (360)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
12
666厉害了,学习一波
2019-7-2 10:06
0
雪    币: 223
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
太厉害了
2019-7-2 10:07
0
雪    币: 3
活跃值: (1864)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
前来捧场
2019-7-2 14:26
0
雪    币: 8057
活跃值: (2625)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
15
杨精华就是牛逼
2019-7-2 14:49
1
雪    币: 1166
活跃值: (112)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
作者辛苦了,谢谢分享,文章里有个笔误,
正确的姿势如下实例: 

以下代码对应的缓冲区为 sz_code_buf5  吧
2019-7-3 09:51
1
雪    币: 4811
活跃值: (886)
能力值: ( LV13,RANK:319 )
在线值:
发帖
回帖
粉丝
17
牛逼
2019-7-3 11:45
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
wx_听海看雪 作者辛苦了,谢谢分享,文章里有个笔误, 正确的姿势如下实例: 以下代码对应的缓冲区为 sz_code_buf5 吧
刚看了下  确实是这样  这里写错了 感谢指正
2019-7-3 14:18
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
2019-7-5 14:25
0
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
牛逼 膜拜~
2019-7-5 15:00
0
雪    币: 1129
活跃值: (2761)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
牛逼,值得学习
2019-7-5 15:05
0
雪    币: 2647
活跃值: (5093)
能力值: ( LV9,RANK:225 )
在线值:
发帖
回帖
粉丝
22
刘京华(精华)tql。
狐白tql。
dalao们带带我!
2019-8-19 15:47
0
雪    币: 2989
活跃值: (4911)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
大佬牛啊,膜拜
2020-8-19 17:24
0
游客
登录 | 注册 方可回帖
返回
//