木马高级免杀修改特征码需要熟练掌握的全部汇编知识 ^eh/HnJs
一.机械码,又称机器码.<br> w6zBVi
ultraedit打开,编辑exe文件时你会看到<br> ?[= U%sPu=
许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码<br> AK/:I>M
就是机器码.<br> |4>:M\h
修改程序时必须通过修改机器码来修改exe文件. b|?;h21rG
二.需要熟练掌握的全部汇编知识(只有这么多)<br> dHII.=lT
不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了<br> 32>x^>G=>
cmp a,b 比较a与b<br> y-+G
wa3
mov a,b 把b的值送给a<br> ?2`$3[ET-
ret 返回主程序<br> 2*OxA%QELM
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面<br> g(m_yXIx
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)<br> :5#
V^\3*
call 调用子程序<br> p:[LnL
je 或jz 若相等则跳(机器码74 或0F84)<br> MCy~@)-IN
jne或jnz 若不相等则跳(机器码75或0F85)<br> T 33|';k
jmp 无条件跳(机器码EB)<br> Gp|JU Fo
jb 若小于则跳<br> (F&YdWe:
ja 若大于则跳<br> uxDLDA$;
jg 若大于则跳<br> {bkGYx5.C
jge 若大于等于则跳<br> =vEkMJOs
jl 若小于则跳<br> =AkX4k
jle 若小于等于则跳<br> p;->hn~D'5
pop 出栈<br> J/kH%_ >Ir
push 压栈 *cNk>y
三.常见修改(机器码)<br> AQh["1{yJ
74=>75 74=>90 74=>EB<br> pxplWP,
75=>74 75=>90 75=>EB O),I[kb
jnz->nop<br> !~JWYY
75->90(相应的机器码修改) v5 Y)al@
jnz -> jmp<br> |- OHve4A
75 -> EB(相应的机器码修改) T`Hw49
jnz -> jz<br> a4by^
75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改) t)(v4^T
四.两种不同情况的不同修改方法<br> shK&2Noan
1.修改为jmp<br> @ ;J|xkJ
je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息 d*9j77C ]
xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等(我们希望把它跳过,不让它出现)<br> SLh~_ 5
。。。<br> z7q%,yw3N
。。。<br> 8IOj[&%0
xxxxxxxxxxxx 正确路线所在 hht+bpHl
2.修改为nop<br> Sip_~]hM
je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处 \e0x,2
xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)<br> *a4
b
。。。<br> llqDT-cp
。。。<br> K#)bjxz
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. <br> >fwlg-
1. 通用数据传送指令. <br> i n?T]}
MOV 传送字或字节. <br> i*A$SJ:}
MOVSX 先符号扩展,再传送. <br> 05 g?jV
MOVZX 先零扩展,再传送. <br> d<?X3&J
PUSH 把字压入堆栈. <br> ] - h|]
POP 把字弹出堆栈. <br> v1K4 $&{F
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. <br> f>4+,@G
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. <br> U\;Ml
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. <br> gyg|Tno
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. <br> TP^\e_k
BSWAP 交换32位寄存器里字节的顺序 <br> T-!|l7V~f
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) <br> GiFf0c
9
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) <br>
,gx$U@0Z
XADD 先交换再累加.( 结果在第一个操作数里 ) <br> $"(3M nR
XLAT 字节查表转换. <br> wEv*1y4
—— BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 <br> A1 b6Zt
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) <br> p+5#dbyr
2. 输入输出端口传送指令. <br> <WgG=Kf)N
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) <br> ":z@c,
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) <br> @US '{hO1p
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, <br> eKS:7:X
其范围是 0-65535. <br> uvNnW}G4
3. 目的地址传送指令. <br> C`z;,!58%
LEA 装入有效地址. <br> xQZMCd
例: LEA DX,string ;把偏移地址存到DX. <br> [lrmuf
LDS 传送目标指针,把指针内容装入DS. <br> b^;N>zx
例: LDS SI,string ;把段地址:偏移地址存到DS:SI. <br> B0NN>)h
LES 传送目标指针,把指针内容装入ES. <br> bmSpbX\
例: LES DI,string ;把段地址:偏移地址存到ESI. <br> dcM+ylB
LFS 传送目标指针,把指针内容装入FS. <br> Sk!v,gx
例: LFS DI,string ;把段地址:偏移地址存到FSI. <br> b^@`uDb6
LGS 传送目标指针,把指针内容装入GS. <br> 6Lav.x\W
例: LGS DI,string ;把段地址:偏移地址存到GSI. <br> 0 %C!`7
LSS 传送目标指针,把指针内容装入SS. <br> R20a(4m
例: LSS DI,string ;把段地址:偏移地址存到SSI. <br> 8rnb
4. 标志传送指令. <br> a [0N,t
LAHF 标志寄存器传送,把标志装入AH. <br> DKf}47y
SAHF 标志寄存器传送,把AH内容装入标志寄存器. <br> Y+}OClS
PUSHF 标志入栈. <br> ]i9H_K
POPF 标志出栈. <br> tOu90gu
PUSHD 32位标志入栈. <br> ZY~zpC_
POPD 32位标志出栈. F%Ro98?{
二、算术运算指令 <br> qYQUr8{
————————————————————————————— <br> U1OLI]P
ADD 加法. <br> \5j22L9S
ADC 带进位加法. <br> =<Zwv\U
INC 加 1. <br> 6C@0[Q\ER
AAA 加法的ASCII码调整. <br> 6kgCS{MZ
DAA 加法的十进制调整. <br> mkKRC;
SUB 减法. <br> 9F-ViDI.
SBB 带借位减法. <br> 9}? 5p]%
DEC 减 1. <br> \H"/2o%l")
NEC 求反(以 0 减之). <br> i2`.#YJ&v
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). <br> 2_B;
AAS 减法的ASCII码调整. <br> z|oA{VxW>
DAS 减法的十进制调整. <br> GN}9$:
MUL 无符号乘法. <br> <S:,`v&Z
IMUL 整数乘法. <br> t*ri`}a{v
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), <br> %-0em!tUV
AAM 乘法的ASCII码调整. <br> f@,hO5h(_|
DIV 无符号除法. <br> 2-
|j
IDIV 整数除法. <br> q/aL8V<"z
以上两条,结果回送: <br> KU8Cl>5
商回送AL,余数回送AH, (字节运算); <br> ^5^
zo~^o
或 商回送AX,余数回送DX, (字运算). <br> $!
fz~
AAD 除法的ASCII码调整. <br> #lLn='4
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) <br> SWe!9Y$
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) <br> ^OGH5@"
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) <br> T`(;;%
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) L?/M2zc9Y
三、逻辑运算指令 <br> PN)TX~}
————————————————————————————<br> U:T5o]P<
AND 与运算. <br> b(.o|d /P
OR 或运算. <br> JOL Z2
XOR 异或运算. <br> h P6fTZ=Ln
NOT 取反. <br> qH}62DP3
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). <br> d/-0B<ts
SHL 逻辑左移. <br> da7x 1n$D
SAL 算术左移.(=SHL) <br> R4K eUn"
SHR 逻辑右移. <br> ES2d9/]p-
SAR 算术右移.(=SHR) <br> njx\$,ruN
ROL 循环左移. <br> LTlC}3c28f
ROR 循环右移. <br> .k?hb]2N
RCL 通过进位的循环左移. <br> d$G%F $BTs
RCR 通过进位的循环右移. <br> J{'zkR?Lr
以上八种移位指令,其移位次数可达255次. <br> D%";!7u
移位一次时, 可直接用操作码. 如 SHL AX,1. <br> !WVabdt
移位>1次时, 则由寄存器CL给出移位次数. <br> `HZHVV$~
如 MOV CL,04 <br> 28ov+s~1+-
SHL AX,CL |2c!t$O@v
四、串指令 <br> e"&9G}.f
————————————————————————————— <br> 4s+J-l
DS:SI 源串段寄存器 :源串变址. <br> f<t*#]<