1使用CreateRemoteThread()API
具体方法是让远程进程(也就是目标进程)运行LoadLibrary()API来加载我们的恶意DLL文件
如何达到这一目标?
有两个关键点,
一是系统核心DLL会被加载到固定位置,也就是说,我们在恶意程序中得到的LoadLibrary()地址,可以在目标程序中直接使用,而不需要在目标程序中得到LoadLibrary地址
二是线程函数原型和LoadLibrary的原型是相似的(都只需要一个参数,都是指针型),这就导致了,LoadLibrary可以作为线程函数,被CreateRemoteThread调用
所以只需要在调用CreateRemoteThread时候,将参数pThreadProc设为LoadLibrary地址把pRemoteBuf设置为要加载DLL地址字符串的地址即可
2使用注册表AppInit_DLLs,Winlogon Notify,SvcHost DLL,都可以是计算机加载我们的而已DLL文件
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows下的AppInit_DLLs和LoadAppInit_DLLs,这样DLL会注入到全部运行程序
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost(建服务组)
HKEY_LOCAL_MACHINE\SYSTEM\Setup\FirstBoot\Services(建服务)
服务方式运行DLL(虽然不是DLL注入,但也列出来)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
挂钩winlogon事件来运行DLL,同样不是DLL注入但也列出来
3使用SetWindowsHookEx()API
方法是在DLL里面写一个键盘勾取函数,然后用SetWIndowsHookEx把这个函数添加到键盘钩链,这样在目标程序发生键盘事件时候,DLL就会被强行注入目标进程.
4windows异步过程调用(APC)
APC可以让线程在它正常执行之前,执行APC队列里面代码,所以可以通过QueueUserAPC()API插入队列参数为loadlibrary来注入dll
恶意代码分析通用规则
1不要陷入细节,应该在进入细节前有个概要性了解
2善用不同工具和方法
3能够快速应对恶意代码分析艺术的新变化
几个记不住的汇编指令
repe cmpsb,比较esi和edi缓冲区是否一致
rep stosb,用al初始化edi
rep movsb,esi复制到edi
repne scasb,在edi缓冲区内搜索al
三种函数调用约定
cdecl,参数从右到左压入栈,调用者清理栈
stdcall,参数压栈顺序一样,被调用者清理栈(windowAPI标准调用规则)
fastcall参数传给寄存器
反调试技术
TLS回调函数会在四种情况下被调用,进程加载和卸载,线程加载和卸载
SEH结构化异常处理也常用来检测调试
有效的反调试技术:
outputdebugstring
时钟检测 rdtsc(返回系统重启以来的时钟数到edx:eax)
GetTickCount(返回系统重启时间与当前时间相差毫秒数)(QueryperformanceCounter)
代码检验CRC和md5
反虚拟机技术
in 参数eax(VMXh) dx端口(VX),ecx操作数(0Ah),返回值ebx(VMware版本)
检查HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses注册表下是否存在vmware相关键
检查进程是否存在vmtool
GetAdaptorsInfo函数得到IP_ADAPTER_INFO结构的链表,确定mac地址是不是虚拟机相对应,比如00:0C:29开头