-
-
[原创]分析实战读书笔记8_简单的间谍木马分析
-
发表于: 2021-1-14 18:00 4761
-
此篇文章记录一下分析实战样本11-1的分析笔记, 样本是个简单的间谍木马, 用到的技术已经过时失效, 主要是了解下间谍木马的特征和行为.
查看导入表, 首先可以看到一些对资源节操作的API, 剩下一些常用的kernel32函数, 还包含一写注册表相关API
使用ResHack查看资源数据, 可以发现一段未经加密的PE数据, 后续我们会分析这段PE
查看字符串, 可以发现有关GinaDll的信息, 在本书11章的知识中, 讲解了GinaDll登录验证的操作
有很多Wlx开头的API, 在书中提到了Wlx开头的很多API可能是Ginadll的导出函数
将样本拖入火绒剑运行
可以发现样本在同目录释放了一个dll, 经过对比发现, 释放的dll就是资源中的PE数据, 然后向注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL
写入dll的路径
关于ginadll可以查看本书第11章11.3.1节的详细说明
将样本拖入IDA, 定位至main函数4011D0
观察main函数代码, 可以发现程序首先通过GetModuleFileNameA
获取自身程序的全路径, 在调用401080
后, 然后通过_strrchr
截取\
之前的内容, 与\\msgina32.dll
进行字符串拼接 然后将拼接后的字符串作为参数传入堆栈调用401000
接下来分析401080与401000
进入401080函数, 前面一段代码是典型的取资源节中数据, 然后通过VirtualAlloc
申请一段内存空间用于存放资源中的PE数据
继续向下查看代码
在将资源中的数据取出后, 通过一系列文件操作将PE数据保存到xx\msgina32.dll
文件中, xx的路径就是main函数中通过GetModuleFileNameA
取出的当前程序的运行路径
需要注意一点, 这里有个函数为401299
, 在我们经历过前面几章样本的分析, 多次撞墙后, 我们可以快速判断出这个函数就是类似printf的打印输出函数, 如果未多次撞墙, 这里要一直追下去也追不出来什么, 反而浪费分析的时间. 这里我们将这个函数重命名, 防止后面的分析中再次出现 , 可以节省时间
到这里401080这个函数功能已经确定了, 取资源节数据并写入文件 , 文件名为msgina32.dll
, 路径为程序同路径
在分析前观察函数参数 , 是我们释放出的dll文件全路径
进入401000, 观察代码
可以看到一系列注册表操作, 简单分析API调用, 发现函数功能是将dll全路径写入注册表路径为SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
, 名为GinaDLL
的注册表项.
然后调用401299, 在前面对401299命名后, 这里会正确显示为我们命名的打印函数
整个exe的功能就是为了持久化安装dll文件
到这里, exe的分析就结束了, 根据分析结果 我们发现最重要的功能在dll中, 接下来我们分析dll文件
由于dll存放于exe的资源节中, 并且未进行加密, 因此在对exe进行提串时, 我们已经将dll的字符串同时进行了提取
因此我们可以直接拖入IDA进行分析
将样本拖入IDA, 定位至dllmain函数10001050
dll加载成功后, 首先通过GetSystemDirectoryW
获取系统目录, 与\MSGina
拼接后获取正常的GinaDll , 然后通过LoadLibraryW
加载获取dll句柄, 存入红框中的全局变量hLibModule
, 然后dllmain函数执行结束
根据exe的注册表操作, 可以知道样本在替换正常的GinaDll, 这里的全局变量可能会用于在劫持dll后转发到正常的GinaDll
查看dll的导出函数
可以发现有很多导出函数, 名字与正常的GinaDll相同, 依次查看导出函数代码, 发现绝大多数导出函数都调用了10001000
函数, 这个函数很明显用于导出函数的转发, 这里就不贴上分析步骤了.
在所有的导出函数中, 我们会发现三个与众不同的函数 WlxLoggedOutSAS
,DllRegister
,DllUnregister
DllRegister
与DllUnregister
也是很简单的函数, 对于注册表值的安装/卸载操作, 这里也不贴了
我们需要关注WlxLoggedOutSAS
函数
通过查询百度相关文档信息, 我们知道WlxLoggedOutSAS
是在windows注销时会调用的函数,接下来看看它想在注销时做什么
观察代码, 样本首先调用10001000进行正常功能的转发, 然后调用edi, 通过回溯寄存器, 我们知道了edi是正常的WlxLoggedOutSAS
, 然后样本执行了10001570函数, 观察参数发现一个有趣的字符串UN %s DM %s PW %s OLD %s
, 这种携带占位符的字符串常用于输出, 替换, 拼接等, 接下来我们就需要看看10001570处的函数
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- 利用OLLVM编译windows驱动 30404
- [求助]SetWindowLong、SetWindowLongPtr无效问题 6915
- [求助]大佬们求一份21H2镜像,最好是VM镜像,原版也可以 6970
- [原创]X86内核笔记_6_APC相关 22425
- [原创]X86内核笔记_5_句柄 15487