1、使用反病毒软件确认恶意性
- 启发式,基于行为与模式匹配
- 查毒网站:virustotal
2、使用哈希识别恶意代码
- 恶意代码指纹(md5、sha-1)
- 作为标签使用
3、从文件字符串列表、函数和文件头信息中发掘有用信息
- 通常以ASCII或unicode格式(双子节)存储,以NULL结束符表示字符串完整
4、加壳与混淆恶意代码
- 混淆:隐藏执行过程
- 加壳:被压缩难以分析
处理后得到的可打印字符串很少,但是至少包含LoadLibrary和GetProcAddress函数用来加载其他函数 - 加壳程序运行时先运行脱壳代码来解压缩加壳的文件,解析时解析的是一小段脱壳代码
- 使用PEiD检测加壳(使用UPX加壳工具也可以用其脱壳)
5、PE文件格式
- PE格式:windows可执行文件、对象代码、dll
- PE文件以一个文件头开始,其中包括代码信息、应用程序类型、所需的库函数与空间要求。
6、链接库与函数
- 获取可执行程序导入表(静态链接or动态链接)
- LoadLibrary和GetProcAddress允许一个程序访问系统上任何库的函数
- 使用Dependency walker工具探索动态链接函数
常见dll程序
(1)Kernal32.dll:包含核心系统功能,如访问和操作内存(进程、线程)、文件和硬件等等
(2)Advapi32.dll:提供对核心windows组件的访问,比如服务管理器和注册表(Regedit)
(3)User32.dll:包含了所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的的组件
(4)Gdi32.dll:图形显示和操作
(5)Ntdll.dll:导入该文件意味着作者企图使用那些不是正常提供给windows程序使用的接口
(6)Wsocks32.dll和Ws2_32.dll:联网的dll
(7)Wininet.dll:包含了更高层次的网络函数,实现FTP、HTTP和NTP等协议 - 导入函数:可执行文件使用的特定函数相关信息(Windows API)
- 导出函数:别的程序可以使用的函数(在dll文件中最常见),为了将一个程序以服务方式运行,需定义ServiceMain函数
7、静态分析技术实践
(1)未加壳的键盘记录器:
- 查看导入表:操作进程、操作文件、图形化界面(只显示给特定用户);
- SetWindowsHookEX是间谍常使用的函数,也是键盘记录器用来接收键盘输入最流行的方法
- RegisterHotKey:注册一个热键,用户每次按下会通知应用程序,无论当前哪个应用程序处于活动状态,热键都会将用户带到注册了热键的应用程序
- 发现使用了注册表:查询注册表键值字符串(Software\Microsoft\Windows\CurrentVersion\Run:控制自启动项)
(2)加壳的程序
- 导入函数极少
8、PE文件头与分节
- .text:.text节包含了CPU执行指令,唯一可执行的节
- .rdata:包含导入与导出函数信息,存储程度只读数据
- .data:包含程序的全局数据
- .rsrc:包含由可执行文件所使用的资源,这些内容是不可执行的
- IMAGE_FILE_HEADER中的时间是该可执行程序的编译时间(并不可靠,例如所有的Delphi程序统一为1992年6月19日;可伪造)
- IMAGE_OPTIONAL_HEADER:IMAGE_SUBSYSTEM_WINDOWS_CUI(控制台程序)、IMAGE_SUBSYSTEM_WINDOWS_GUI(GUI图形界面工具)
- IMAGE_SECTION_HEADER:描述PE文件的各个分节,比如预分配空间等,实际于此不符时说明存在问题(Virtual Size和Size of Raw Data应该相等。若虚拟大小【约定分配大小】比原始数据大得多意味着加壳代码的存在)
- PEview中查看头部分节信息
- Resource Hacker工具用来查看资源节(.rsrc)
- PEBrowse Professional:查看每个分节中的字节并显示出解析后的数据
- PE EXplorer:可以浏览PE文件的各个部分,编辑PE文件的特定部分