当前位置:文档之家› 免杀入门

免杀入门

(A).简介

本电子书收集了一些经典的免杀文章以及个人心得...
新手朋友们可以根据本电子书快速入门学免杀技术了...
以后还可能会出适合已经入门朋友们的高级篇免杀电子书.包括行为,专杀,高级启发的免杀


(B).关于免杀的来源

为了让我们的木马在各种杀毒软件的威胁下活的更久.

什么叫免杀和查杀

可分为四类:
1.文件免杀和查杀:不运行程序用杀毒软件进行对该程序的扫描,所得结果。
2.内存的免杀和查杀:判断的方法1>运行后,用杀毒软件的内存查杀功能.
2>用OD载入,用杀毒软件的内存查杀功能.
3.专杀.以病毒某一处特征做出判断,往往只要改一处就可以躲过
4.行为杀毒软件, 代表作,绿鹰PC精灵... 可以预知未知病毒,误报率高

什么叫特征码

1.含意:能识别一个程序是一个病毒的一段不大于64字节的特征串.
2.为了减少误报率,一般杀毒软件会提取多段特征串,这时,我们往往改一处就可达到
免杀效果,当然有些杀毒软件要同时改几处才能免杀.

特征码的定位与原理

1.特征码的查找方法:文件中的特征码被我们填入的数据(比如0)替换了,那杀毒软
件就不会报警,以此确定特征码的位置

2.特征码定位器的工作原理:原文件中部分字节替换为0,然后生成新文件,再根据杀
毒软件来检测这些文件的结果判断特征码的位置

认识特征码定位与修改的工具

1.myccl(特征码定位器)
2.ollydbg (特征码的修改)
3.OC(用于计算从文件地址到内存地址的小工具)
4.c32asm(十六进制编辑器,用于特征码的手工准确定位或修改)

很多时候大家已经用各类安全软件、杀毒软件查出了自己的机子中了例如Backdoor.RmtBomb.12 、Trojan.Win32.SendIP.15 等等这些一串英文还带数字的病毒名,这时有些人就蒙了,那么长一串的名字,我怎么知道是什么病毒啊?

其实只要我们掌握一些病毒的命名规则,我们就能通过杀毒软件的报告中出现的病毒名来判断该病毒的一些共有的特性了:

一般格式为:<病毒前缀>.<病毒名>.<病毒后缀>

病毒前缀是指一个病毒的种类,他是用来区别病毒的种族分类...

(C).汇编基础

1.0 关于汇编语言
汇编语言是创造出来代替原始的只能由处理器理解的二进制代码的,也就是在OD中常见的机器码!用机器码来写程序,可以想象其难度吧,所以汇编语言就出现了,汇编代码是直接描述处理器可以执行的代码,也就是在OD中最常见的反汇编代码了!(当然,有点不一样),而汇编语言是和cpu相关的,和机器语言是一一对应的!

2.0 关于cpu
CPU的任务就是执行存放在存储器里的指令序列。为此,除要完成算术逻辑操作外,还需要担负

CPU和存储器以及I/O之间的数据传送任务。早期的CPU芯片只包括运算器和控制器两大部分。到了近几年,为了使存储器速度能更好地与运算器的速度相匹配,又在芯片中引入了高速缓冲存储器(知道为什么P4比P4赛扬贵那么多了吧?)。
看主要的部件:
1.算术逻辑部件ALU(arithmetic logic unit)用来进行算术和逻辑运算。这部分与我们的关系不太大,我们没必要管它。
2.控制逻辑。同样与我们的关系不大。
3.工作寄存器。意识了吧,寄存器呀!喂,,寄存器呀!~

3.0 寄存器
所要了解的是8个32位的寄存器,分别是eax,ebx,ecx,edx,esp,ebp,edi,esi
eax-edx这四个是通用寄存器,虽然各个都有各自的用途,不过你可以用它们来做任何事!是32位的,自然有低位和高位,我们又可以通过ax,bx,cx,dx来访问其低十六位,但高十六位是无法访问的!比如eax=12345678h,那么低十六位ax=5678h!而十六位的自然也有低位和高位,不过高八位是可以访问的,如ax可以分为ah和al,看字面就知道,ah(high)高八位,al就为低八位了!前面的例子,ax=5678h,那么ah=56h,al=78h!这四个寄存器主要是用来暂放计算结果或什么什么的!
esp-esi这四个主要是寻址时用来存放偏移或指针,所以,也就称为指针寄存器或变址寄存器了~如在OD中看到的[eax],其实eax中存放的是一个内存地址,而实际要访问的是那个内存地址里的内容!
esp(堆栈指针寄存器):
很重要的一个概论,堆栈有着先进后出的特点,就好像有一个圆柱形的筒子,该直径刚好是一个乒乓球的直径,所以最先放进去的球当然会最后出来.而esp呢,永远是指着最顶的那个球的,也就是永远都指向栈顶!在od中也很常见了,比如push和pop就是对栈的操作,push把一个数据压入栈中,也就是把一个球放进去,再去调用push时就再放进一个,而esp则指向第二个放进去的那个球了!使用pop呢就从栈中弹出一个数据,前面说了,堆栈有着先进后出的特点,所以用pop呢就从最后放进去的那个球先出了(除非你破坏筒子(破坏堆栈?那是不可能的,程序马上死给你看))!而esp还是指向栈顶!
取个代码例子:
(1) mov ecx, 100<---------100传入ecx
(2) mov eax, 200<---------200传入eax
(3) push eax <------------ecx先进了
(4) push ecx<-------------再来是eax
(5) pop ebx<--------------从栈顶取出一个,也是最后进去的那一个,结果存到ebx
(6) pop ecx<--------------从栈顶取出一个,也就是刚刚先进去的那个了,结果存到ecx
最后ebx=200,ecx=100
到了win32的平台下,api大家都知道了吧!api的参数都是靠堆栈来传递的,比如说一个FindWindow,在C里我这样调用
->::FindWindow(NULL,"a")->而反汇编之后在系统底层反汇编代码就象这个样子:
push xxxxxxxx->xxxxxxxx为"a"的内存地址
push yy

yyyyyy->yyyyyyyy为空中止字符串的指针
call zzzzzzzz->调用FindWindow
而在call里面先使用pop弹出先前压入栈的参数再使用

ebp(基址指针寄存器):
它称为基址指针寄存器,它们都可以与堆栈段寄存器SS(堆栈段)联用来确定堆栈中的某一存储单元的地址,ESP用来指示段顶的偏移地址,而EBP可作为堆栈区中的一个基地址以便访问堆栈中的信息。

ESI(源变址寄存器)和EDI(目的变址寄存器)一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能,可以很方便地用于变址。

还有两个专用寄存器,分别是eip和flags
flags:
这个是标志寄存器了,存放条件标志码、控制标志和系统标志的寄存器!在od中也见很多了,比如zf(零标志),用cmp比较时,把两个操作数相减,为0就置zf为1,否则zf为0。而jnz就是看zf是否为0,为0就跳!这样说起来似乎更乱了,建议大家去记那些大于就跳,小于就跳的,比较简单(jnz就是不相等就跳)``哦呵呵!!至于其它标志,这里不再阐述了,可以去参看汇编速查!
cmp eax,ebx<-比较eax和ebx,两个相减,为0的话zf就为一,否则zf为0
jnz xxxxxxx<-判断zf是否为0,为0就跳到xxxxxxx处,也就是所谓的不相等就跳

eip(指令指针寄存器):
这个很好理解,根据od来说,载入一个程序后,比如代码像这样:
0043C412 >/$ 55 push ebp <-载入后停在这,看寄存器窗口eip这时为43c412
0043C413 |. 8BEC mov ebp, esp <-f8运行一步之后,eip为43c413
0043C415 |. 6A FF push -1 <-eip为43c415
0043C417 |. 68 C8B64800 push 0048B6C8 <-eip为43c417
有人会说"原来eip是指示当前执行到代码处的地址的!" ,这不对!!因为f8运行还没通过那条代码,所以还不算已经执行了,没错,eip指向的就是下一条将要执行的指令的指针!

段寄存器:
cs代码段,ds数据段,ss堆栈段,es附加段
在Win32编程中段的概念已经不重要了!而在Crack时你总不会是在调是dos时代的程序吧!-!

4.0 常用汇编指令
mov ax,cx <-很常用了,把cx的值送入ax中,cx值保持不变
cmp eax,ecx<-很常见了吧,比较eax和ecx,置标志位!方法前面说过了
xor eax,eax<-看这个,eax与自己异或,是清零的操作!
lea eax,str<-并不传送数据,只传送该数据的地址,将str字符串的地址传到eax
push eax <-进栈操作,前面说过了,eax进栈
pop ebx <-出栈操作,前面也说了,弹出位于栈顶的数据存入ebx
ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<-(SRC)+(DST)
SUB 减法指令 格式:SUB DST,SRC 执行的操作:(DST)<-(DST)-(SRC)
MUL 无符号乘法指令 格式: MUL SRC 执行的操作:字节操

作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC);双字操作:(EDX,EAX)<- (EAX)*(SRC)
DIV 无符号除法指令 格式IV SRC 执行的操作:字节操作:16们被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中 。表示为:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。字操作:32位被除数在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16 位商 在AX中,16位余数在DX中。表示为:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余数。
nop <- 无操作,去掉指令用的吧!去掉一个跳转,让程序直接往下走,就到注册成功处啦(扯远了````)
call <- 调用子程序或函数用的

关于跳转指令,可以查看汇编速查手册,别强迫自己把所有的都一下记住,浪费精力,不懂时再查一下,久了就记住了!

5.0 高级语言程序的汇编浅解析
汇编语言要和硬件直接打交道,写病毒是方便点啦!!而在高级语言中,如C中我们要面向的是问题的解决,对于硬件资源操作,编译器搞定了!在这里稍微讲一下高级语言中与反汇编代码相应的一些地方:
1、定义变量
int a;
一个变量其实是存放在一个内存地址里,如果对a进行赋值"a=10",在反汇编中就有可能表现为:
mov word ptr[007e58c2],A
像这个样子,而a所对应的内存地址就是0x007e58c2了,当然是乱写的一个地址而已,系统怎样分配?(天知道...)

2、比如一个数组
char str[]="hello";
占用了6个字节,最后一个是以0结尾的空字节,数组名可以当做数组的指针!str[0]='h',str[0]相应一个变量地址,比如为[0040e123],那么[0040e124]就为'e',[0040e125]就为'l'....了`

3、指针
char *p;
指针也是一个变量,所以它也对应一个内存地址!但访问时应该是访问其指向的内存地址的内容,而不是这个指针变量的内容,其内容只是一个地址而已!假如该指针变量地址为007e1000,那么语句p=a,这句在高级语言里是让指针p指向a这个内存单元!p里的内容是a的地址,*p实际上是a的内容了!而反汇编有可能表现成这样:
mov [007e1000],007e2000<-假如007e2000为变量a的地址,那么就是把a的地址传到007e1000这个内容里了!

4、函数调用
sub(a,b);
假如sub是自定义的一个减法函数,作用为参数一减去参数二,上面语句为在C中调中时传递参数!前面有说过了,Win32平台下函数调用的参数是通过堆栈来传递的,那么反汇编就是:
(假如a=2,b=1)
mov eax,2
mov ebx,1
push eax
push ebx
call 取地址(sub)
.......

(D).8088汇编手册

一、数据传输指令
───────────────────────────────────────
它们在存贮器和寄存器、寄存器和输入输出端口之间传

送数据.
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.

二、算术运算指令
───────────────────────────────────────
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,

结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令
───────────────────────────────────────
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL

四、串指令
───────────────────────────────────────
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX<>0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC 当CF=1且CX/ECX<>0时重复.
REPNC 当CF=0且CX/ECX<>0时重复.

五、程序转移指令
───────────────────────────────────────
1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回

.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT 中断指令
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允

(E).花指令编写速成

一.花指令概念:

花指令是一堆汇编指令组成,对于程序来说,是一堆废话,加不加花指令都

不影响程序的正常运行.编写的花指令要终始保持堆栈的平衡.

二.写花指令的原则:

写花指令的基本原则就是要保持堆栈的平衡. 组合以下就可以完成编写了,简单吧

写花指令细细品味下面一段比喻:

我们把一段花指令比喻成一道数学运算题,把汇编指令(push pop等)比喻成加减
乘除,把寄存器或数据(eax,ebx,1等)比喻成
数字(1,2,3等),那么要保持花指令堆栈的平衡,等于保持这道数学题的结果是0

三.解释一些指令含意

push ebp ----把基址指针寄存器压入堆栈

pop ebp ----把基址指针寄存器弹出堆栈

push eax ----把数据寄存器压入堆栈

pop eax ----把数据寄存器弹出堆栈

nop -----不执行

add esp,1-----指针寄存器加1

sub esp,-1-----指针寄存器加1

add esp,-1--------指针寄存器减1

sub esp,1-----指针寄存器减1

inc ecx -----计数器加1

dec ecx -----计数器减1

sub esp,1 ----指针寄存器-1

sub esp,-1----指针寄存器加1

jmp 入口地址----跳到

程序入口地址

push 入口地址---把入口地址压入堆栈

retn ------ 反回到入口地址,效果与jmp 入口地址一样.

mov eax,入口地址 ------把入口地址转送到数据寄存器中.

jmp eax ----- 跳到程序入口地址

jb 入口地址

jnb 入口地址 ------效果和jmp 入口地址一样,直接跳到程序入口地址.

四.免杀花指令编写手册:

注:以后编写花指令,都可以参考本手册,灵活组合,快速写出自己的花指令.
*******************************************************************
我加上的可利用的命令:

xor eax,eax 寄存器EAX清0

CALL 空白命令的地址 无效call


(F).经典花指令参考

【深层】伪装 PEtite 2.2 -> Ian Luck 汇编代码:
============================
伪装代码部分:
============================

mov eax,0040E000
push 004153F3
push dword ptr fs:[0]
mov dword ptr fs:[0],esp
pushfw
pushad
push eax
xor ebx,ebx
pop eax
popad
popfw
pop dword ptr fs:[0]
pop eax
jmp XXXXXXXX '执行到程序的原有OEP

============================

【深层】伪装 WCRT Library (Visual C++) DLL Method 1 -> Jibz 二进制代码 + 汇编代码:
============================
伪装代码部分:
============================

使用二进制粘贴以下代码:

55 8B EC 83 7D 0C 01 75 41 A1 C0 30 00 10 85 C0 74 0A FF D0 85 C0 75 04 6A FE EB 17 68 0C 30 00 10 68 08 30 00 10 E8 89 00 00 00 85 C0 59 59 74 08 6A FD FF 15 08 20 00 10 68 04 30 00 10 68 00 30 00 10 E8 52 00 00 00 59 59

粘贴完毕后,再添加2行汇编语句:

jmp XXXXXXXX '执行到程序的原有OEP
retn 0C

1。伪装 vc

VC++程序的入口代码:
PUSH EBP
MOV EBP,ESP
PUSH -1
push 415448 -\___
PUSH 4021A8 -/ 在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:[EAX],AL /这条指令可以不要!
jmp 跳转到程序原来的入口点

******************************************************************************************

2。跳转

somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口的地址 /跳到原始oep

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
新入口: push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop somewhere /跳转到上面那段代码地址去!


3. 伪装 C
融合
把A的代码换成B的
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 老入口

4. c ++
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov ea

x,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax


5.Microsoft Visual C++ 6.0
PUSH -1
PUSH 0
PUSH 0
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
POP EAX
POP EAX
POP EAX
ADD ESP,68
POP EAX
MOV DWORD PTR FS:[0],EAX
POP EAX
POP EAX
POP EAX
POP EAX
MOV EBP,EAX
JMP 原入口

6.
在mov ebp,eax
后面加上
PUSH EAX
POP EAX

7:
防杀精灵一号防杀代码:
push ebp
mov ebp,esp
push -1
push 666666
push 888888
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 入口

8:
防杀精灵二号防杀代码:
push ebp
mov ebp,esp
push -1
push 0
push 0
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
sub esp,68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp,68
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 入口

9.
防杀精灵终极防杀代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
push eax
jmp入口

10:
木马彩衣(金色鱼锦衣)花代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
mov eax,原入口
push eax
retn

11:
木马彩衣(虾米披风)花代码
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loopd /跳转到下面那段代码地址去!

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口的地址 /跳到原始oep

12.
VC++5.0代码(木马彩衣无限复活袍):
PUSH EBP
MOV EBP,ESP
PUSH -1
push 415448 -\___
PUSH 4021A8 -/ 在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:[EAX],AL /这条指令可以不要!
jo 00401000 /原入口
jno 00401000 /原入口
db 0e8h /花代码



xxxxxx: nop \
/|\ POP EAX |看了,其实这两部分就是花指令
| POP EAX |
| POP EAX /
| JMP yyyyyy (跳回旧入口点:00100016DB )
|
|
| push ebp <-新入口点:
| mov ebp,esp
| inc ecx
| push edx
| nop
| pop edx
| dec ecx
| pop ebp
| inc ecx
| MOV DWORD PTR FS:[0],EAX \
| POP EAX |
| POP EAX \
| MOV DWORD PTR FS:[0],EAX |(注意了。。花指令)
| POP EAX /
| POP EAX

|
| MOV DWORD PTR FS:[0],EAX /
| loop xxxxxx (这里我向上跳~地址也是自己选的~~)
|_________________++++++(转到地址:100036c3 往回跳)


--------------------------------------------------------------
代码如下: 神话
nop
nop
nop
mov ebp,esp
push -1
push 111111
push 222222
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
mov eax,原入口
push eax
retn


代码如下: 无极
nop
mov ebp, esp
push -1
push 0A2C2A
push 0D9038
mov eax, fs:[0]
push eax
mov fs:[0], esp
pop eax
mov fs:[0], eax
pop eax
pop eax
pop eax
pop eax
mov ebp, eax
mov eax, 原入口
jmp eax

代码如下: 金刚
nop
nop
mov ebp, esp
push -1
push 415448
push 4021A8
mov eax, fs:[0]
push eax
mov fs:[0], esp
add esp, -6C
push ebx
push esi
push edi
add [eax], al
mov eax,原入口
jmp eax

代码如下: 杀破浪
nop
mov ebp, esp
push -1
push 0
push 0
mov eax, fs:[0]
push eax
mov fs:[0], esp
sub esp, 68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp, 68
pop eax
mov fs:[0], eax
pop eax
pop eax
pop eax
pop eax
mov ebp, eax
mov eax, 原入口
jmp eax

代码如下: 痴情大圣
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
push ebp
mov ebp, esp
add esp, -0C
add esp, 0C
mov eax, 原入口
push eax
retn

代码如下: 如果*爱
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
push ebp
mov ebp, esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
mov eax, 原入口
jmp eax

--------------------------------------------------------
灰鸽子万能文件捆绑器 VIP2005 -> 葛军 *

push ebp
mov ebp,esp
add esp,-124
push ebx
push esi
push edi
xor eax,eax
mov dword ptr ss:[ebp-124],eax
jmp 入口

----------------------------------------------------------
PUSH EBP
MOV EBP,ESP
MOV EAX,0
PUSH EAX
CALL 下个指令 ↓
POP EAX
SUB EAX,0
MOV ECX,0
MOV EDX,0
MOV ESI,0
MOV EDI,0
MOV EBP,0
ADD EBP,EAX
POP EAX
POP EAX
POP EAX
POP EAX
POP EBP
PUSH 入口点
RETN
----------------------------------------------------------------
//Borland Delphi 6.0 - 7.0

PUSH EBP
MOV EBP,ESP
MOV ECX,6
PUSH 0 下面那个跳到这里
PUSH 0
DEC ECX
JNZ 往回


PUSH EBX
PUSH ESI
PUSH EDI
POP EDI
POP ESI
POP EBX
JMP 入口点
-----------------------------------------------------------------
push ebp
mov ebp,esp
inc edx
nop
pop edx
dec ecx
pop ebp
inc ecx
jmp 入口点
-----------------------------------------------------------------
push ebp
mov ebp,esp
push ebx
mov ebx,dword ptr ss:[ebp+8]
push esi
mov esi,dword ptr ss:[ebp+C]
push edi
mov edi,dword ptr ss:[ebp+10]
test esi,esi
jmp 入口
-----------------------------------------------------------------
0046D4BA pop eax
0046D4BB sub eax,7D
0046D4C0 push eax
0046D4C1 C3 retn
0046D4C2 call 0046D4BA


-------------------------------------------------------------------
伪装VC7。0花

最近抓的伪装VC7。0的花,很短
//---------------------------------
push 70
push 123456(数字随便)
call A(A为地址)
xor ebx,ebx

A地址:retn


(G).定位修改与免杀

特征码修改包括文件特征码修改和内存特征码修改,因为这二种特征码的修改方法
是通用的。所以就对目前流行的特征码修改方法作个总节。

方法一:直接修改特征码的十六进制法
1.修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制.

2.适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能
否正常使用.

方法二:修改字符串大小写法
1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了.
2.适用范围:特征码所对应的内容必需是字符串,否则不能成功.

方法三:等价替换法
1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令.
2.适用范围:特征码中必需有可以替换的汇编指令.比如JN,JNE 换成JMP等.
如果和我一样对汇编不懂的可以去查查8080汇编手册.

方法四:指令顺序调换法
1.修改方法:把具有特征码的代码顺序互换一下.
2.适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行

方法五:通用跳转法
1.修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行.
2.适用范围:没有什么条件,是通用的改法,强烈建议大家要掌握这种改法.

七.木马免杀的综合修改方法

文件免杀方法:
1.加冷门壳
2.加花指令
3.改程序入口点
4.改木马文件特征码的5种常用方法
5.还有其它的几种免杀修改技巧

内存免杀方法:

修改内存特征码:
方法1>直接修改特征码的十六进制法
方法2>修改字符串大小写法
方法3>等价替换法
方法4>指令顺序调换法
方法5>通用跳转法
木马的免杀[学用myccl定位文件和内存特怔码]

1.首先我们来看下什么叫文件特征码.
一般我们可以这样认

为,一个木马程序在不运行的情况下,用杀毒软件查杀,若报警为病毒,说明存在该查毒软件的文件特征码的。
2.特征码的二种定位方法.
手动定位和自动定位
3.文件特征码的定位技巧.
通常用手动确定大范围,用自动精确定位小范围.
下面分别用瑞星和卡巴为例,实例演示并结合手动定位和自动定位二种方法来准确定位文件特征码。要定位的对像以下载者为例。
用卡巴来定位文件特征码
⑴.手动定位:
1: 打开myccl
2: 打开定位的文件

3:一般设置全为默认.....生成个数,一般为100-200块(推荐少点)

4:用杀毒软件查杀生成的文件夹,选择全部查杀!!
5:查杀完毕后选择二次处理
6:然后继续查杀文件夹,直到不查杀为止
7:点击特征区间,右击选择复合定位处特征处..
8:然后继续生成查杀....
9:循环操作,直到特征码精确到个位数...

(H).SYS文件的简单免杀

先下载工具,我用的是VMProtect
这是一个加密的工具,据说是加密一段代码,我个人认为做免杀工具是不错的了
2、老牌的16进制工具winhex,版本不限,其它的也可以。
3、要免杀的文件。
4、杀毒软件若干。
有以上工具就可以了


开始,
1、用winhex打开要改的文件,取一半代码,填充为00,另存为一个文件
用杀毒软件试杀一下,要是杀的话就不在你刚改的那一段里,反之则是。
2、从复第一步,直到关键点就好了,一般改8个字节就不杀的话就可以认为是找对了
提示一下,有时卡巴会有两处是关键点,这时找的话就难一点
可以猜到一些常出现的地方,如诺顿,就是木马的名字做关键点的
还有一般的exe是文件入口点前300字节内,可以先试试这一特征,要不行就慢慢找了
3、记下关键点,用VMProtect打开要改的文件,在界面里的右边点左键
输入刚找到的代码位置,要加上基地址。
4、重要提示,输入的地址比要改的地址前一点,观察代码
选一个好一点的位置,左边反汇编的代码不可以从中间断开
否则会出错,例如下面的代码:
100031CE |. 83E3 F8 AND EBX,FFFFFFF8
100031D1 |. 0F84 95000000 JE PcClient.1000326C
100031D7 |. 8B5424 20 MOV EDX,DWORD PTR SS:[ESP+20]
100031DB |. 55 PUSH EBP
100031DC |. 52 PUSH EDX
100031DD |. 50 PUSH EAX


你不可以输入100031D4,这样就断了代码了
同时最好不要输入100031D1,它要跳了
最好的位置我个人认为是100031DB,它在弹出栈了

选好后你可按一下F9保存,会生成一个同文件名的文件,中间多了一个.vmp,
5、免杀做好了,你可杀一下试试,再运行一下,正常的话就可以去改下一个杀毒软件了
不正常的话改一下输入位置从试
附:0727免费版内各杀毒

软件的定位
名字 位置 要改的位置
1、kv2005 5D0 105BC
2、瑞星 1740 11749
3、卡巴 19A2 19A3
4、金山 1740 11749
5、MCAFee 1740 11749
不知道是谁抄谁的了,有三个是一样的!

(I).Asp的简单免杀

2005年是免杀技术突飞猛进的一年,越来越多的人熟悉了简单的PE文件免杀操作
而杀毒软件也是在查杀方面下足了功夫,使得修改文件变得越来越困难
但是,无论定位和修改多么麻烦,只要杀软利用的是特征码扫描
PE文件就可以通过相对简单的特征码修改达到免杀
而CCL一直没有涉足的方面是脚本免杀,坛里也有朋友让我改进一下
因此最近给CCL加上了定位脚本特征码的功能,并对一款asp木马进行了测试
结果怎么样呢?
这里我选择了海阳顶端网ASP木马2006版
由于并不知道杀软是怎样定义脚本文件的特征码
所以我的操作与定位PE文件相同。杀软仍用大名鼎鼎Kaspersky
先查一下吧,卡巴报警发现Backdoor.ASP.Ace.aw。注意末尾的aw
这是杀软对同一个文件不同版本的特征码定义
有时我们需要运用定位过程中版本号的变化来确定特征码的位置。
首先假设将特征码定位器CCL设置成手动定位,生成文件200个
打开海洋的木马主文件2006.asp。这时弹出了定位范围选择窗口
由于脚本文件不是PE文件,因此没有分段,整个文件就是一个整体
段名为整个文件,段大小就是整个文件的大小。





直接点确定,对整个文件进行定位。生成文件完毕后对目标进行查杀
结果,只剩下一个文件没有被杀,OUT_00000000_000001C3
这说明当从偏移0开始1C3个字节的数据被填0时,该文件免杀。我们看一下这里是什么。
代码:


脚本文件我不太熟,但总比改汇编指令简单,试着修改一下吧
原则还是不能破坏原文件功能。我们知道,asp中代码是在之间的
于是我们在每一个前插入一个,就像汇编插入nop空指令一样。保存修改
再用卡巴查一下。还是报警,但是这次显示的是Backdoor.ASP.Ace.w
这就说明:我们刚才修改是特征码中的一处,但不是全部
也就是说我们把aw中的a代表的特征码改掉了,但是w仍然在。
我们再用CCL打开修改过的2006.asp,设置保持不变
再重复上述步骤。经过查杀后,200个文件剩下了6个。看一下结果
-------------定位结果------------
序号 起始偏移 大小 结束偏移
0001 00000000 000001C3 000001C3
0002 000140A2 000008CF 00014971

第1段仍是在文件头部。我分析是卡巴在对脚本文件检测前会分析文件的完整性
而1号结果正好将“<%”给替换掉,这样的

脚本代码是没法运行的
因此卡巴就不认为它有毒。(卡巴对PE操作也存在同样问题
这也是很多人用CCL定位卡巴总是遇到结果定位在PE文件头部的原因。
我们看2段处是什么,该段结果范围较大,我们找有“特色”的改

我们将“文件上传成功”改为“上传成功”,保存后再检测。OK
免杀成功了。运行一下试试,海洋的各项功能正常。当然
文件上传成功后的提示已经变了


总结一下:卡巴对恶意脚本的定义仍是沿用特征码的方式
且明显没有PE文件的特征码定义那样复杂。希望杀软早日在检测方式上产生根本性的改变!

(J).杀毒趋势

去年以来,由于一些新出的病毒搞的一些著名的杀毒软件非常被动
去年肆虐一时的熊猫烧香就是其中典型的代表
让不少用户抱怨的同时也让大家发现了当前很多主流杀毒软件技术上的不足
甚至有一些媒体说他们的杀毒技术的核心特征码技术是过期药
只能在一些用户遭殃后再出手治病救人。
各个厂商之间的口水大战也让不少用户茫然。

为了弥补自己技术上的不足,挽回自己在用户中技术落后的形象。
各大主流厂商纷纷推出主动防御技术来补充自己产品在对付未知威胁方面的不足
国产杀毒软件继东方微点首次在国内推出以行为杀毒混合特征码的主动防御技术之后
其他著名杀毒软件也纷纷宣布实现了主动防御技术
他们的主动防御技术大多是基于原先已经很成熟的启发式杀毒技术
其中江民还加入了一个基于HIPS技术设计的防御模块,虽然对用户要求偏高
但是对于高手来说确实安全系数提高了不少。国际厂商中动作最大的是卡巴斯基
继在6.0版本中加入基于行为杀毒技术的主动防御模块后
新的7.0版本又重新加入启发杀毒模块,加上他强大的特征码技术
同时拥有三大杀毒技术的卡巴斯基从表面上看似乎他的技术构成已经臻于完美
国际厂商中的诺顿也宣布在新版本中也加入行为杀毒技术
似乎一夜之间所有的杀毒厂商都有了很大的技术提升
纷纷从买过期药变成卖包治百病的灵丹妙药……

主动防御究竟是什么?

估计有不少用户被各大厂商炒作的各种技术术语搞的晕头转向
其实各大厂商主动防御技术不过基于二种技术:一种是基于虚拟机设计的启发杀毒技术
一种是基于程序行为判断的行为杀毒技术。下面分别来分别小小的介绍一下

启发杀毒技术是目前比较成熟的对付未知病毒的技术
以NOD32,Dr.Web、迈克菲,Avira、VBA32等为代表
其中以NOD32把启发杀毒发挥的最淋漓尽致,NOD32在业界有启发之王的美誉
凭借这一项绝技,NOD32不但常年在VB100测试中笑傲江湖
还在很多测试

未知病毒的测试中常常名列前茅。以NOD32的启发杀毒技术为例
他监控系统时候先用他内置的特征码库判断
如果判断不出的就把程序纳入NOD32内置的一个微型虚拟机内运行来根据他的行为进行危害判断
发现没有问题再放行(说一句题外话,虚拟机杀毒是一个比较成熟的老技术,不像某些厂商说的是他们首创)
这种技术理论上是可以对付所有的病毒,可惜目前由于系统开销问题
所有的启发杀毒引擎只能用简化的虚拟机
这样一些设计先进的病毒可以判断出这还是虚拟机从而不发作,如果用更复杂的虚拟机,虽然可以发现更多的病毒
但是系统开销又很大(不过好在新的INTER和AMD的CPU都内置了虚拟化技术
虚拟机的运行速度加快了不少)。启发引擎只能在速度和效率上找平衡
这也是当前所有启发杀毒技术的无奈。还有一个问题是由于启发杀毒技术为了加速判断
经常需要运用一些规则来判断,但是由于判断的规则有些严厉有些宽松
严厉的经常有误杀问题,宽松的也容易放过一些真正的病毒
所以启发杀毒引擎在规则的严厉程度的选择上是一个很大的问题
就是以启发成熟著名的Nod32也有误杀的问题
譬如他就把常用的五笔输入法安装文件判断为危险程序,要清除他
其他的启发杀毒软件譬如Dr.Web和Avira相对的误报就更多些
由于启发技术已经被运用多年,技术已经很成熟
所以目前几乎所有的主流杀毒厂商都在拥有特征码杀毒的基础上集成了启发杀毒引擎
他是目前主动防御技术的主力军
也是被研究的最多的,意味着能够突破他的病毒也会有不少。

行为杀毒技术是这两年热炒的杀毒技术,其中在国内以东方微点为先行者进行了很好的探索,在国际上也有很多厂商也在这方面进行突破
其中名气最大的是卡巴斯基,他在6.0版本中集成了比较完备的行为杀毒技术
其他譬如印度的Sanrasoft公司的Rudra,美国的Cyberhawk和英国的Prevx1都以行为杀毒技术为核心来构建自己的产品,其他一些大牌主流厂商也开始跟进
行为杀毒技术很好解释,就是程序在系统中实时监控所有的程序行为
发现他有危险的行为就立即制止并报警。如果再通俗些解释
其实就是把启发杀毒中在虚拟机中验证的程序行为拿到真实系统中来监控。

从理论上说,行为杀毒技术是最完美的杀毒技术
但是由于各个厂商技术水平的不同,他们的行为杀毒技术实现的程度也不同
最基础的就是江民和诺顿,只是集成了HIPS技术
监控系统中的所有行为他都要汇报让用户来干预
对于了解系统的软件高手来说是利器,可以体验完全掌控系统的快感
对于普通用户来说那没完没了的提示就

是恶梦。再进一步就是卡巴斯基这种
因为已经内置了一些行为数据库,可以进行智能行为判断
一些正常的程序行为自动被过滤了,并且可以根据分析出的危险行为进行分级,虽然有一些误报
但是还是给用户一种对付未知病毒的手段
第三种就是微点、Cyberhawk和Prevx1这种基本完全靠行为杀毒吃饭的杀毒软件
他们都内建了比较完善的行为分析数据库,大大的减少了需要用户进行干预的次数,智能化程度已经比较高了。但是由于目前Win系统过于庞大
各种应用软件的编写和运行方式千差万别,对于杀毒软件公司来说完全判断出所有的安全行为和危险行为基本是不可能完成的任务
所以微点也有一些特征码技术来补充完全靠行为杀毒的不足
Cyberhawk宣传自己是主流杀毒软件的良好补充……
加上和启发杀毒一样需要对误报进行控制,现在可以这样说
纯粹靠行为杀毒来对付未知的病毒在当前是不可能完成的任务!


(K).主动防御简介

目前,很多安全厂商在推出新产品时,总是强调该产品具有“主动防御”技术
可以防御未知病毒、未知威胁、ZeroDay攻击等。根据安全专家的分析
所谓“主动防御”其实是针对传统的“特征码技术”而言的。


一般意义上的“主动防御”,就是全程监视进程的行为,一但发现“违规”行为
就通知用户,或者直接终止进程。它类似于警察判断潜在罪犯的技术
在成为一个罪犯之前,大多数的人都有一些异常行为,比如“性格孤僻,有暴力倾向
自私自利,对现实不满”等先兆,但是并不是说有这些先兆的人就都会发展为罪犯
或者罪犯都有这些先兆。


因此“主动防御”并不能100%发现病毒或者攻击,它的成功率大概在60%--80%之间
如果再加上传统的“特征码技术”,则有可能发现100%的恶意程序与攻击行为了
从国外的情况看,诺顿、Kaspersky、McAfee等主流安全厂商
都已经向“主动防御”+“特征码技术”过渡了,可以说这是安全系统的必然发展趋势。


此外,防火墙也是一个运用“主动防御”技术的典型例子
目前的企业都在使用防火墙,很多用户对于防火墙经常询问是否放行一个进程访问网络
或者有不明连接进入本机而发出警告印象深刻。


其实防火墙就是在全程监视进程的网络行为,一但发现违反规则的行为就发出警告
或者直接根据用户设定拒绝进程访问网络。
当然,现在的防火墙一般都把系统网络进程
如Services.exe、Svchost.exe、Lsass.exe记在“受信名单”里
这些进程是默认允许访问网络的,如果禁止的话,操作系统就不正常了
这也是现在很多病毒和木马都喜欢远程注入这些系统进程
以求突

破防火墙而访问网络的原因。


“主动防御”的技术实现


在“主动防御”技术的的实现上,主要是通过函数来进行控制
因为一个程序如果要实现自己的功能,就必须要通过接口调用操作系统提供的功能函数
以前在DOS里几乎所有的系统功能或第三方插件都是通过中断提供的
在Windows里一般是通过DLL里的API提供,也有少数通过INT 2E或SYSENTER提供
一个进程有怎么样的行为,通过看它调用了什么样的API就大概清楚了
比如它要读写文件就必然要调用CreateFile(),OpenFile(),NtOpenFile()
ZwOpenFile()等函数,要访问网络就必然要使用Socket函数。因此只要挂接系统API
(尽量挂接RING0层的API,如果挂接RING3层的API将有可能被绕过)
就可以知道一个进程将有什么动作,如果有危害系统的动作该怎么样处理等等
例如瑞星反病毒系统,用户可以在它的安装目录里找到几个驱动文件
其实这些驱动就是挂接了ntoskrnl.exe,ndis.sys等系统关键模块里的API
从而对进程的普通行为,网络行为,注册表行为进行监视的。


在此基础上,用户可以自己设想一下一个“主动防御”型安全系统的一般操作流程
通过挂接系统建立进程的API,系统就在一个进程建立前对进程的代码进行扫描
如果发现SGDT,SIDT,自定位指令(一般正常软件不会有这些指令),就进行提示
如果用户放行,就让进程继续运行;接下来监视进程调用API的情况
如果发现以读写方式打开一个EXE文件,可能进程的线程想感染PE文件
就发出警告;如果收发数据违反了规则,发出提示
如果进程调用了CreateRemoteThread()
则发出警告(因为CreateRemoteThread()是一个非常危险的API
正常进程很少用到,倒是被病毒、木马用得最多)。


可以想象,未来企业用户在运行程序时可能会被提示多次
访问网络也可能被提示多次,各种各样的提示有可能将大多数人搞的昏头转向
不过这就是安全,也是主动防御的魅力,一句话,企业想安全就要管严,放松就不安全了!

相关主题
文本预览
相关文档 最新文档