sa c ls e t r 2 ts. n tn e ca sts. m e t Fo
_
My o set . PoetgtF r s F r sMyMy r c: e o 0 m t . j : _ m
1 O : c lvr 】 o1 L 8 al it
定位 出关键代码 ,
程序也就破解 了一半 ,但如果 算法 比较复杂,尤其是经过流程混淆的程序 ,利用静 态分析程序 的流程就 比较 困难 ,此 时就需要用动态调 试。动态调试主要 是跟踪数据值 的变化 ,跟踪控制流 程等 。利用 调试工具对关键代码下断点 ,如果
注册密 码的 明码完整地 出现在 内存 中,则可 以直接查看 。图 3 是利用 P bo e b erws g查看本例 中寄存器 E X时所得 D D
到的信息。
+0 x015 l7 A 4 8 6 0 6 0 h. 8 0 S 0 e. +20
My Po cMy o sg t om 0 . r et F r : e F r 2 My j / m : _
l: d cl i al r vt isa cv i 【y tm. n tn e od S s e
Wid ws o sS s m. n o .o sC nrlS o n o . r ]y t Wid ws r .o t : h w Fm e Fm o:
( 密码正确调用 S o ) ’ h w方法显示 F r om2
I L
_
0 2 : b. 卫_ 0 f ’ 02 r S Lo 2 跳转到
标号 I 0 f L O 2
Wid ws no .
刀- 0 4 ls ” r ” ’ L0 2 : dt s r 密码错误提示信息 r oy
ⅡJ 9 cl au tp 【y tm. ∞2 : al l ey e S s v e
F r sS se W id ws oms ao Reut y tm. i o ]y tm. n o . r . lg sl S s W m F Di [ e n o .o sS s m. n o .o sMesg B x:h d ws r ]y t Wid ws r . sa e o : o Fm e Fm S
+0 x01S 8A8 17
6C 0 6 00 0 C
1. . +24 1
0 x0l5 8AC 6F 0 O 0 o ... +2 17 0 0 0 8
w(r g ’ si ) 调用 S o tn h w方法显示密码错误对话框
I 02: pp L 0e o
_
图 3 用 P bo sD g查看注册密码 erw e b
23代码修改 .
I 0 f rt L O 2 e i
。 回 返
、|e do to oml:utn _ ik | n f hd F r : t l Cl me B o c
代码修改是另一种 常见的软件破解 技术 。以 “ 确
定 ”按钮为例,打开反编译后的 m 文件,让程序跳过
密码验证程序 , 一种破解方式是修 改粗体部份 I 0 1 L 0 1
不让 bfl .跳转 。根据堆栈平衡 原则,修改为 P P r sS ae O 或 NO ,再编译回 ee文件 ,则可成功破解登录。此 P x
3 代码保护技术
代码 保护技术主要用 于增 强软件被反编译破解 的 难度,给程序签 署强名称 、代码混淆 、加壳等是几种 重要的代码保护方法。尤其 是经过混淆 的代码在反编 译后 ,程序间的交叉引用会异 常复杂 ;变量名 、类名 等数据会更加难 以辨认 。 31强名称 .
时不 管用户输入什么 内容,程序 都会进 入到第 二个 窗 体中。 以下为 B t n_ l k事件的 几 代码 : ut lCi o c
.
meh d p i t i sa c v i t o rvae n tn e od
Bu tn1 t o
一
强名称是. t提供 的一种验证机制 ,主 要用 于标 n e
Ci ( jcsne, lko eted r c b
cas【 c r b S s m.v nAr s ) ima a e ls msol ] y t E e t g cl n g d i e e
识版本和标识原作者。利用强 名称可 以帮助用户检验
自己的程序是否为原作者所写 ,而没有被人恶 意修改 过代码。在 S DK中利用 s n命令可
生成相应 的密匙文 4 03) 8(x 0
’ 可容纳数据项 的最大个数
{
, 代码大小 /
.
件 ,给程序签署强名称后会在 m nf t ai s 中出现两 条关 e
键语句:.u lk y和.aha o t P bi e c H s g rh l i m。此 时修改 几 代 码 ,便会提示 “ t n a ad t nf l ”强名称 Sr gnmev ia o i d o l i ae
验证失败 。
mas c8 xt k a
_
I L
_
O 0 : la . ’ 0 0 dr 0 在堆栈 中载入参数 g
I 0 01 l ag. L