免杀理论基础
本文主要为免杀入门的基础理论笔记,前几年写下的找到正好发出来,因审核需要删除部分内容,有免杀基础和一定实操经验人士可以跳过本文
概念
免杀全称为反杀毒技术Anti Anti- Virus简称“免杀”,是能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
Mimikatz
渗透中抓取明文密码和提权等各种操作,非常好用,之后有对其的免杀学习
免杀用处
远程控制和工具上的免杀
免杀难点
杀软检测
静态免杀:文件下载完成、文件开始运行、开机自检
动态免杀:文件运行时,文件执行操作时
特征检测:是否包含已知恶意代码的特征
行为检测:对文件要执行的操作目的和危险性检测判断
主动防御检测:杀毒软件发现危险后告知用户并选择下一步操作
机器学习检测:识别文件整个执行过程并自行判断危险性
免杀成本
时间,代码量,方法的代价
注:自己研究构建代码框架时间和精力耗费更多,但免杀效果更好,但是被杀软发现后加入特征库,方法也会完全失效这就是代价
【很难有永远有效的免杀方法】都是实现短期或长期的免杀效果
//world宏木马是由VBA语言编写,学会免杀思路和VBA语言后同样可以做到免杀、
小知识:把木马文件名改为 XXX.docx.exe (实际为exe文件)如果目标用户电脑不显示文件后缀则显示为 XXX.docx 就有上钩打开的可能性。
在免杀和病毒分析中,学习掌握汇编语言非常重要
权限维持方法:修改注册表、修改计划任务、劫持正常权限的文件(但直接进行这些方法都容易被监控到)
免杀大致方法
改特征,劫持Windows信任软件执行恶意代码,反射加载,利用语言复杂性绕过
汇编语言
基本算法
加:INC EAX
减:DEC EAX
乘:MUL EAX
除:DIV EAX
进制换算
掌握 二、八、十、十六进制 的换算方式
逻辑运算
与 & :同真为真 1&0=0,0&1=0,1&1=1,0&0=0
或 | :有真为真 1|0=1,0&1=1,1&1=1,0&0=0
非 ! : 真假反转 101011 ! > 010100
亦或 ^ :仅互异为真 10=1,01=1,1^1=0,0&0=0
数字或字符串通过 亦或 和 再亦或 可以看作最简单的加密和解密
二进制解析
注意:二进制算法中1+1=0时要向前一位进位,
同一段二进制表示的数可以有无符号
和有符号
两种读取方式;是由程序中变量定义函数决定的最高位是否标识符号意义。
假如定义变量为:
_int8 var; 则var所对应的二进制的最高位,0标识是正数,1标识为负数。
相应的取值范围为:从-127到127
假如你定义变量为:
unsigned _int8 var;则var所对应的最高位是1或者0,都标识正数。
相应的取值范围为:从0到255
一般如果是有符号数,负数最高位为1,为了方便计算,一般用补码标识,不仅仅把最高位变成1。
无符号数
无符号的二进制数按正常运算,所有数字都纳入正常数值,不计符号位
有符号数
二进制中首位统一为符号位,1为负号,代表负数;0为默认的正号;除首位外数字纳入数值
引入源码、反码、补码概念
例:10110100 //无符号数记为180,在有符号数中记为-52
原码:除负号位外,其余转换为十进制,结果为-52
反码:除负号位外,其余进行非运算(11001011),结果为-75
补码:除负号位外,其余进行非运算(11001011),末位加1(有进位),最终为(11001100),即为-76
二进制数正数变负只需要首位加1(正数在二进制标准格式中首位必为0,0+1=1)
100的二进制表示为01100100
100的二进制首位加一为11100100
作为有符号数读为-100,作为无符号数为228
通用寄存器
概况:用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。
32位cpu通用寄存器共有8个: EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI
•EAX:一般用作累加器
•EBX:一般用作基址寄存器(Base)
•ECX:一般用来计数(Count)
•EDX:一般用来存放数据(Data)
•ESP:一般用作堆栈指针(Stack Pointer)
•EBP:一般用作基址指针(Base Pointer) //不是必须,有的程序手动设置EBP
•ESI:一般用作源变址(Source Index)
•EDI:一般用作目标变址(Destinatin Index)
注:16位cpu通用寄存器也有8个,名称就是上面所有去掉E
赋值和端序
汇编中的赋值语句
MOV语句
mov eax,0x1234
mov byte ptr ds:[0x233],0x12
mov dword ptr ds:[0x233],eax
mov ecx,eax
大端序和小端序:大端序为正序,小端序为逆序
比如
数字 12345678
大端序排列为12 34 56 78,
小端序排列为78 56 34 12,
但数组不受大小端序影响
数字小端序排列
数组不受大小端序影响,按顺序储存 //这里为admin字符串构成的数组
堆栈
堆(heap) 栈(stack)
栈的增长
栈:存储程序临时数据
计算机加载程序的大体结构
•ESP与EBP
程序可以根据EBP和ESP区分
ESP:一般用作 堆栈指针(Stack Pointer)
EBP:一般用作 基址指针(Base Pointer) //不是必须,有的程序手动设置EBP
栈的结构
详细图
栈一般靠EBP和ESP区分,EBP为栈底,ESP为栈顶,这里没标出栈顶的ESP,temp为临时数据
变量数据和地址(图中为a,b,c)的增长由高到低,向上增长
堆栈平衡
通过汇编语言操作压栈(push)和弹栈(pop)使ESP和EBP位置达到平衡
第三课 55min左右
标志寄存器及跳转
汇编当中非常常见,通俗来说就是其他语言if语句中的判断条件,在汇编里为标志寄存器里的标志位作为判断条件
一.影响标志位的指令
比如CMP、TEST、ADD、SUB等
CMP指令
cmp oprd1,oprd2,为第一个操作减去第二个操作数,但不影响两个操作数的值,它影响flag的CF,ZF,OF,AF,PF。若执行指令后,ZF=1 则说明两个数相等,因为zero为1说明结果为0。当无符号时,CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,oprd1<oprd2。
TEST指令
TEST AX,BX 命令将两个操作数的二进制进行逻辑 《与》 运算,并根据运算结果设置相关的标志位。
Test命令的两个操作数不会被改变(TEST AX,BX 与 AND AX,BX 命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中)运算结果在设置过相关标记位后会被丢弃。
ADD指令
格式:ADD OPRD1,OPRD2
功能:两数相加(不带进位)
SUB指令
sub ax,bx
就是用ax的值减去bx。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1) SF=0 减法结果为正数(符号位为0) ZF=1 减法结果为零 ZF=0 减法结果不为零。CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况) CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况) OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同
二、跳转指令
比如:JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP等
这里举例 JE 跳转指令就是根据ZF位是否为1,只有ZF为1才跳转
执行语句后跳转
EIP:指向目前CPU指令的地址,可以通过jump或call(会自动把返回值压到栈里面,在用return语句就会把栈里面的地址弹到EIP里)指令跳转当前地址修改
普通情况
call语句分析
执行call指令后会自动把返回值压进栈里面
如果接着使用return操作,就会把栈里面的内容(刚压进的地址)弹到EIP里面
执行完return指令
举例一:
把EAX和EBX用mov语句赋值为不同值(这里C为12,D为13)并执行
cmp命令这里用作减法比较EAX和EBX,执行后标志位变化如下图
比如ZF标志位判断 两数相等即为1,不等即为0
同理反之
栈里参数的索引调用
栈的结构是从高到低,而且EBP的参数调用是以4为单位,ESP的参数调用是以1为单位
比如这里的参数
PE文件结构
概念:PE文件意为可移植的可执行的文件,全称是Portable Executable,常见的.exe、.dll、OCX、SYS、COM都是PE文件,
PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。
读PE文件头,找到Machine,014C是32位的