免杀学习经典知识
建议兄弟们一定要看完 对你会有所帮助的; s& n" M! w* ^5 j3 b. g6 w d' s
天天看别人教程做免杀 不如自己会免杀技术. 这些就是基础知识了 一定要掌握 多多练手就会了1 L5 r7 G: p- h) y# M
+ c+ p' Y1 N! j+ V4 w3 n7 Q
一.机械码,又称机器码.- A5 b" t. `# a; m( o$ Y
ultraedit打开,编辑exe文件时你会看到$ F8 a2 T' a4 r- _
许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码
7 O5 Z: h9 H7 x1 O1 k* x就是机器码.
3 a: R' @* H0 g$ \; K1 t! T! q修改程序时必须通过修改机器码来修改exe文件.1 B7 ]. _9 ~$ o& v
4 G T0 C. }" s/ s" t0 {' m/ h
二.需要熟练掌握的全部汇编知识(只有这么多)/ |9 f6 i) G* d5 Y0 k7 o
不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了& q0 h$ s( |# V( T- S
cmp a,b 比较a与b c& s/ H& Y$ s0 M3 h2 F t% {
mov a,b 把b的值送给a& B, }' E/ Y6 w) ?
ret 返回主程序+ C4 f E! L8 X! w; C8 `1 R
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)5 Y0 f v( g9 Y* M6 [- m! {- P
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)* c$ m$ L7 i2 ~, Y l
call 调用子程序* V c5 Q& y( v3 c; l% w
je 或jz 若相等则跳(机器码74 或0F84)
5 J5 b) E/ g( Z. N% ^% V% Cjne或jnz 若不相等则跳(机器码75或0F85)2 A; M" f( V- d: D/ c
jmp 无条件跳(机器码EB)0 j5 D q! W9 r/ Q% G% ~
jb 若小于则跳
" q5 S5 e0 X z$ |0 w- Hja 若大于则跳
w$ U; k9 _& t* { F7 {: o1 zjg 若大于则跳2 \) l( d' l0 k& {) k& B
jge 若大于等于则跳
2 l; }0 W( `/ Fjl 若小于则跳
* o, J6 d- X% F% cjle 若小于等于则跳
8 \ y" z& j" a$ b9 R7 g2 R. {pop 出栈- x" S) I; a6 o" D
push 压栈' D9 a% v" C& w0 Y" M' b9 i* {
8 l$ [9 ?) s4 O, B( T# x r+ F
三.常见修改(机器码)
* {# N* e8 ]8 e: m74=>75 74=>90 74=>EB
- ^# R1 c* x! W1 [ Q% |5 C75=>74 75=>90 75=>EB
% m, o9 B: w Q4 U6 r z& I3 Z7 X: L
- x$ {6 [2 g: R- b, ~* D) B$ W! Ejnz->nop
* W1 g; L4 F% E7 y4 b' \75->90(相应的机器码修改)& {7 b+ R) f3 Q4 T F3 `5 |: O
' _" w7 E) m; f8 n& Xjnz -> jmp
- F5 V1 K( c( ~ { B75 -> EB(相应的机器码修改)
5 D K* {0 ]5 U5 T2 k" e! ^) h( ~9 ]% k# Q# R+ U6 B! @
jnz -> jz
6 ]- ~* y( P9 _0 i8 p7 i75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)& v: I+ V" y4 f9 y7 T/ f
# }% J* |& Z* p; b7 t% t四.两种不同情况的不同修改方法8 l3 Y9 {4 O% L+ {: k. k
1.修改为jmp
9 W, y; s. B, F9 o$ t9 o; Hje(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息0 @& I# D- q# k; W. W- K1 T# x1 B1 H
( e @7 s+ C4 s
xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 $ z! \4 o0 q% s s5 ?% U/ n; }
! k( y( @) v7 w, I( J; L2 \; ]
"Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)
# s$ O: K* K7 n。。。
* U* }. n L ^8 g。。。
0 M3 z' Q/ E$ Rxxxxxxxxxxxx 正确路线所在
1 A2 a1 o5 K. b, s( f: L% Z. {
, d0 z2 ^9 n. H% v2 j8 `: V( s2.修改为nop2 a) Y, c# e$ `. ^7 A
je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使5 b7 ?0 U0 P( w2 \8 [- ^; Y
3 Y3 C! z y* n1 P程序顺利来到紧跟其后的正确信息处
. O D: B9 _* a( [+ n( `+ A: y) o
7 X0 K$ i/ G0 N# nxxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里): x3 |' A- J0 Y+ l
。。。9 [8 C$ x$ R* ^) s0 \! `; B
。。。# L$ I |! L- z1 F4 w
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. ! E) L- R- g+ f0 q
1. 通用数据传送指令. % x3 ^% G0 G2 Z8 `) Z4 D7 ~
MOV 传送字或字节.
G# K$ T0 }# Q3 ]' K: W& cMOVSX 先符号扩展,再传送. 9 P7 ]! d/ q6 {. T' }) C, h- h! N$ C
MOVZX 先零扩展,再传送.
( g! Q& S' K0 ^# R ]; jPUSH 把字压入堆栈.
B0 k8 l0 m2 M: EPOP 把字弹出堆栈.
; }+ @1 M, h) PPUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. ) s0 N& {5 v+ Z6 w- N" d7 q) q
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
: P8 d# A9 b/ s8 Y; GPUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
; w. |; b$ m: L+ d7 A& c; yPOPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
* z# y& [ `6 jBSWAP 交换32位寄存器里字节的顺序 8 W& s s) s' q2 [4 G, t* ~5 \" n
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) . n! v8 E8 [ v% ~8 a# d
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
: B0 ?( P5 v- m$ a3 u+ ^XADD 先交换再累加.( 结果在第一个操作数里 ) + j" ?. Z( M! m
XLAT 字节查表转换. " A5 r( ] s+ k$ W
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
+ |) T1 h1 \ ]2 ] s0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) . C5 i4 @, {, w5 C ~
2. 输入输出端口传送指令. 8 E) u8 q& Z4 ]: m' O
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) - i8 `7 y3 d% x1 E O
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) + a& d3 Y7 o. n3 R7 P5 }' p
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
_5 D7 \/ k5 `# y6 ]其范围是 0-65535.
/ ^8 G" O, m5 Y/ F: s3. 目的地址传送指令. ( [5 L" |7 y( X% z- O; X
LEA 装入有效地址.
- _) b8 `9 T, C例: LEA DX,string ;把偏移地址存到DX. ! F/ A( n) b! M$ y$ M
LDS 传送目标指针,把指针内容装入DS. 5 G! _' i2 W& l: t
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
2 ^# p4 F" ], t5 eLES 传送目标指针,把指针内容装入ES.
4 @ M& j# u u$ L- U. q% r* Z例: LES DI,string ;把段地址:偏移地址存到ESI.
0 S3 z7 q( A/ P" U \2 ?, Q9 I" ~ CLFS 传送目标指针,把指针内容装入FS. & u+ ^" q+ t6 A9 l; q# \5 R; I+ w
例: LFS DI,string ;把段地址:偏移地址存到FSI.
: m8 g/ T# v- w* Q1 v+ T3 {LGS 传送目标指针,把指针内容装入GS.
. y( n2 z6 j. P7 k: `例: LGS DI,string ;把段地址:偏移地址存到GSI. 8 Q8 o$ b6 ^- a# z. G+ h n" @% V6 C
LSS 传送目标指针,把指针内容装入SS. " {. v8 N! ~8 \8 n3 G- k" t% r, V6 w8 K; n$ c
例: LSS DI,string ;把段地址:偏移地址存到SSI.
* o: }7 G6 i/ {, L; v) q4. 标志传送指令. 1 I T; B" b3 N i6 h: F% Z
LAHF 标志寄存器传送,把标志装入AH.
' T8 E- B2 X# M, D; mSAHF 标志寄存器传送,把AH内容装入标志寄存器.
0 p7 U' j; ^$ ?2 l- Y( TPUSHF 标志入栈.
- C0 {; S, Q6 CPOPF 标志出栈.
9 s! Q4 u+ d3 c) T/ SPUSHD 32位标志入栈.
0 B7 q4 X, O0 b2 |+ x; KPOPD 32位标志出栈. " d# J+ g ~5 x
J! g4 O+ I. ]- G. A二、算术运算指令
; o1 s8 q$ E( V, P: I& m───────────────────────────────────────
* W) ?$ i+ k) q' lADD 加法. / b4 V$ F3 I% {, h9 h H
ADC 带进位加法. " F+ B5 ]0 M' L. _
INC 加 1.
& y5 C0 E+ @9 B8 O4 q- IAAA 加法的ASCII码调整. & ?4 O t; m f/ ^) F
DAA 加法的十进制调整.
F& T8 j: f8 c: O5 x% BSUB 减法. 0 }6 ~ n; E3 T1 E* R; a P
SBB 带借位减法.
. O: Y ^3 s4 ], X1 VDEC 减 1. 8 l3 G( g* [* [
NEC 求反(以 0 减之). 4 n8 t) E4 |* V8 A! R% p
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
# F2 _8 i* y+ QAAS 减法的ASCII码调整.
`7 t, l( R$ M W6 DDAS 减法的十进制调整. 9 p! D$ X! Z' |! |' O; K
MUL 无符号乘法.
+ y+ s M( L% M8 H. j: P7 CIMUL 整数乘法.
) Z6 h; q' [! y G, O以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), 5 `% a4 l. k+ J1 ^) v& x
AAM 乘法的ASCII码调整.
- w* C: ^- {& g5 e) n0 oDIV 无符号除法.
$ @3 a# F V1 A6 dIDIV 整数除法. ) s' |7 s- [( P' V
以上两条,结果回送:
; n2 K. H& p6 e% q商回送AL,余数回送AH, (字节运算); 1 \" _; ]3 L; ?0 z/ c. g1 u; ~3 {
或 商回送AX,余数回送DX, (字运算).
- U9 T, ~7 {/ g; BAAD 除法的ASCII码调整.
3 G1 S) j! @* T' K0 N$ s+ ~CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) 5 q( m' F0 M2 X& ~' x5 Q! b
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) 8 I7 w C2 o; K( W7 d) M% c1 c
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
- t/ N( a7 D3 p8 \/ C5 e3 ^1 _CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
% h8 ~, \3 w/ D9 }7 M6 f# Y
# X t b! }& }1 m三、逻辑运算指令
8 ` E, G! c3 m2 u$ ]8 P─────────────────────────────────────── - [2 H! _& z1 G8 W+ X
AND 与运算. 2 ~0 Y/ \3 ]+ ]! H. G
OR 或运算. $ ?; x' }5 H5 q& W4 x/ t9 F
XOR 异或运算.
* D' ~. d$ y- L2 v: H% wNOT 取反. R. \. k9 ?: u: F9 N: v% |
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
2 G4 N9 } T. ASHL 逻辑左移. & P9 |1 Y0 G. Z( W. W' n
SAL 算术左移.(=SHL)
6 A# ~& v0 M. p2 v2 zSHR 逻辑右移.
/ r+ p T* e/ e- z! m' eSAR 算术右移.(=SHR)
1 g/ d( J2 H% z( j2 \6 I1 CROL 循环左移.
3 \. C7 j p1 r. O# B5 M/ FROR 循环右移. : o. A- w1 X) Z2 ~
RCL 通过进位的循环左移. , g( {1 t" v7 F
RCR 通过进位的循环右移. . T& O0 Z# Z$ s: l7 i$ `4 C1 a
以上八种移位指令,其移位次数可达255次. 5 Q0 O. s. F4 P1 A
移位一次时, 可直接用操作码. 如 SHL AX,1. 8 |, _! g$ O! a5 i. ]& i
移位>1次时, 则由寄存器CL给出移位次数.
- T4 i; h- n( {- ^) X& w如 MOV CL,04 4 J* @5 |9 h) P: ~3 J
SHL AX,CL
2 N' N: z) R, D4 N1 D" N3 B: n$ P1 a. X
四、串指令 $ W, e8 X( g1 L' h
───────────────────────────────────────
( k8 G( ^! H# |. J4 k1 bDS:SI 源串段寄存器 :源串变址.
: v6 B4 i$ d* f3 @ESI 目标串段寄存器:目标串变址.
: Z. o4 x2 M8 q. N0 e# _( L: fCX 重复次数计数器. ) t W( V- x. ^7 O0 y" b
AL/AX 扫描值. 3 I6 c' P3 O' j5 V
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. 0 F$ w5 ^- p7 B* A0 U. {2 G& M
Z标志 用来控制扫描或比较操作的结束. 2 Q# U V ]! T: v5 B. O! v; O B; X. S+ _
MOVS 串传送. : P( C1 q/ e8 T" }& l! V
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
! d3 o3 M& F8 M& B1 ~1 ACMPS 串比较.
A7 b, n" N. V, P- C; I/ c! v( CMPSB 比较字符. CMPSW 比较字. ) ; D# G0 L0 Q7 I( s6 a
SCAS 串扫描. . C- l* z* M' h# a' F* _/ S* A5 ]7 E. K
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
6 A1 _5 ^5 H- iLODS 装入串. 0 Z: ]$ k3 k& D" A. Z w
把源串中的元素(字或字节)逐一装入AL或AX中. ; Q. t3 ?/ U$ w2 y4 ^0 K# I) j* f
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) + _8 c# y9 i4 |! L$ v. I
STOS 保存串. / c$ U- ?; s8 I* B& n$ ], |
是LODS的逆过程. # ^! v ?" h% M& i
REP 当CX/ECX<>0时重复.
9 M9 A8 ?; P& E. [4 z4 N( PREPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
0 m( s7 N2 e! a8 c& ZREPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复. % j: M) g' `$ k, u- l; S5 p; [) C& E' d4 C
REPC 当CF=1且CX/ECX<>0时重复.
' ]0 h. ?( U& x$ U5 L8 j( @REPNC 当CF=0且CX/ECX<>0时重复.
4 c8 U4 n' X t Z3 Y7 q9 V' w4 u9 Q# A& s1 [' n- L, X
五、程序转移指令
, B) Z5 [/ r4 N6 L' o─────────────────────────────────────── # ?. x! [7 z" ~
1>无条件转移指令 (长转移)
D# y b& `- ~ MJMP 无条件转移指令
' K9 M: S+ Y: M* h) _CALL 过程调用
+ J4 c6 a4 g- u1 SRET/RETF过程返回. 9 e! v& I8 w( B! i& @( e
2>条件转移指令 (短转移,-128到+127的距离内)
3 q: Y3 C1 f# y! F( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
1 W% V/ ?. o c$ r r& N% C$ D* wJA/JNBE 不小于或不等于时转移.
) F- B9 ?( k+ k, R% F GJAE/JNB 大于或等于转移.
; d) N3 j# J' T( `0 c1 Z5 t( c5 FJB/JNAE 小于转移.
7 J, I! g( }" Q v9 O3 N3 zJBE/JNA 小于或等于转移. u: w% Q% ~$ q$ X7 R
以上四条,测试无符号整数运算的结果(标志C和Z).
9 v9 j4 l/ n- J8 |7 u( g7 c$ `# _JG/JNLE 大于转移. 9 k2 T% }3 Y3 P) S( ?) c
JGE/JNL 大于或等于转移.
; M/ y9 l2 Q: k0 vJL/JNGE 小于转移.
, j# n/ D3 C8 d* E8 t( }4 FJLE/JNG 小于或等于转移. 4 i F2 C. m: n F
以上四条,测试带符号整数运算的结果(标志S,O和Z).
8 y% b5 ?! m6 k, A- iJE/JZ 等于转移. * A- X6 s/ M6 u: e# s& ^4 D
JNE/JNZ 不等于时转移. $ L# _9 i7 q9 m/ h# c
JC 有进位时转移. X; u4 s+ K$ N: |
JNC 无进位时转移. 1 f7 M; E; o# m: y7 E
JNO 不溢出时转移. 0 B$ N8 }. W* y5 J$ h
JNP/JPO 奇偶性为奇数时转移.
, S! h* H7 q+ i( DJNS 符号位为 "0" 时转移.
$ {9 _# L3 M* i; a+ E$ [JO 溢出转移. / s, U; F/ G% U- W
JP/JPE 奇偶性为偶数时转移. $ S( J, |6 h3 f ^/ l/ A
JS 符号位为 "1" 时转移.
' N* ^! \, s4 L+ W7 p% u+ D# }3>循环控制指令(短转移)
& l3 Q' C" H4 a% o; V4 gLOOP CX不为零时循环. # S% b. N, x- j# l# X
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
& e1 {) B; P( u0 }LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. - h( |0 O4 `/ M8 s# K' g0 f* t0 Z: Y
JCXZ CX为零时转移. 4 f3 }/ F/ ?( y; k Q
JECXZ ECX为零时转移.
0 V+ w3 f4 c! Q0 {4>中断指令
% I5 ^$ J6 H# U6 {. iINT 中断指令
' h/ N2 [9 H! ]) aINTO 溢出中断
7 F) I- E4 i- Q, w. ^1 R8 _/ u) AIRET 中断返回 . [4 [" _, r$ v6 e6 ?9 M! ~' u) S
5>处理器控制指令
, V- T& l4 d. ]6 |+ g, gHLT 处理器暂停, 直到出现中断或复位信号才继续.
( U- y. x4 [0 Q% h# f8 H2 L3 ]1 _WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. / ]" B' ?$ @& b: h g: l& `8 F$ Q
ESC 转换到外处理器.
- n. l, ^3 n' z% V, eLOCK 封锁总线.
% m: n8 [+ M& xNOP 空操作. - V+ J, ]# o4 P4 Q$ \( V) }
STC 置进位标志位.
! ~2 V: C9 h# @$ X$ \% a4 UCLC 清进位标志位.
! n1 O$ t j: V" T+ nCMC 进位标志取反. " T9 f5 |. ]! s1 {
STD 置方向标志位. " {% `- O& r6 J+ w Z, ~
CLD 清方向标志位. z3 F- s1 b: \ r- x8 b2 F
STI 置中断允许位.
% ~3 t* ^6 [1 A: wCLI 清中断允许位. ) g9 O. m, a. K: T
* n( h7 e: v$ {( ]7 Z# M
六、伪指令 : I' Q4 R$ A% S! q
───────────────────────────────────────
# J( s* y r5 Q1 ZDW 定义字(2字节). : D, T+ X9 j% v, S* j. |5 [
PROC 定义过程. 8 g& F, B' H" l# n* Q
ENDP 过程结束. $ B: W9 R' |7 R3 \( r& n
SEGMENT 定义段.
2 _7 V5 W9 p/ X1 m8 ZASSUME 建立段寄存器寻址.
0 Q8 `# d8 e3 B& a$ |1 OENDS 段结束. ' ?+ M# p0 Y/ M. i
END 程序结束.
/ G, @7 l2 d* s5 {
2 q3 r' L( E4 W* H i8 e8 [1 H: z( A2 s4 L9 O: I
5 m0 G2 ~3 g6 }$ i
本人的一点建议 做免杀一定要会脱壳 虽然不要求你能脱掉所有的壳 但是一般的壳一定要会 北斗还是很好脱的. 不然如果不会脱壳 不把程序的壳脱掉 免杀就好比是空中楼阁的