加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

两种姿势批量解密恶意驱动中的上百条字串

发布时间:2019-04-26 15:09:40 所属栏目:建站 来源:JiaYu
导读:副标题#e# 作者:JiaYu 转自公众号:信口杂谈 1. 概述 在 360Netlab 的旧文 《双枪木马的基础设施更新及相应传播方式的分析》 中,提到了 双枪 木马传播过程中的一个恶意驱动程序 kemon.sys ,其中有经过自定义加密的 Ascii 字符串和 Unicode 字符串 100+
副标题[/!--empirenews.page--]

两种姿势批量解密恶意驱动中的上百条字串

作者:JiaYu 转自公众号:信口杂谈

 1. 概述

在 360Netlab 的旧文 《“双枪”木马的基础设施更新及相应传播方式的分析》 中,提到了 双枪 木马传播过程中的一个恶意驱动程序 kemon.sys ,其中有经过自定义加密的 Ascii 字符串和 Unicode 字符串 100+ 条:

两种姿势批量解密恶意驱动中的上百条字串

这在 双枪 木马的传播链条中只是一个很小的技术点,所以文中也没说具体是什么样的加密算法以及怎样解密,供分析员更方便地做样本分析工作。但这个技术点还算有点意思,尤其是对逆向入门阶段的朋友来说,可以参考一下解法。最近又碰到了这个驱动程序的最新变种,跟团队的老司机讨教了一番,索性写篇短文记录一下。

感谢老司机们解惑。也欢迎各路师傅不吝赐教,提一些更快准狠的解法。

2. 样本概况

MD5: b001c32571dd72dc28fd4dba20027a88

2.1 字符串加密情况

驱动程序中用到的 100+ 条字符串都做了自定义加密处理,在设置完各 IRP 派遣函数和卸载例程之后,第一步操作就是依次解密这些字符串。IDA 中打开样本,部分解密过程如下:

两种姿势批量解密恶意驱动中的上百条字串

整个解密过程的函数是 sub_100038C4 ,里面会多次调用两个具体的解密函数:sub10003871 和 sub_10003898。前者解密 Ascii 字串,后者解密 Unicode 字串,都有两个参数:arg1—>要解密的字符串地址;arg2—>字符串长度。后面会把这两个函数分别命名为 DecryptAsciiStr 和 DecryptUnicodeStr 。这两个函数在 IDA 中看到的 xrefs 状况如下:

两种姿势批量解密恶意驱动中的上百条字串
两种姿势批量解密恶意驱动中的上百条字串

2.2 加密算法

前面说了,算法不复杂。以 DecryptAsciiStr 函数为例:

两种姿势批量解密恶意驱动中的上百条字串

反编译看看:

两种姿势批量解密恶意驱动中的上百条字串

DecryptUnicodeStr 算法其实相同,只是因为字节构成不同,所以是两个解密函数分开写:

两种姿势批量解密恶意驱动中的上百条字串

简单总结起来,这套解密过程其实就是:把当前字节后面特定偏移处的字节与 0xC 异或,然后替换掉当前字节,把解密后的字节写入到当前位置,即完成解密。本人对密码学不熟,不知道这是不是已有名号的加密算法,看起来像是 凯撒密码 的变形加强版?对此有了解的朋友欢迎指教。

3. 解密

了解了上面的情况之后,就该着手解密这百十多条字符串了。既然是用 IDA 来分析这个样本,理想的状况应该是把这些字串批量解出来,直接在 IDA 中呈现,然后就可以进行后续分析了。既然是要自动化批量解密,写 IDAPython 应该算是最便捷的做法了。最终效果如图:

两种姿势批量解密恶意驱动中的上百条字串

3.1 姿势 1——自行实现解密算法

首先想到的思路是:就两个解密算法,而且不复杂,不妨直接写个 IDAPython 脚本,实现这两个解密算法。解密之后把明文字串直接写到 IDB 文件中,在 IDA 中呈现。两个解密算法的 Python 版本分别如下(附带对 IDB 的 Patch 操作):

两种姿势批量解密恶意驱动中的上百条字串
两种姿势批量解密恶意驱动中的上百条字串

这里稍微解释一下 make unicode str 时的操作:

  1. old_type = idc.GetLongPrm(INF_STRTYPE) 
  2. idc.SetLongPrm(idc.INF_STRTYPE, idc.ASCSTR_UNICODE) 
  3. idc.MakeStr(argv[0], argv[0]+(argv[1]*2)) 
  4. idc.SetLongPrm(idc.INF_STRTYPE, old_type) 

在 IDA 的 UI 界面中,可以选择生成的字符串的类型(如下图),快捷键只有一个 A,对应的 idc 函数是 idc.MakeStr(0。然而 ida.MakeStr() 函数默认是生成 Ascii 字串的,要想生成 Unicode 字串,就需要调用 idc.SetLongPrm() 函数设置一下字符串的类型。

两种姿势批量解密恶意驱动中的上百条字串

IDA 中支持的字符串类型如上图,相应地,在 idc 库中的定义如下:

  1. ASCSTR_C       = idaapi.ASCSTR_TERMCHR # C-style ASCII string 
  2. ASCSTR_PASCAL  = idaapi.ASCSTR_PASCAL  # Pascal-style ASCII string (length byte) 
  3. ASCSTR_LEN2    = idaapi.ASCSTR_LEN2    # Pascal-style, length is 2 bytes 
  4. ASCSTR_UNICODE = idaapi.ASCSTR_UNICODE # Unicode string 
  5. ASCSTR_LEN4    = idaapi.ASCSTR_LEN4    # Pascal-style, length is 4 bytes 
  6. ASCSTR_ULEN2   = idaapi.ASCSTR_ULEN2   # Pascal-style Unicode, length is 2 bytes 
  7. ASCSTR_ULEN4   = idaapi.ASCSTR_ULEN4   # Pascal-style Unicode, length is 4 bytes 
  8. ASCSTR_LAST    = idaapi.ASCSTR_LAST    # Last string type 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!