首页 > 系统相关 >恶意代码分析实战 隐蔽的恶意代码启动 lab12-1 12-2 12-3 各种进程注入的姿势都在这里了 procmon监控os api调用不行 数据分析还是要sysmon

恶意代码分析实战 隐蔽的恶意代码启动 lab12-1 12-2 12-3 各种进程注入的姿势都在这里了 procmon监控os api调用不行 数据分析还是要sysmon

时间:2022-10-05 19:56:05浏览次数:90  
标签:12 HANDLE 恶意代码 dll api 线程 进程 DWORD exe

一、常用的隐藏技术

  1. 启动器
  2. 进程注入
  3. 进程替换
  4. Hook注入
  5. Detours
  6. APC注入

二、Lab12-1

1.行为分析

执行之后的效果是每隔一段时间会弹窗。
在这里插入图片描述
查看process momitor。可以发现psapi.dll被createFileMapping进内存,可能是修改了CreateFileMapping.
在这里插入图片描述

我++,没有监控到createremotethread!procmon只能监控到dll加载。如下图:

只是到线程创建和退出、dll加载!但是是不是用该dll创建远程线程,它提供的信息就不充分了!

 

在process explorer里也可以看到类似的:

 

 

 

 

 

2.Lab12-1.exe

反汇编看下:

 

可以看到是在做进程注入!都是典型的os api!

注入到explorer.exe里是

 

 

 

 其他都是边角细节了,如下:

 

主要流程分析
1.初始化:通过LoadLibrary和GetProcAddress来获得EnumProcessModules、GetModuleBaseNameA、EnumProcesses函数地址。并拼接得到Lab12-01.dll的绝对地址
2.通过上面EnumProcesses、EnumProcessModules和GetModuleBaseName寻找explorer.exe的pid
3.通过openProcess、VirtualAllocEx和WriteProcessMemory向explorer,exe写入Lab12-01.dll的地址
4.CreateRemoteThread指定explorer.exe调用LoadLibrary,参数为吸入的Lab12-01.dll地址
在这里插入图片描述
在这里插入图片描述

3.Lab12-01.dll

字符串里面找到前面弹窗里面的字符串"Press OK to reboot"和“Practical Malware Analysis %d”
在这里插入图片描述

DLLMain
通过CreateThread调用sub_10001030函数
在这里插入图片描述
sub_10001030函数每60秒调用一次StartAddress
在这里插入图片描述
StartAddress函数创建一个弹窗
在这里插入图片描述

反编译看起来更快:

 

 

 

 

 

4.用到的数据结构和函数

获得PID数组
使用方法
https://docs.microsoft.com/en-us/windows/win32/psapi/enumerating-all-processes
BOOL EnumProcesses(
  DWORD   *lpidProcess,//指向保存pid的数组
  DWORD   cb,//数组大小
  LPDWORD lpcbNeeded//指向返回pid的数量
);
获得现有PID的句柄
HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);
枚举进程模块信息
BOOL EnumProcessModules(
  HANDLE  hProcess,
  HMODULE *lphModule,
  DWORD   cb,
  LPDWORD lpcbNeeded
);
获得模块的名字
DWORD GetModuleBaseNameA(
  HANDLE  hProcess,
  HMODULE hModule,
  LPSTR   lpBaseName,
  DWORD   nSize
);
为某个进程申请空间(flAllocationType都有什么用呢)
LPVOID VirtualAllocEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);
向某个进程的某个地址写入内容
BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);
在另一个进程启动一个线程
HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,//线程地址
  LPVOID                 lpParameter,//参数
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);
创建一个线程执行虚拟地址的函数
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);
 

5. 远程线程注入流程

1.EnumProcesses得到所有进程PID。遍历PID,EnumProcessModules和GetModuleBaseName得到进程文件名
2.OpenProcess打开目标进程
3.VirtualAllocEx在目标进程开辟一块空间用于写入hack.dll
4.WriteProcessMemory向目标进程写入hack.dll的绝对路径
5.CreateRemoteThread指定线程地址为LoadLibraryA,参数为前面开辟的地址

三、Lab12-2、Lab12-3

1.行为分析

没有对注册表进行修改
先关注进程线程操作,发现程序还启动了一个svchost.exe进程
在这里插入图片描述
接下来关注一下文件操作,有没有对svchost.exe进行修改或者注入。确实有一些操作但是不能确定
在这里插入图片描述
当前目录生成了practicalmalwareanalysis.log,保存了击键信息。猜测是击键记录器。
在这里插入图片描述

2.Lab12-02.exe

1.拼接字符串得到svchost.exe的系统目录
2.获取资源并解密
在这里插入图片描述
资源类型为UNICODE,名字为LOCALIZATION。大量的0x41,猜测是与0x41异或的。动态调试下断点保存资源。
在这里插入图片描述
在这里插入图片描述
3.比较加载内存中的文件标志‘MZ’和‘PE’是否正确
4.以挂起的方式(CREATE_SUSPENDED)创建c:\WINDOWS\system32\svchost.exe。接下来应该要进程替换了。
5.新创建被挂起的进程EBX寄存器总是包含一个指向进程环境块(PEB)的数据结构,+8表示StackLimit
在这里插入图片描述
6.NtUnmapViewOfSection卸载原本进程的stack
在这里插入图片描述
7.循环将所有的节拷贝到目标进程中
8.设置CONTEXT->eax=addressOfEntryPoint
9.ResumeThread恢复进程运行,此时运行的svchost.exe实际为资源文件的PE
在这里插入图片描述

3.资源文件分析

字符串有一个文件名,还有一些键盘操作
在这里插入图片描述
设置挂钩0x0d为WH_KEYBOARD_LL
在这里插入图片描述
fn函数为保存击键信息并将消息传递
在这里插入图片描述

4.用到的一些函数和结构体

返回指向资源信息的块
HRSRC FindResourceA(
  HMODULE hModule,
  LPCSTR  lpName,//资源名字
  LPCSTR  lpType//资源类型
);
得到和资源联系的句柄
HGLOBAL LoadResource(
  HMODULE hModule,
  HRSRC   hResInfo
);
返回资源的第一个字节地址
LPVOID LockResource(
  HGLOBAL hResData
);
创建进程
BOOL CreateProcessA(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);
创建进程的信息结构体
typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;//进程句柄
  HANDLE hThread;//线程句柄
  DWORD  dwProcessId;//PID
  DWORD  dwThreadId;//TID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
获得线程信息
BOOL GetThreadContext(
  HANDLE    hThread,
  LPCONTEXT lpContext//比较复杂的结构体包含当前线程的所有寄存器信息
);
读取进程数据
BOOL ReadProcessMemory(
  HANDLE  hProcess,//进程句柄
  LPCVOID lpBaseAddress,//要读的地址
  LPVOID  lpBuffer,//保存内容地址
  SIZE_T  nSize,//大小
  SIZE_T  *lpNumberOfBytesRead
);
写进程数据
BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);
unmaps进程一块内存
NTSYSAPI NTSTATUS ZwUnmapViewOfSection(
  HANDLE ProcessHandle,
  PVOID  BaseAddress
);
找到ClassName的窗体
HWND FindWindowA(
  LPCSTR lpClassName,
  LPCSTR lpWindowName//如果为0,表示搜索所有
);
HHOOK SetWindowsHookExA(
  int       idHook,
  HOOKPROC  lpfn,
  HINSTANCE hmod,
  DWORD     dwThreadId
);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

5.进程替换流程

1.用挂起的方式执行进程
2.ZwUnmapViewOfSection释放指向的内存,解除内存映射
3.VirtualAlloc为恶意代码分配新的内存
4.循环将恶意代码的每个段写入受害者进程的内存空间
5.恢复受害者进程的环境,SetThreadContext函数
6.ResumeThread函数恢复执行。

Lab12-4

1.行为分析

开启了新进程
在这里插入图片描述

2.Lab12-04.exe

1.找到winlogon.exe的PID
在这里插入图片描述
2.提升进程权限
在这里插入图片描述
3.创建远程线程执行,sfc_os.dll的2号导出函数(负责Windows文件保护机制,2号为SfcTerminateWatcherThread函数禁用文件保护机制)
在这里插入图片描述
4.将wupdmgr.exe移动到%Temp%目录
在这里插入图片描述
5.释放资源到wupdmgr.exe
在这里插入图片描述
6.最后运行wupdmgr.exe
在这里插入图片描述
在这里插入图片描述

3.BIN101.bin

1.运行原版wupdmgrd.exe
2.下载http://www.practicalmalwareanalysis.com/updater.exe
3.运行updater.exe
在这里插入图片描述

总结

最近也分析了一个实际的病毒样本imnet蠕虫病毒。虽然是8年前的病毒了,但是也用到了很多病毒技术,而且加壳之后分析起来也挺麻烦的。

 

标签:12,HANDLE,恶意代码,dll,api,线程,进程,DWORD,exe
From: https://www.cnblogs.com/bonelee/p/16756222.html

相关文章

  • 高级vue 组合api setup watch监听用法
    <script>import{computed,watch}from'vue';import{ref,reactive,toRefs}from'vue'exportdefault{  setup(){   letdata=reactive({   ......
  • 12_采样格式&音频重采样
    采样格式通过前面学习我们知道FFmpeg和SDL都有自己的采样格式的表达式,那么他们都表示什么意思呢?FFmpeg的采样格式的表达式:enumAVCodecID{......AV_CODEC_ID......
  • 高级vue 组合api setup computed 用法
    <script>import{computed}from'@vue/reactivity';import{ref,reactive,toRefs}from'vue'exportdefault{  setup(){   letdata=reactive({  ......
  • 高级vue 组合api setup toRefs 用法
    <script>import{ref,reactive,toRefs}from'vue'exportdefault{  setup(){   letdata=reactive({    mes:0,    userObj:{   ......
  • luogu P3644 [APIO2015] 八邻旁之桥
    Link题解首先忽略掉同侧的询问。对于\(K=1\),它其实就是问一个点到其它点的距离之和最小值,直接找到中位数然后计算即可。对于一条路线,我们可以发现,如果建的桥里这两个......
  • 高级vue 组合api setup reactive用法
    <script>import{reactive}from'vue'exportdefault{  setup(){   letdata=reactive({    mes:0   });   constadd=()=>{ ......
  • LeetCode 12 - 贪心
    455.分发饼干对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j] 。如果s[j] >=g[i],我们可以将这个饼干j......
  • vue3组合式API
     选项API生命周期选项和组合式API之间的映射beforeCreate ->use setup()created ->use setup()beforeMount -> onBeforeMountmounted -> onMo......
  • Vue3.x 组合式api的生命周期钩子
    Vue3组合式api的生命周期beforeCreatecreated,setup语法糖模式(组合式api)是没有这两个生命周期的,用setup去代替onBeforeMount获取不到DOM,onMounted可以获取DOMon......
  • 【LGR-122】T1 & T2 题解
    T1下面所说的做法来自于dty(%%%%%%%%%)注意到每一个数的绝对值是大于等于\(2\)的,那么就可以发现一个性质:当一个区间长度为\(len\)时,如果\(len\ge62\),那么这个区间的......