本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全、逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注。本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段,不可避免参照复现各类书籍内容,如书籍作者认为侵权请告知,笔者将立刻删除。强调本系列所有内容仅作为学习研究使用,作者对此文章中的代码造成的任何后果不负法律责任。
前文链接
[系统安全] PE文件格式详解1
[系统安全] PE文件格式详解2
[系统安全] Windbg Preview调试记录
[系统安全]《黑客免杀攻防》MFC逆向基础实战
[系统安全] windows下C++编写第一个加壳程序
[系统安全] PE文件格式分析实战基础—分析helloworld文件
[系统安全]《黑客免杀攻防》逆向基础之经典脱壳基础
[系统安全] 反病毒与免杀原理概论
本篇文章为《恶意代码分析实战》学习过程中结合网上相关资料查询后的总结笔记,作为个人学习过程中的记录,如果书籍作者认为侵权请告知,立即删除。
恶意代码分析有两类大的方向,一个是静态分析,另一个是动态分析。
基础静态分析包括通过一些工具简单的检查可执行文件的一些特征。静态分析基础技术可以确认一个文件是否是恶意的,提供有关其功能的信息,有时还会获得一些简单的网络特征码。
基础动态分析需要运行恶意代码并观察它在系统上的行为,可以用来验证静态分析的特征码。
高级静态分析主要是对恶意代码进行逆向分析,来检查恶意代码具体做了那些行为。
高级动态分析使用调试器检查恶意代码运行时的内部状态。
基础分析参考恶意代码检测理论(静态与动态分析基础)
virustotal会调用多个反病毒软件的特征库来对文件进行审查,可以从这里获取对恶意代码分析的报告。并且此网站还提供了api接口,可以用python编码来测试恶意代码文件。
脚本链接
https://blog.csdn.net/weixin_42172261/article/details/121754949
strings会找到长度大于等于5的可打印字符串,例如程序中如果使用一些函数或者ip域名等字符串都会被打印出来,通过查看这些字符串可以对分析的文件的功能有一个大致的方向。
有些恶意代码会将自己的主体部分加壳,以此来隐藏掉部分特征来达到免杀的效果。可以通过工具PEiD来检查程序是否加壳,但是要注意,有些PE文件的某些数据会被修改从而逃过PEiD的判断。
找到了加的什么壳就可以找相应的工具进行脱壳处理,然后进行下一步分析。
使用这个工具可以查看可执行文件的导入函数和相应的dll动态库
加壳和混淆代码通常至少会包含LoadLibrary和GetProcAddress函数,它们是用来加载和使用其他函数功能的。
常见dll程序
dll文件名 | 描述 |
---|---|
Kernel32.dll | 包含核心系统功能,如访问和操作内存、文件和硬件 |
Advapi32.dll | 提供了对核心Windows组件的访问,比如服务管理器和注册表 |
User32.dll | 包含了所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的组件 |
Gdi32.dll | 包含了图形显示和操作的函数 |
Ntdll.dll | Windows内核的接口。可执行文件通常不直接导入这个函数,而是由Kernel32.dll间接导入,如果一个可执行文件导入了这个文件,这意味着作者企图使用那些不是正常提供给Windows程序使用的函数。一些如隐藏功能和操作进程等任务会使用这个接口 |
Wsock32.dll和Ws2_32.dll | 联网DLL,访问其中任一个 DLL的程序非常可能连接网络,或是执行网络相关的任务 |
Wininet.dll | 包含了更高层次的网络函数,实现了如FTP、HTTP和 NTP等协议 |
函数命名约定
当微软更新一个函数,而且新函数与原先函数不兼容的时候,微软还会继续支持原先的旧函数。这时新函数会给一个与旧函数相同的名字,并在后面加上Ex后缀。而被显著更新过两次的函数,则会在它们的名字后面有两个Ex后缀。
包含字符串参数的函数有着两个不同的版本:以A结尾的输入参数类型为ASCII字符串,而以w结尾的输入参数为宽字符字符串。
此工具可以分析PE文件的资源信息,一定程度上可以获取到文件隐藏的在资源节的数据。比如下图为查看计算器的资源和检查了一个把可执行文件藏到资源里的文件信息。
此软件根据微软官方定义的PE数据结构来分析PE文件数据,例如可以通过区段头表的内存大小和磁盘所占大小判断是否为加壳,或者查看文件的导入表信息。
分节大小在检测加壳可执行文件时非常有用。例如,若虚拟大小比原始数据大得多,则这个节在内存中占用了比磁盘上存储更多的空间。往往意味着加壳代码的存在,特别是当.text分节在内存中较磁盘上更大一些时。
rundll32.exe程序提供了一个运行dll的平台,命令如下
rundll32.exe dllfilename, export funcname
rundll32.exe dllfilename, #number
可以通过设置过滤选项来捕获相应进程的行为或者捕获特定的进程。
和任务管理器差不多,可以查看进程在磁盘上的镜像路径。还可以查看PE文件在磁盘上的字符串和运行后在内存上的字符串,通过比较判断进程是否在运行时被修改。
使用非常简单,在运行程序前拍一次快照,运行程序一段时间后再拍一次快照,然后比较查看两次注册表快照判断是否被修改。
有些恶意软件会有网络请求,比如一些装有后门或者反弹shell的软件。既然有网络请求就一定会有dns查询,可以用它在本地进行拦截,然后用nc来监听。比如下图就是用ApateDNS拦截dns后,用nc监听80端口,再用浏览器访问www.baidu.com后的截图。
INetSim是linux下的软件,可以在一定程度上模拟很多网络服务。配合上面的ApateDNS,在windows中拦截dns,到linux中。
kali中使用INetSim
kali自带INetSim,修改配置文件/etc/inetsim/inetsim.conf
,把ip改成本机ip
输入命令sudo inetsim
运行,然后去win7下访问www.baidu.com,可以看到被重定向到kali机。
这里只记录前一部分,全部内容参见《恶意代码分析实战》附录A,整理电子版链接
https://download.csdn.net/download/weixin_42172261/74415829
accept
用来监听入站网络连接,这个函数预示着程序会在一个套接字上监听入站网络连接。
AdjustTokenPrivileges
用来启用或禁用特定的访问权限。执行进程注入的恶意代码经常会调用这个函数,来取得额外的权限。
AttachThreadInput
将一个线程处理的输入附加到另一个线程上,使得第二个线程接收到输入事件,如键盘和鼠标事件。
击键记录器和其他间谍软件会使用这个函数。
bind
用来将一个本地地址关联到套接字上,以监听入站网络连接。
BitBlt
用来将图形数据从一个设备复制到另一设备。间谍软件有时会使用这个函数来捕获屏幕。
这个函数也经常被编译器作为共享库代码而添加。
callNextHookEx
在由SetWindowsHookEx函数设置了挂钩事件的代码中使用。
CallNextHookEx函数会调用链上的下一个挂钩函数。
分析调用callNextHookEx的函数可以确定出SetwindowsHookEx设置挂钩的用意。
CertOpenSystemStore
用来访问在本地系统中的证书。
CheckRemoteDebuggerPresent
检查一个特定进程(包括你自己的)是否被调试。这个函数通常在一种反调试技术中被使用。
CoCreateInstance
创建一个COM对象。COM对象提供了非常多样化的功能。类标识(CLSID)会告知你哪个文件包含着实现COM对象的代码。
connect
用来连接一个远程套接字。恶意代码经常使用底层功能函数来连接一个命令控制服务器。