常见修改特征码个人总结(原著:风尘)

来源:互联网 发布:linux matlab 2016b 编辑:程序博客网 时间:2024/05/01 19:33

常见修改特征码总结
) h8 h' C1 x! C& F8 z, X$ b- ^* L# m2 j6 x' e9 B
分类:- Z9 S, v4 A( M3 U
等价替换、通用跳转、指令顺序调换、NOP位移法、大小写替换、特征码十六进制加减1、NOP、填0、以及特殊常见指令的修改方法
, l5 b' o7 Y7 r8 B9 F. d" k  |4 G% k7 u9 e" T1 D/ f& X4 A3 a
等价替换:(需要注意特别是在等价替换这些跳转的时候 往往会使某些功能无法正常使用.)
' T  p  s3 w. `, W8 h修改方法:JMP = JE JNE JNZ = JMP  je改成jle ja/jle JB = JL  ADD EAX,-1 = SUB EAX,1
+ E9 ]' b. |' {" /3 p# ZSAL 逻辑左移  = SHL 算数左移 他们功能用法是一样的. 等一些等价的指令* S0 T+ U- r- L/ t! G4 R( Q  @
适用范围:把特征码所对应的汇编指令命令中替换成类拟相同的指令/ ^% e# s/ P8 ^" i

7 Q' M( ?5 a- d8 M- j
3 Z( v( R* N5 G; }- z( b9 R通用跳转法:% M- e4 g9 ?+ @% /+ ~9 q  p
修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行.$ n, z8 U  B: g. n) E
(可以换成push xxxx retn)
  c( p0 g% l; [适用范围:是通用的改法,强烈建议大家要掌握这种改法.(但此方法也不是万能哦)9 `2 O) O& P! v( B1 U  `
  C3 V1 g. I) g: t4 C9 g3 P
, /: }4 q, D* r+ C: |1 n
指令上下调换法:(注意调换的时候 先分析是否会对寄存器上的某些值产生影响)$ F" ?$ }5 F9 b$ l6 v& w5 H  }9 B
修改方法:把具有特征码的代码顺序互换一下.
# _3 K4 ^$ u8 U5 @: L适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行
$ m/ l+ r& l9 O) {1 W( n
5 C5 h: f- @# `$ Q5 A! /, I
# z. C! }3 S( @$ K& E修改字符串大小写法:% d4 Q- Z" K; ?: p0 y/ I! B
修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了.
3 [* T3 b( {4 T* ^适用范围:特征码所对应的内容必需是字符串,否则不能成功.(注意:函数不能用这种方法)
1 K  E/ H6 Y. K6 F$ V) O% }9 d( o% L7 E7 C
直接修改特征码的十六进制法(特征码十六进制加减1、nop)9 J5 R9 G+ W, t& m$ D
修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制、或者填充90(nop)或者填0( T& s: O& V. u
适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能否正常使用.
6 s& y+ f8 w* }. S8 _) E& d2 ~. ^; i9 G+ h& o

( r8 g! @- K; _* }test eax, eax
/ g+ ]" M+ Z0 G6 x( E: /很多程序都是用test eax, eax来做检测返回值是否为0,那么遇到test eax, eax 那么可以直接改or eax, eax  或者尝试改成 and eax, eax0 u, n- w8 M0 w" s, O8 m

* c6 o+ @3 I# h- U* s
* E( Q6 E  |) F0 ~xor eax, eax 异或后 eax为0
( O# ^4 l  f! V可以写成 mov eax, 0 mov直接传输 eax为0
3 g/ r2 J0 t& I1 u( @4 H; ?3 `% ~3 X$ O& g
call改法; G: x& B! j% o4 w0 E' M+ w0 d
例子:call 11111111& Z  ]5 r# S% r7 T2 H3 u5 `
改成  call 22222222 (22222222地址为0区域)
  a) _9 A8 C; U: h4 n6 Z. K7 y& r2222222 处 jmp  11111111% `* M( A" I$ |# l: V7 h
; j0 H2 [0 {8 x. t* B7 H; j$ k2 _

' E9 M, z: B: A如果遇到特征码杀在jmp 0040000上,
! }8 e- m9 w2 M/ m' |5 _8 J/ s" q4 m- N
如果字节够支持的话可以改写成双跳转 1 J) U# o1 q2 c# c) p$ R; d+ V8 I. ]
7 Y+ i+ Y. B/ I6 ?4 U
je 0040000 jnz 0040000" z8 Q: J5 f' h/ p2 Z8 Q  k! g
jb 0040000 jlb 0040000/ b# u' ^: g$ a( r7 z: h

5 D% g3 ?; T: f, r或前面说的
$ E5 c0 ^# y( U- ?& Q' b4 Opush 0040000  K' Y: t5 Y: p4 O0 r0 X) j
retn4 e$ w3 X9 O: g9 }
. R* |# N$ F! Y  x2 |
你完全可以这样来构造。 这样免杀效果比较好..但需要有一定的0区域支持
: w' H: V- y" E! ?
$ b" j# p9 G% C0 ppush ebx
- {. ]# m' U0 X. N% [push 0040000
8 z7 A7 A! {7 |pop  ebx
/ m) G/ n+ D6 A% Djmp  ebx
! r& x+ /( V* o& I# jpop  ebx& w  y( y# p- R4 t# O4 }+ B- Z

9 k9 Y! p, J  d  X2 C% @包含法(当然这个要有一定的空间来写代码....)
) O+ f8 T: P" [7 C% c5 ?+ P* @
7 f0 y$ V6 v# A" |. d: y6 o1 Y  W7 c) ~) Z7 B
将特征码所处的汇编指令包含在自己的子程序中。然后加上pushad和popad,pushad和poad里随你怎么玩,只要不破坏相应内存单元的数据就可以,寄存器可以任意破坏。因为popad出栽的时候就有还原了.9 U7 l0 v) S, X

  p+ /; {, l( |  ! C+ m9 {! ~! f- A+ H5 }( H: Z
pushad
) o, N' D5 v; /
+ m+ b# W# n2 m4 [" S   popad# p- M, k$ m& Z% w9 a5 C
特征码
5 z8 K* S2 c8 Y' d8 ]   ret
7 ?7 Q5 w6 X! F6 r* D1 |% I+ |. w8 S8 q0 Q5 i- |3 W0 ]
填补法(我瞎取的 嘿嘿 我自己非常喜欢的一种方法 今天透露给大家了 在改壳免杀我已经说过此方法了)8 l6 Q6 /3 o) X& i
这个是在学破解手动写patch 经常要用到的.来改数据的.
+ T) L. t5 ~. K* b' U$ F( S% r3 N2 [1 E
比如 特征码位置 004CD4D2    47   就是004CD4D2 的位置他的字节是47 我们直接填充.
2 {' {! g0 E* p. M! D0 n0 |' k; ^1 Q8 d+ L
在004CD4D2 代码执行之前我们必须把他恢复 加上这样一句话
$ H; v* Y; V- s/ Y8 b! bmov byte ptr ds:[004CD4D2],47
6 k0 s" C# `8 y- S- z4 Q: G4 h; o; P9 d1 f
多字节就采用这样的形式 mov dword ptr ds:[004CD4D2],4748 大家自己慢慢研究吧
- P  g9 U1 {% u6 G2 L+ ~( p9 W
  Z1 M) M8 @3 w( Z8 R" y3 Z& H: T; v  P3 H" X" b0 l$ C
总结一句:方法是死的 思路转变 懂得在实战中举一反三

原创粉丝点击