免杀入门(基础理论)

免杀理论基础

本文主要为免杀入门的基础理论笔记,前几年写下的找到正好发出来,因审核需要删除部分内容,有免杀基础和一定实操经验人士可以跳过本文

概念

免杀全称为反杀毒技术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,

但数组不受大小端序影响

数字小端序排列

image-20210722151206416

数组不受大小端序影响,按顺序储存 //这里为admin字符串构成的数组

image-20210722151721319

堆栈

堆(heap) 栈(stack)

栈的增长

栈:存储程序临时数据

计算机加载程序的大体结构

image-20210722211432354

•ESP与EBP

程序可以根据EBP和ESP区分

ESP:一般用作 堆栈指针(Stack Pointer)

EBP:一般用作 基址指针(Base Pointer) //不是必须,有的程序手动设置EBP

栈的结构

image-20210725224214351

详细图

栈一般靠EBP和ESP区分,EBP为栈底,ESP为栈顶,这里没标出栈顶的ESP,temp为临时数据

变量数据和地址(图中为a,b,c)的增长由高到低,向上增长

image-20210725223638650

堆栈平衡

通过汇编语言操作压栈(push)和弹栈(pop)使ESP和EBP位置达到平衡

第三课 55min左右

标志寄存器及跳转

汇编当中非常常见,通俗来说就是其他语言if语句中的判断条件,在汇编里为标志寄存器里的标志位作为判断条件

image-20210726120050813

一.影响标志位的指令

比如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

功能:两数相加(不带进位)

image-20210729165133378

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才跳转

image-20210729173440258

执行语句后跳转

image-20210729173602423

EIP:指向目前CPU指令的地址,可以通过jump或call(会自动把返回值压到栈里面,在用return语句就会把栈里面的地址弹到EIP里)指令跳转当前地址修改

普通情况

image-20210729180715438

call语句分析

image-20210729181606626

执行call指令后会自动把返回值压进栈里面

image-20210729181805392

如果接着使用return操作,就会把栈里面的内容(刚压进的地址)弹到EIP里面

image-20210730222332742

执行完return指令

image-20210730222405028

举例一:

把EAX和EBX用mov语句赋值为不同值(这里C为12,D为13)并执行

image-20210729160240265

image-20210729160601837

cmp命令这里用作减法比较EAX和EBX,执行后标志位变化如下图

比如ZF标志位判断 两数相等即为1,不等即为0

image-20210729160620058

同理反之

image-20210729160914285

栈里参数的索引调用

栈的结构是从高到低,而且EBP的参数调用是以4为单位,ESP的参数调用是以1为单位

比如这里的参数

image-20210730223039243

image-20210730223518637

PE文件结构

概念:PE文件意为可移植的可执行的文件,全称是Portable Executable,常见的.exe、.dll、OCX、SYS、COM都是PE文件,

​ PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。

读PE文件头,找到Machine,014C是32位的

猜你喜欢

转载自blog.csdn.net/NZXHJ/article/details/126860855