目录
笔记
启动器:安装一些东西达到恶意行为对用户隐藏,设置自身或恶意代码启动。例如通过资源段隐藏恶意代码。
相关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)运行。
分析结束