恶意代码分析-第十二章-隐蔽的恶意代码启动

目录

笔记

实验

Lab12-1

Lab12-2

Lab12-3

Lab12-4


笔记

启动器:安装一些东西达到恶意行为对用户隐藏,设置自身或恶意代码启动。例如通过资源段隐藏恶意代码。

相关API函数:FindResource,LoadResource以及SizeofResource。

进程注入:将恶意代码注入到另一个正在运行的进程中,也用于绕过主机的防火墙和那些针对进程的安全机制。

相关API函数:VirtualAllocEx用于在另一个进程中分配内存空间

                        WriteProcessMemory函数用来向分配的地址空间写数据

       DLL注入:编写一个恶意的DLL代码强制注入到一个远程进程中,并将远程进程调用LoadLibrary,强制调用一个DLL程序到它的进程中。

                         1.获取受害进程的句柄

                            CreateToolhelp32Snapshot,Process32First和Process32Next来查找进程列表中的目标进程,发现目标进程后,提取PID调用OpenProcess,获取目标进程的句柄。

                          2. DLL注入

                            利用函数VirtualAllocEx,WriteProcessMemory分配内存空间,并将DLL的名字写入受害进程。利用LoadLibrary加载。

                          3.远程进程中创建并运行线程

                             CreateRemoteThread(受害进程句柄,LoadLibrary地址,恶意dll名)

       直接注入:直接将恶意代码注入到远程进程中

                          两次调用VirtualAllocEx  WriteProcessMemory,第一次分配空间写入远程线程需要的数据,第二次分配空间写入远程线程代码

                          CreateRemoteThread(lpStartAddress->代码位置,lpParameter->数据)

 

进程替换:将执行文件重写到一个运行进程中的内存空间

                  1.解除内存映射

                     ZwUnmapViewOfSection释放由参数指向的所有内存

                   2.为恶意代码分配内存

                    VirtualAllocEx为恶意代码分配新的内存

                   3.替换操作

                     WriteProcessMemory将恶意代码的每个段写入到受害进程的内存空间,一个循环操作

                  4.恢复进程环境

                     通过调用SetThreadContext函数让入口点指向恶意代码,运行。最后调用ResumeThread函数,执行。

钩子注入:拦截发往某个应用程序的消息,利用SetWindowsHookEx挂钩注入。钩子机制允许应用程序截获处理window消息或特定事件

                  使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。

                 1.将HOOK的DLL 加载到本身的进程中,得到DLL的模块句柄

                 2.再使用GetProcAddress()得到DLL中显示导出的函数MyMessageProc()的函数地址,

                 3.最后遍历出待注入进程的线程ID

                 4.SetWindowsHookEx()利用这些参数进行HOOK

                    参数:idHook->>指定要安装的钩子例程的类型 WH_GETMESSAGE,//WH_KEYBOARD,//WH_CALLWNDPROC,

                              lpfn->>钩子例程指针

                              hMod->>钩子DLL的句柄///例程的本地模块句柄

                              dwThreadId-->与钩子例程关联的线程标识(当时击键记录器时是关联所有线程)

                 本地钩子:观察和操纵发往进程内部的消息

                 远程钩子:观察和操纵发往一个远程进程的消息

                                  上层:钩子例程是一个DLL程序的导出函数,挂钩到一个线程中

                                  底层:钩子例程保护在安装钩子的进程中

Detours:一个代码库实现对应用程序修改的简单化,通过对导入表进行修改,挂载DLL到已有的程序文件中,并向运行的进程添加函数钩子。

                添加一个多余的段,构造一个新的恶意导入表,改变PE头部的指向。

APC注入(异步过程调用):可以让一个线程在它正常的执行路径之前执行一些恶意代码。每个线程都有一个附加的APC队列,在线程处于可警告的等待状态时被处理。如一些WaitForSingleObjectEx,WaitForMultipleObjectsEx和SleepEx函数等。这些函数给线程一个处理APC的机会。

       用户模式APC:

                  1.查找合适线程

                     函数:CreateToolhelp32Snapshot,Process32First,Process32Next

                  2.使用QueueUserAPC排入一个让远程线程调用的函数

                     参数:pfnAPC:定义的函数->LoadLibrary

                                hThread:合适线程的句柄->svchost.exe的句柄

                                dwData:参数->恶意的dll文件

       系统模式APC:恶意的驱动创建一个APC(由shellcode组成),分配用户模式进程中的一个线程(svchost.exe)来运行它。

                    函数:KeInitializeApc 初始化一个KAPC结构

                               第6个参数为非0,第7个参数为1 -->正在查找一个用户模式的APC(判断是否使用APC注入)

                               第2个参数-->要注入的线程

                               KeInsertQueueApc 将APC对象放入到目标线程的相应队列中,排队运行。          

实验

Lab12-1

静态分析:

 导入函数分析CeateRemoteThread远程进程中创建一个线程

 程序的开始位置,利用GetCurrentDictionaryA函数和一些字符串组合函数,得到恶意dll的文件位置

这里调用了sub_401000函数,跟进去,发现是对explorer.exe程序的句柄获取。这其实是一个循环查找explorer.exe的过程,找到以后,利用Openprocess函数开启这个进程。 

 VirtualAllocEx用于在explorer.exe开辟一部分内存空间,用来存储数据       

 WriteProcessMemory函数用来向刚刚分配的内存空间写数据,这个数据就是恶意dll的句柄lpBuffer

然后再获取knel32.dll中的LoadLibrary函数地址

CreateRemoteThread(受害进程句柄hProces,LoadLibrary函数地址lpStratAddress,恶意dll名lpParameter

总结:远程进程explorer.exe创建一个线程,线程的功能调用LoadLibrary来加载恶意dll

Lab12-2

静态分析:

 根据导入函数知道,这个程序可能和 进程,资源有关。但是打开资源部分乱码。

 sub_4010EA使用两个参数,一个是svchost.exe的句柄,一个是sub_40132C返回的句柄,先进入sub_40132C看一下。

sub_40132C

调用了一系列关于资源操作的函数,并通过_memcpy进行了内存写的操作。sub_401000猜测是个解密操作,因为我打开资源部分,发现的是乱码

sub_401000

  ebp+arg_8是这个函数的第一个参数41h,所以解密就需要对41再进行异或

利用Winhex打开另存为的资源,修改数据后,可以看到是一个二进制文件。再hui来看sub_4010EA

sub_4010EA

CreateProcess创建一个挂起(push 4)的线程,分配内存空间 

 获取ntdll.dll里面的一个函数地址

 这里代码的功能就是程序的替换,一个个节进行替换。

分析结束,结论:自身资源段解密一个二进制文件,替换掉svchost进程

Lab12-3

静态分析:

SetWindowsHookExA函数创建一个钩子,其中参数idHook是消息事件的类型 ,lpfn是hook的函数地址

0Dh-->WH_KEYBOARD_LL-->监控键盘的消息

fn-->Hook函数的地址,对击键的消息做了手脚

跟入fn

先判断键的类型,再讲虚拟按键码压入到sub_4010C7函数

sub_4010C7

根据函数调用序列可以看出应该是一个键盘记录器 ,并记录在了一个文件中

var_C是这个函数的唯一一个参数,就是一个虚拟按键码。先进去byte_40148D的数组,将索引到的值为cl。 再乘以4,再去索引。最后决定跳转的位置。

分析完毕:安装接收击键事件钩子。疑惑:并不知道为什么要有索引这一步。

Lab12-4

静态分析:

CreateRemoteThread用于远程进程创建一个线程,其他两个与资源段有关

利用PE查看器可以看到资源段中确实藏着一个二进制文件

EnumProcessModules-->得到进程基址

GetModuleBaseName-->返回进程名不包含路径

EnumProcesses-->函数遍历进程

GetModleFileName-->返回进程名包含路径

这是一个循环结构,遍历进程,跟进sub_401000函数

sub_401000

 先调用GetModuleBaseName返回进程名并放入到第三个参数处,LPTSTR lpBaseName, // base name buffer

接下来是一个比较字符串,通过追溯可以看到Str2是winlogo.exe。所以sub_401000函数的功能就是查找winlogo.exe进程

接下来进入sub_401174

sub_401174

开始调用了sub_4010FC函数是一个提权操作,之后获取了sfc_os.dll文件中编号为2的函数地址,功能是禁用Windows系统的文件保护机制。并保存在了lpStartAddress。因为sfc_os.dll系统会载入内存,所以没有用到writefile函数

之后调用了OpenProcess打开winlogo.exe进程,把句柄放在了hProcess中。

然后调用CreateRemoteThread函数为winlogo.exe注入的sfc_os.dll的一个函数。

继续分析

wupdmgr是一个用于系统更新的程序,把它拷贝到临时目录下并改名为winup.exe。然后调用了sub_4011FC

sub_4011FC

获取wupdmgr的句柄,然后是一系列关于资源段的操作,可疑字符串BIN,根据工具可以得到在资源段藏着一个二进制文件。

写入到wupdmgr中,并以不显示窗口的形式(CmdShow为0)运行。

分析结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值