相关文章推荐
痛苦的充电器  ·  [转] C# Winform ...·  1 年前    · 
一身肌肉的包子  ·  android log4j2,java - ...·  1 年前    · 
愉快的眼镜  ·  MediaScannerConnection ...·  1 年前    · 

本篇文章为《恶意代码分析实战》笔记,到此学完前七章,包括基础静态分析、基础动态分析、高级静态分析(高级静态分析主要使用IDA Pro工具)。将课后最后一题进行复现,以此来做个总结。

文章目录

  • ​​函数调用约定​​
  • ​​Windows API匈牙利表示法​​
  • ​​Windows注册表​​
  • ​​组件对象模型COM​​
  • ​​逆向分析小实战—Lab 7-3​​
  • ​​基础静态分析​​
  • ​​基础动态分析​​
  • ​​高级静态分析​​
  • ​​逆向分析总结​​

函数调用约定

调用约定

关键字

参数入栈顺序

堆栈回收

C标准规范

__cdecl

从右到左

调用者负责

快速调用规范

__fastcall

前几个参数寄存器传参,之后从右到左

被调用者负责

标准调用规范

__stdcall

从右到左

被调用者负责

注意函数调用约定是编译器的事情,即在把C源码编译成汇编代码时考虑;而如果只关注源码的话,除了在函数前声明使用哪种约定外,没有任何差别。


Windows API匈牙利表示法

Windows总体上使用匈牙利表达法作为API函数标识符。这个表达式使用一个前缀命名模式来使识别一个变量的类型更为容易。包含一个32位无符号整数的变量,或DWORD,会以dw开头。

常见API前缀

类型和前缀

说明

WORD(w)

16位无符号数值

DWORD(dw)

双字节、32无符号数值

Handles()H

对象引用,例如HModule、HInstance

Long Pointer(L)

指针类型,例如LPCSTR是指向字符串的指针

Callback

回调函数指针


Windows注册表

基本概念前面看过,这里留个链接

https://blog.csdn.net/weixin_42172261/article/details/121140017

同时还可以通过​ ​.reg​ ​文件的注册表脚本来修改。

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全


组件对象模型COM

组件对象模型(Component Object Model,COM) 是基于Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。组件对象不使用方法而用接口来描述自身。接口实质是一组函数指针表,每个指针必须初始化指向某个具体的函数体。
COM对象通过他们的全局唯一标识符(GUID)来进行访问,这个全局唯一标识符分为两类,是类型标识符(CLSID)和接口标识符(IID)。
COM类通过CLSID的GUID来标识,接口通过IID的GUID来标识。
通过这两个标识符来指定使用哪个类的哪个接口来实现功能,在此之前先要用这两个标识符来调用 CoCreateInstance 函数来完成初始化工作。


逆向分析小实战—Lab 7-3

基础静态分析

strings64.exe Lab07-03.exe 查看字符串 ,发现以下内容。

CloseHandle
UnmapViewOfFile
IsBadReadPtr
MapViewOfFile
CreateFileMappingA
CreateFileA
FindClose
FindNextFileA
FindFirstFileA
CopyFileA
KERNEL32.dll
kerne132.dll
kernel32.dll
C:\windows\system32\kerne132.dll
Lab07-03.dll
C:\Windows\System32\Kernel32.dll
WARNING_THIS_WILL_DESTROY_YOUR_MACHINE

根据函数名​ ​FindNextFileA​ ​​、​ ​FindFirstFileA​ ​​可以猜测这个exe文件可能会在一个目录中搜索文件。
​​ ​CopyFileA​ ​​、​ ​CreateFileA​ ​​表示程序可能会拷贝和创建文件。
​​ ​MapViewOfFile​ ​​表示可能会把文件映射到内存中并进行拷贝。
还有两个很类似的dll动态库名,猜测程序的目的可能是用自己伪造的dll来替换windows自带的Kernel32.dll,以此达到隐藏的目的。

depends查看exe文件的导入表 ,并没有发现导入了Lab07-03.dll。

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全_02


对Lab07-03.dll用string查看字符串

exec
sleep
hello
127.26.152.13
CloseHandle
Sleep
CreateProcessA
CreateMutexA
OpenMutexA
KERNEL32.dll
WS2_32.dll
strncmp
free

看到有ip字符串,表示程序可能会联网。同时CreateProcessA表示程序会创建新的进程。OpenMutexA表示程序会用到互斥量,用来控制同一时刻只能有一个恶意程序在运行。

通过IDA发现这个dll并没有什么导出符号,这一点很奇怪。

[系统安全] Windows逆向必备知识、逆向分析小实战_windows_03

基础动态分析

直接双击运行程序后,apateDNS没有发现网络行为,但是Regshot发现了有修改注册表的行为,又好像这些修改跟这个软件没有什么关系,看不太懂。

[系统安全] Windows逆向必备知识、逆向分析小实战_安全_04

高级静态分析

先分析dll文件,导入IDA。

通过图形话窗口看到这个dll里面的东西还是很多的,为了简略查看功能,搜索所有的call字符如下所示。

[系统安全] Windows逆向必备知识、逆向分析小实战_windows_05


大多数函数在上面分析过了,这里先来到connect函数的位置。

[系统安全] Windows逆向必备知识、逆向分析小实战_字符串_06


判断是链接的127.26.152.13的80端口,接着往下看。

[系统安全] Windows逆向必备知识、逆向分析小实战_静态分析_07

在创建一个新进程后,send了一个hello字符串。

根据下面的图示可以看到这个新的进程发送完hello后会收到一些数据。

根据recv收到的数据和一些字符串进行比较,进行下一步操作,是sleep还是exec还是q。

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全_08


可以看到如果是exec,会调用创建进程函数

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全_09


第二个参数lpCommandLine是有关创建进程的一些信息,查看这个变量。

根据负值可以判断是在当前函数的栈上申请的变量,同时距离buf变量5个字节,而buf又是recv来的数据,可以得出结论recv的数据是​ ​exec xxxx​ ​的形式。

[系统安全] Windows逆向必备知识、逆向分析小实战_静态分析_10


到此知道这个DLL实现了后门功能,这允许攻击者通过发送回复给80端口上的一个数据包,来启动一个系统上的可执行文件。但依旧有一个疑问是这个dll没有导出符号。 接下来分析exe文件

mian函数一开始判断了命令格式,必须是两个字符串,并且规定了第二个字符串是什么。这就是为什么刚才双击后没有什么反应。

[系统安全] Windows逆向必备知识、逆向分析小实战_静态分析_11


到此判断出执行程序的命令行为​ ​Lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE​ ​继续往下,看到打开了两个dll,一个是Kernel32.dll,另一个就是刚才分析的dll。

[系统安全] Windows逆向必备知识、逆向分析小实战_静态分析_12


接下来是一些数据的处理,通过F5查看反汇编代码也能看出是对数据的处理。

[系统安全] Windows逆向必备知识、逆向分析小实战_字符串_13


[系统安全] Windows逆向必备知识、逆向分析小实战_静态分析_14


这部分代码调用了sub_401040和sub_401070两个函数,书上说是在计算偏移地址等。最后到了结尾部分,看到CloseHandle等函数,关闭了两个文件后把Lab07-03.dll拷贝到kerne1.dll(注意这里是 1 )。

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全_15


接着又传参调用了sub_4011E0函数,把​ ​C:\\*​ ​作为第一个参数传进去

[系统安全] Windows逆向必备知识、逆向分析小实战_windows_16


导函数里看,刚才第一个字符串参数被标记为lpFileName。

[系统安全] Windows逆向必备知识、逆向分析小实战_系统安全_17


这个函数第一步就开始FindFirstFile,然后是一些不调用任何函数的操作,先不管这些代码。再往后有一个malloc和call sub_4011E0,发现调用自己本身,判断这是一个递归函数。

[系统安全] Windows逆向必备知识、逆向分析小实战_安全_18


后面会和​ ​.exe​ ​​字符串进行比较,如果相等的话会​ ​call sub_4010A0​ ​。

[系统安全] Windows逆向必备知识、逆向分析小实战_字符串_19


然后这个函数内部还有FindNextFile等函数,到这里可以下结论,这个函数会在C盘找exe后缀的文件,如果是exe后缀文件,就调用函数进行一些操作。跟进​ ​sub_4010A0​ ​​函数,看到​ ​CreateFileA​ ​​,​ ​CreateFileMappingA​ ​​,​ ​MapViewOfFile​ ​​,​ ​IsBadReadPtr​ ​等函数,无疑又是对文件进行操作。

这个函数再往后看到stricmp函数和movsd、movsb指令,这是字符串操作函数。仔细分析是把dword_403010字符串传送ebx的位置。

[系统安全] Windows逆向必备知识、逆向分析小实战_安全_20


转到dword_403010字符串,看到如下信息,这是IDA错误的标记,高亮这个变量按a键即可转成字符串。是​ ​kerne132.dll​ ​,注意是 1

[系统安全] Windows逆向必备知识、逆向分析小实战_字符串_21


现在知道这个可执行文件遍历整个文件系统来查找以.exe结尾的文件,在.exe文件中找到字符串kernel32.dll的位置,并使用kerne132.dll替换它。

逆向分析总结

Lab07-03.dll被复制到C:\Windows\System32目录中并被命名为kerne132.dl。可以断定这个恶意代码修改可执行文件让它们访问kerne132.dll,这意味着了kerne132.dll会替代kernel32.dll被修改过的可执行文件所加载。
而上面略过的繁琐的操作部分应该就是把真正的kernel32.dll的的导出表整合到自己的kerne132dll中。这样任何依赖kernel32.dll的程序都会先加载kerne132.dll,然后再通过这个加载的伪冒的dll来加载真正的kernel32.dll导出的函数。
接下来可以通过基础静态分析来查看kerne132.dll的导出表来验证上面的结论。