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

常见修改特征 码总结
) 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# Z SAL 逻辑左移  = 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& d 2 ~. ^; 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& r 2222222 处 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 O push 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 p push ebx
- {. ]# m' U0 X. N% [ push 0040000
8 z7 A7 A! {7 | pop  ebx
/ m) G/ n+ D6 A% D jmp  ebx
! r& x+ /( V* o& I# j pop  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 o 1 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 S 8 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! b mov byte ptr ds:[004CD4D2],47
6 k0 s" C# `8 y- S- z4 Q: G 4 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" y 3 Z& H: T; v  P3 H" X" b0 l$ C
总结一句:方法是死的 思路转变 懂得在实战中举一反三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值