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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37809075/article/details/82286918

笔记

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

相关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

Lab12-2

Lab12-3

Lab12-4

猜你喜欢

转载自blog.csdn.net/m0_37809075/article/details/82286918