免杀修改特征码需要掌握的汇编知识
上一篇 / 下一篇 2007-05-09 03:34:38 / 个人分类:免杀破解
!|OVp({NrM0一.机械码,又称机器码★黑基空间★Tc:[ LF9ymE@v8t
i ^Y+c:b+qyq0Ultraedit打开,编辑exe文件时你会看到许许多多的由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F组成的数码,这些数码就是机器码。修改程序时必须通过修改机器码来修改exe文件。
!Uo5g!roBi r$?.u5w cw0%uG]H+EN0二.需要熟练掌握的全部汇编知识
6A$f ^u pnG1rS0★黑基空间★ow?+y6OR{F不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了。
UM]M#x*Y hA9`/a0★黑基空间★wE3n'D9u7H\+Icmp a,b 比较a与b。
?1Fup8jf0★黑基空间★$O)i4p,ja#N]mov a,b 把b的值送给a。★黑基空间★jYI)I~j
★黑基空间★d+kdbxoFret 返回主程序。
{,O%L/h]m)I0★黑基空间★AQ7@XO/H+g%F\nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面。★黑基空间★7D6K(Ke1Y+]}f:q
,Q3TSBq3sSUH0(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)★黑基空间★&V"? SV,Yf D#w
★黑基空间★?;U6X/K2J-z{vEhcall 调用子程序。
|Y,~ TI,L%dX0K| eqH0je 或jz 若相等则跳(机器码74 或0F84)。★黑基空间★(r[!C"sn
★黑基空间★%II^k*r Tjne或jnz 若不相等则跳(机器码75或0F85)。
K:R0@Bz:wVM0★黑基空间★dP` c-k#H.Hjmp 无条件跳(机器码EB)。★黑基空间★c$H~2c'a] C
★黑基空间★8m[E;Cw0ujb 若小于则跳。★黑基空间★rxUj:uvG
AnW2SZI&B9r2S0ja 若大于则跳。★黑基空间★;T1VM4kw [#R
}#A@o'y E-N)ma0jg 若大于则跳。
!s"K!{lQ-l00L?;F;P;pL#[0jge 若大于等于则跳。★黑基空间★ ~%QV6xI*nY
★黑基空间★2W y [3Bi"l0L)l xw$kjl 若小于则跳。★黑基空间★SP(sb2}"D%z
/I?b#[g0jle 若小于等于则跳。
E7[Q+\B@+q[0'G$b8i9U1{b;w[ }?\0pop 出栈。★黑基空间★3q~Q:B6?(ll
★黑基空间★6S1Tj(H0X5M({!UOPpush 压栈。
B-Og7LX0★黑基空间★a)E#we2a三.常见修改(机器码)★黑基空间★(wi$dE{}c
★黑基空间★"I-o:mPtL+h}&O★黑基空间★mbZr`*S
74=>75 74=>90 74=>EB★黑基空间★:j#W xG5H
75=>74 75=>90 75=>EB★黑基空间★;{9uO%S#E[~(_D
S@o6E+c(v0jnz->nop★黑基空间★'\PKN*@BpI9A
75->90(相应的机器码修改)
jnz -> jmp★黑基空间★0]T}o ?z$?m'm{j t
75 -> EB(相应的机器码修改)
jnz -> jz★黑基空间★ze9L#N F(}z+XF
75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)
b%k1w5lQj0
|`*_`!?!yr`0四.两种不同情况的不同修改方法
1?Wf,I4o;r0({ OV8ns01.修改为Jmp★黑基空间★]G f'V7S T T+q)q*e}v
n9l_$}$bH/Q [0je(jne,jz,jnz) =>jmp相应的机器码EB(出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息:★黑基空间★0y1pu{9~:f C
,I,o/E1w mQrXG+h0
1v,e#U:G,V"?@0xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不★黑基空间★sI I _a~E
能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in★黑基空间★4[V'}@Lh
Shareware/Demo"等 (我们希望把它跳过,不让它出现)★黑基空间★\(|xr/z4c
...
*C3ZRnik0O0...★黑基空间★8iZLU*\qJ9s#P
xxxxxxxxxxxx 正确路线所在★黑基空间★,Aw8_ z&sW
★黑基空间★1ajrx*Jn kl
B2HT%t+K02.修改为Nop
$TZ!HlBE T#U#H@ l0★黑基空间★o2ne4N0v| Yeje(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处:★黑基空间★F&@K7T X8U:h+W6s%t
★黑基空间★LoG(q2N7w'Hv★黑基空间★M0Hv6Kb0AA2F
xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳★黑基空间★9pBw2sl)|
过,让它出现,程序一定要顺利来到这里)
_)o1v+fV0...
["r8E2s]'t4R,I0...★黑基空间★@2~5Ua(d%O
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)它们在存贮器和寄存器、寄存器和输入★黑基空间★*qD!j4j.M1{1b3J"m
输出端口之间传送数据。
N5Wb}&[$~wE)V1S#{0 ★黑基空间★7v-nuN,f4ut1V%g,G.^a
1. 通用数据传送指令
;G;^3|MQb1j:W0★黑基空间★yzc!y-mv2MMOV 传送字或字节。
+D&X%R9v'}p0$Y*ER9g Y${/?E0MOVSX 先符号扩展,再传送。★黑基空间★3~y-e5LDs@
★黑基空间★C9o NG+{MOVZX 先零扩展,再传送。★黑基空间★R7Y`#GC1T(i
★黑基空间★,c(?FB.]LPUSH 把字压入堆栈。★黑基空间★2AN%[z Z+Rr!Ep
%B kj1x cI&?y;~p0POP 把字弹出堆栈。
[%f[6E&}Wkm$k0\,k#_ t)pg8@2i.U B0PUSHA 把AX、CX、DX、BX、SP、BP、SI、DI依次压入堆栈。★黑基空间★)YT]C"t,@o
★黑基空间★ ssg hZ&vs uPOPA 把DI、SI、BP、SP、BX、DX、CX、AX依次弹出堆栈。★黑基空间★ `N:C@`F.[9z2h
★黑基空间★dv*s8l+Gwl'iPUSHAD 把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI依次压入堆栈。★黑基空间★4R"mr7EII
c}3d q3u9n$~;| g6o0POPAD 把EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX依次弹出堆栈。
%c3\WN5q"aJB r0★黑基空间★'[0I(A0oeBSWAP 交换32位寄存器里字节的顺序。
9S wqu~2R0Jj&E2w?0XCHG 交换字或字节( 至少有一个操作数为寄存器、段寄存器不可作为操作数)。
rJ2|7WH'i K0#?oh8B(B7g?0CMPXCHG 比较并交换操作数(第二个操作数必须为累加器AL/AX/EAX)。★黑基空间★Y'Q'R%|Ak
★黑基空间★5u*N1GG X%s!J-dSW/zXADD 先交换再累加(结果在第一个操作数里)。
?9s;s7F5M0U l/X/RPe]0XLAT 字节查表转换。★黑基空间★"PSd-e b@KA
★黑基空间★C@(R j.t8Q── BX 指向一张 256 字节的表的起点,AL为表的索引值(0-255,即0-FFH); 返回AL为查表结果。([BX+AL]->AL)
k6^:}:l8hX3@e\0fq @'I+s.ZcW"U02. 输入输出端口传送指令
u8CWm)f0★黑基空间★+U/_3`6]6dYIN I/O端口输入。(语法:IN 累加器, {端口号│DX})★黑基空间★8r:RRG tB
G"R7~0Z*T#}0OUT I/O端口输出。(语法:OUT {端口号│DX},累加器)★黑基空间★M(D J fz
★黑基空间★G5c6my@0S输入输出端口由立即方式指定时,其范围是0-255; 由寄存器DX指定时,其范围是0-65535。
7y/tw cF%gQ{ v%z7F0H-a Q?7v6rE)H03. 目的地址传送指令★黑基空间★h9IcITf'[$w
★黑基空间★0q;^1l!tgLEA 装入有效地址。★黑基空间★ A k1Nvvx+y!I6c
p0H8Ne|$q0例: LEA DX,string;把偏移地址存到DX。★黑基空间★_1teyA;i
HC.euFuU,uM0LDS 传送目标指针,把指针内容装入DS。
p3|*B,g1tp0P&n"DjF0例: LDS SI,string;把段地址:偏移地址存到DS:SI。★黑基空间★TSR^9UN td;w
★黑基空间★-Kt'y;LiLES 传送目标指针,把指针内容装入ES。★黑基空间★ZU~pKJ@ }P?
7iA(W%B"U0例: LES DI,string;把段地址:偏移地址存到ESI。★黑基空间★C'{Qj9G \-E#t1R
gI}}p wS,n9~ya0LFS 传送目标指针,把指针内容装入FS。
3nA^UOLd@t0★黑基空间★:{s%d+c:t%A例: LFS DI,string;把段地址:偏移地址存到FSI。
5H2Z1`(N4d U"P0★黑基空间★1j7n/l:O'~{?%yLGS 传送目标指针,把指针内容装入GS。
b*RV X9|4J!r} K z07U9A;s6c%qP0例: LGS DI,string;把段地址:偏移地址存到GSI。★黑基空间★'VUC#d^jXI
★黑基空间★#udFL'n5q/J]LSS 传送目标指针,把指针内容装入SS。
$U$GO-V'Kf*gXi&q0★黑基空间★c4]F'H\z}f E3v例: LSS DI,string;把段地址:偏移地址存到SSI。
6o4M^g6s%|*q%O0n+P[2I7F6D04. 标志传送指令★黑基空间★1R#n&W#sy
★黑基空间★9NOA\&Hg9ia&DLAHF 标志寄存器传送,把标志装入AH。★黑基空间★ h2f h\d1t
9yU \g\k0SAHF 标志寄存器传送,把AH内容装入标志寄存器。★黑基空间★c0c4LTD.~c4G/K|
★黑基空间★V#{*@!B:H`,] On9DPUSHF 标志入栈。
c)c e8vY#IgGk0B-W9MRqz0POPF 标志出栈。★黑基空间★+H0[#Q pnR$D
Z@!p1B'W0PUSHD 32位标志入栈。
9}z4Y-b(uB0TNhqe;Ii0POPD 32位标志出栈。
.f*pWk*|!F?P)M(F08g1qe#\7k0二、算术运算指令★黑基空间★*oZ wv~A,a|
s CeIk0gz-j0ADD 加法。
l%Dms[nI9yS07^ k^1eeI'o0ADC 带进位加法。★黑基空间★2nTZMaoaZ2K
★黑基空间★@4o1G9[-X5@ y\+e vINC 加 1。★黑基空间★gjP5j~nl F
8V7X;i W:^uB0AAA 加法的ASCII码调整。
_ L kJ*BZc0B^-C+Po0Fu[8`{0DAA 加法的十进制调整。★黑基空间★8I5S3`"U:Xj"o_
★黑基空间★e3h9|o l&o3~B_SUB 减法。
"TFDLk?MU}0★黑基空间★4M}9D H'YY8TSBB 带借位减法。★黑基空间★(f4i-F {7uv IJ
★黑基空间★:D1n6yG)fv}DEC 减 1。★黑基空间★ lbqNTJ6_!E
★黑基空间★8n9Y0b0A4o;yNEC 求反(以0减之)。★黑基空间★q[@s;C4qi,q
`$ee,R_)P0CMP 比较。(两操作数作减法,仅修改标志位,不回送结果)。
i$mYE!Vr02h;E]|f u$`0AAS 减法的ASCII码调整。
4`9ZH7i}]:qeR0★黑基空间★z~J;`5u7mnW%[DAS 减法的十进制调整。
4kxG.I;K)hc0PXHe+u ]Ro/@}7UU0MUL 无符号乘法。
8Ci*Zk"nh/V0★黑基空间★o1Lh;HZ&nL*dIMUL 整数乘法。★黑基空间★+J;lS%^ l,Ai
★黑基空间★-v Q8B8Tw)l(Y以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),★黑基空间★3k~)T3I$xt3F Io
-bet&[6xY*X2Q0AAM 乘法的ASCII码调整。★黑基空间★L,Sz%YFDF
6F&PU4RMSG0DIV 无符号除法。
j8oc[ ?,]0★黑基空间★ Y1BA UXs.@JzdIDIV 整数除法。
*phG c[-kM.qP0b2HDii#t)b)w0以上两条,结果回送:★黑基空间★(o&u$V0k.~~ac"b~a~~
7~ Uj2xG0商回送AL,余数回送AH,(字节运算);
{7U H*Q/GL [;W0kA0;E!Vb@Y?j0或 商回送AX,余数回送DX,(字运算)。
Zxjf k4s Rop0HV,V5Bju0AAD 除法的ASCII码调整。★黑基空间★2O8SD%R O[
6z`d$Y$}TOma0CBW 字节转换为字。(把AL中字节的符号扩展到AH中去)★黑基空间★ Fw@F\i%q
★黑基空间★5T8xe8ZvAi D2SCWD 字转换为双字。(把AX中的字的符号扩展到DX中去)
p7TM,uD$h6}T3W6u0xD;J p1m"u%_I0CWDE 字转换为双字。(把AX中的字符号扩展到EAX中去)
}5F:ahi8a+O.BY0d+N k'{%RnDl0a0CDQ 双字扩展。(把EAX中的字的符号扩展到EDX中去)
a4c E@@NN0★黑基空间★9Y&fU i8~6@ k^三、逻辑运算指令
RB y%`LR#cN L0★黑基空间★{/Ri Yu0t:X!`AND 与运算。
8kkC.|B:T0★黑基空间★Je'_dCSE#`~OR 或运算。★黑基空间★5a*o+|X'h \e;J
★黑基空间★2qZ/t'C,g5o7J-jXOR 异或运算。★黑基空间★P*C?Iw^C
R7~W]LP5`M#h$Y0NOT 取反。★黑基空间★ N*Fk_9@L
in-w.}}0]cfh0TEST 测试。(两操作数作与运算,仅修改标志位,不回送结果)。
Elk.{8W0★黑基空间★'rizv\:V\G.D(l`SHL 逻辑左移。
)T^2LEtBnHH2y~ j02U.G S/oXfV0SAL 算术左移。(=SHL)
7s6[P9Z,M4{R[l0`eN3f(K _D`BHa0SHR 逻辑右移。
6tR)j V.O5? \04QcE4|;P(wH%Y#l5d0SAR 算术右移。(=SHR)
7\$q2^.@5R3BO0n.Y?&{?/b0ROL 循环左移。
+A9afLf]0★黑基空间★-rG|*r8hROR 循环右移。★黑基空间★?PF5b5_$y%q
★黑基空间★ZI q0q@.{|ZRCL 通过进位的循环左移。
y4At)LT0z(`4M%{ Q+nz0RCR 通过进位的循环右移。
`+abD:l9DF,@UU-Z?0BS/plm$R.L]0_u T0以上八种移位指令,其移位次数可达255次。★黑基空间★+s(B,ft e/XH `D
!W;U$k"Z"}0移位一次时,可直接用操作码。如 SHL AX,1。★黑基空间★Kc P7rjM4Te
d dw@ b)L*N6j0移位>1次时,则由寄存器CL给出移位次数。
p7zJ4gE V~/{0★黑基空间★;hM$b/yn如 MOV CL,04★黑基空间★j n;pB.Y
★黑基空间★}C W$zy,XlSHL AX,CL
j#b C\@e/?Z0n6v3od7kr0四、串指令★黑基空间★-e3{2ee5x2H2Q(Zx
★黑基空间★-I@s:_#J5vDS:SI 源串段寄存器:源串变址。★黑基空间★*d(zj"\}(D!M
★黑基空间★ i@(xK1^ESI 目标串段寄存器:目标串变址。★黑基空间★#a&K9vp4hS\{H v$]
★黑基空间★/} J`!nq,fTwl)vCX 重复次数计数器。
rd4@}$|7N Y0★黑基空间★U:Jg3cgT1Sv zAL/AX 扫描值。
cE t7D/~ D Q0C6U;Qcl.\X0D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量。
6VK+x1K;tm0★黑基空间★RN C"x~6z S%IZ标志 用来控制扫描或比较操作的结束。★黑基空间★:y;u8f3T4dK/}hL0{n
3Q!KNQ:kN0MOVS 串传送。★黑基空间★-z,U\U(K`fuGSO
★黑基空间★ f-stE,Vo#GN(MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字.)★黑基空间★ m[X,oW
★黑基空间★!`2T Wvnke QCMPS 串比较。★黑基空间★6m%[f I`
)raf9k Yl?J&D0(CMPSB 比较字符. CMPSW 比较字.)★黑基空间★ C'Pp'g*HB7PNjN
★黑基空间★%pu-@&h C;qSCAS 串扫描。
DH@ @ Z yc0★黑基空间★CF^.i#ua&utf$r'V把AL或AX的内容与目标串作比较,比较结果反映在标志位。
9I)QP@8^0★黑基空间★;A%Xb#LY-rcLODS 装入串。★黑基空间★5h-u{"O I.hJ
8Qe/Pt(L9`0把源串中的元素(字或字节)逐一装入AL或AX中。★黑基空间★I9}:|^6KEd9Y
★黑基空间★9Hh.SR-Rpv(LODSB 传送字符. LODSW 传送字. LODSD 传送双字.)
hjCK+uU)Y0;l4Dn_$mYoi8oCs0STOS 保存串。
Iz"|'pI,Q})v0yY_04Aj0U;dGe8_0是LODS的逆过程。
JS|,CJ w._8Vzr0★黑基空间★ G*a&PX?2{v1}Od~w|REP 当CX/ECX<>0时重复。
_9s,RM(]{oUEL&MH0★黑基空间★6L'g8@*`9z)v9j gX.OREPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复。★黑基空间★-d9_X(DV
0ch%y g{ o \!Bul9c2D0REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复。