selph
selph
发布于 2021-11-09 / 738 阅读
0
0

恶意代码分析实战Lab12-隐蔽的恶意代码启动

笔记

启动器 Launcher

用来加载恶意代码使用,通常在资源中包含一个exe或dll,在运行的时候,把PE文件从资源中取出来,然后执行,常见API:FindResource、LoadResource、SizeOfResource等

恶意代码启动器通常需要管理员权限运行,或提权来得到权限,恶意代码启动器可能会包含一些提权代码

进程注入 Process Injector

把恶意代码注入到别的进程中去执行,常用API:VirtualAllocEx,WriteProcessMemory函数等

  • DLL注入:写一个DLL加载到目标进程中会自动执行dllmain函数

  • 代码注入:注入shellcode

进程替换 Puppet process

创建一个合法进程,然后在其内存空间写入恶意程序,最后通过SetThreadContext函数来让入口点指向恶意代码进行执行,也叫傀儡进程

Hook注入 Hook Injector

使用SetWindowsHookEx来设置消息Hook

APC注入 APC Injector

每个线程都有一个附加的APC队列,在线程处于可警告状态的时候被处理,在这个状态的时候会一次调用APC队列中的所有函数,可通过编写代码用APC抢占可警告状态的线程

用户模式的APC使用API:QueueUserAPC,一般会注入目标进程的所有线程,以确保APC很快会被执行

内核模式的APC使用API:KeInitializeAPC,KeInsertQueueApc,一般来注入用户层shellcode到用户空间去执行

作业

Lab 12-1

分析目标:Lab12-01.exe,Lab12-01.dll

查看程序:无壳,导入表导入了CreateRemoteThread函数,有点可疑的字符串:

image-20211022165320118

这里看到了导入表没有的LoadLibraryA函数,这里大概率是个DLL注入

  1. 在你运行恶意代码时,发生了什么?

    无限弹窗:一关掉就弹出来,无穷无尽

    image-20211023154332075

  2. 哪个进程会被注入?

    explorer.exe进程会被注入:

    image-20211023161705616

    静态分析:exe程序首先动态获取几个函数地址:

    image-20211023161749171

    然后进入for循环进行遍历获取到的进程句柄:

    image-20211023161818028

    这里对每个进程句柄都调用了一下sub_401000函数:这个函数的功能是打开进程遍历模块看有没有名字是explorer.exe的模块在,如果有就返回1,然后主程序就会打开进程,跳出循环进入下一步:

    image-20211023161951601

    经典的DLL注入流程

  3. 你如何能够让恶意代码停止弹出窗口?

    重启该进程即可,重启电脑也行。

  4. 这个恶意代码样本时如何工作的?

    dllmain函数里直接创建了线程:

    image-20211023162527429

    线程里是个死循环:不断执行弹窗函数

    image-20211023162540021

Lab 12-2

分析目标:Lab12-02.exe

  1. 这个程序的目的是什么?

    这个程序的目的是键盘记录器,会把在某个窗口下按键的内容记录在exe目录下的:practicalmalwareanalysis.log里:

    image-20211024131232957

  2. 启动器恶意代码是如何隐蔽执行的?

    程序exe是个启动器,负责启动svchost.exe,然后修改其内存为资源文件的内容,创建傀儡进程来隐蔽执行,资源中的PE文件才是真正功能模块,提取内存中解密后的资源文件拖入IDA,分析:

    主函数首先获取两样东西:svchost.exe的绝对路径,资源头里解密后的PE文件,然后就进去函数创建傀儡进程了

    image-20211024132802392

    函数sub_4010EA:先判断缓冲区是不是PE文件,是的话,就创建进程svchost,启动标识为启动后挂起

    image-20211024133007506

    接下来的操作就是加载PE文件到内存展开,然后设置线程上下文到PE入口点,然后恢复线程开始执行,具体操作就不细看了

  3. 恶意代码负载存储在哪里?

    加密存储在资源里:

    image-20211024133407646

  4. 恶意负载是如何被保护的?

    通过加密存储来进行保护,解密程序:

    image-20211024133519287

  5. 字符串列表是如何被保护的?

    通过异或进行保护,代码同题4

Lab 12-3

分析目标:Lab12-03.exe(Lab12-02.exe中抽取出来的资源PE文件)

  1. 这个恶意负载的目的是什么?

    按键记录器:设置键盘钩子,监听键盘输入事件

    image-20211024133755788

    hook函数:向指定文件写入内容,然后继续传递消息

    image-20211024134032511

  2. 恶意负载是如何注入自身的?

    通过SetWindowsHookEx函数设置全局消息钩子来注入自身

  3. 程序还创建了哪些其他文件?

    键盘记录器把在某个窗口下按键的内容记录在当前目录下的:practicalmalwareanalysis.log里了

Lab 12-4

分析目标:Lab12-04.exe

主函数:首先动态获取几个函数

image-20211026225829904

接下来进入for循环遍历进程:找到winlogon.exe进程,具体sub_401000函数分析见题1,后面的分析写题里了就

image-20211026225908990

  1. 位置0x401000代码完成了什么功能?

    这里代码的功能是找到winlogon.exe模块,分析:首先填充两个字符串

    image-20211026225201934

    接下来通过3个call来获取第一个模块的名称,然后通过字符串对比函数进行判断,对比成功则返回1:

    image-20211026225332934

  2. 代码注入了哪个进程?

    根据题1的分析,注入winlogon.exe进程

  3. 使用LoadLibraryA加载了哪个DLL?

    加载了:sfc_os.dll

    紧接着循环遍历进程之后,立马调用了sub_401174函数:找到sfc.os.dll的2号函数,然后远程线程到目标进程中执行

    2号函数是SfcTerminateWacherThread,在下次启动之前禁用windows文件保护机制

    image-20211026230113218

  4. 传入给CreateRemoteThread调用的第四个参数是什么?

    如题3:是从dll中找到的函数地址

  5. 二进制主程序释放出了哪个恶意代码?

    这里先把原本的wupdmgr.exe给移动到临时目录下了,然后调用函数sub_4011FC进行资源释放,释放假的wupdmgr.exe到原位置

    image-20211026231030917

  6. 释放出恶意代码的目的是什么?

    找到存起来的资源文件进行分析:执行真正的wupdmgr.exe程序,然后下载更新exe程序并执行,用来特洛伊木马化wupdmgr.exe文件,并通过下载更新文件来更新恶意代码

    image-20211026231655734


评论