免杀
一、基础
1.1 汇编
1.1.1 汇编指令
push指令(数据的入栈)
作用:
- 将当前的数据存到下一个位置(注意不是当前ESP的位置)
- 将ESP进行压栈(入栈、进栈),也就是
ESP值 - 4
pop指令(数据的出栈)
作用:
- 将当前ESP中的数据取出到指定寄存器
- 将ESP进行出栈,也就是
ESP值 + 4
call指令(按f7可以进入函数内部):
作用:
- 跳转到地址位置,这里是
1F1307
- 将当前位置
1F197A
push到ESP
堆栈区(方便后面ret)
附:call调用的流程分析
lea指令
作用:
- 将[]内的值地址值赋值给edi,不是对应地址上的值。
1.2 内存管理
我们用C语言和C++申请空间用的malloc
和new
,这两个底层调用的都是heapAlloc
这个api,这个api是属于3环的api。还有我们熟知的VirtualAlloc
,也是属于3环的api。
kernel32.dll
和ntdll.dll
使用非常频繁,几乎所有的exe都会去调。
我们会遇到这样一个情况,就是当多个程序同时去访问dll中的某个api时,会产生冲突。windows为了解决这个问题,处理方式是,在每个程序运行时,拷贝一份dll到它的内存空间中。这里的拷贝,就是我们说的程序运行时,程序到内存中的映射。
1.3 windows系统调用
3环进0环就是系统调用。
x86系统下,3环进入0环有3种方式。
- sysenter 快速调用-》KiFastSystemCall
- int2E 中断门-》KiIntSystemCall
最高位0-7就是在3环,8-F就是在0环
0环中的SSDT表,即系统服务描述符表,存储的是真正0环函数的实现地址。
1 | kd> dd KeServiceDescriptorTable //dd看内存,dt看结构 |
硬件断点
asmi绕过
DLL劫持(白加黑)
- 利用dumpbin查看exe需要的dll导出函数
1 | dumpbin import "1.exe" |
- dll导出所需函数
1 | extern "C" __declspec(dllexport) void WTSFreeMemory(){} |
注意:我们用的时候,尽量不要找微软的dll,尽量用厂商自己的dll,这里有一个网站,可以查看公开的厂商的dll,HijackLibs
UAC白名单挖掘
需要满足以下三个条件
1 | 1. 程序的manifest标识的配置属性 autoElevate 为 true |
评论