• 标 题:用OllyDBg动态破解入门 (3千字)
  • 作 者:Freeplayer
  • 时 间:2001-11-13 16:46:10
  • 链 接:http://bbs.pediy.com

第二篇作品 , 今次不用暴破 , 要找到真正注册码
工具: 不用 SoftICE , 不用 W32dasm , 只用OllyDBg , 对 ! 只用它 :-)
目标:http://person.longcity.net/home3/fpxfpx/idcrackme2.zip
这个 crackme 要输入名字 , 组织和注册码叁个资料 , 不正确则按 "Check"不能激活 "Get'done'listed" 按钮
.
.
运行 OllyDBg , File > Open , 选 idcrkme20.exe
在默认状态下 , 放大 OllyDBg , 分为四部份,
上 , 下 , 左 , 右 四个状态窗
现在右击左上角的窗口 , 出现选项 , 选 "Search for > Name (label)"
一个名为 "Names in IDCRKME2" 的窗口出现 , 在里面找寻 "USER32.GetDlgItemTextA"
选中後 (会有颜色 highlight) , 按 "Enter"键 , 出现一个名叫"References in IDCRKME2"的窗口,
右击窗口 , 选 "Set breakpoint on every command" , 你会见到"红色"的地址
(这个等如你在Sice中的 bpx GetDlgitemTextA,有谁知道怎下 bpx hmemcpy 吗 ?)
回到主视窗 , 选 Debug > run (热键是F9) , CrackMe 2.0 程序出现 ,
我填上 Name:Freeplayer  Group:Free  Code:87654321 , 按 "Check" ,
左上角程序颢示停在 0040140B GetDlgItemTextA , 按F2 取消breakpoint , 按 F9 , 第二拦在 00401496 , 按F2 取消breakpoint , 按 F9 , 叁拦在 00401A3B (这是最後一次调用 GetDlgItemTextA, 因为输入处有叁个地方填资料) , 按F2 取消breakpoint , 按 F7 ,
看一下 , 是 GetDlgItemTextA ASCII "87654321" ,多方便 , 连 "D" 都不用就知是什麽 :)

F7 至 00401A46 Call idcrkme2.00402970 <-- F7 入这 call
.
.
00402972  |. 8B7424 0C      MOV ESI,DWORD PTR SS:[ESP+C]            ;  IDCRKME2.00409790 <-- 将我的序列号放进 ESI , 不用猜 , 看一下左上角和左下角中间的地方是 : Stack SS:[0064F904]=00409790 (IDCRKME2,00409790), ASCII "87654321"
ESI=00000AF0
F7 一次 , 看右上角 register 状态 :ESI 00409790 ASCII "87654321" , 酷吧 , 很多东西都一目了然 :-)
.
.
.
一轮运算後 , F7 至 00401A4E , 看一下 EAX , EAX 05397FB1 <-- 是什麽 ? 将 87654321 转成 HEX value :-)
.
.
F7 至 00401A5B Call IDCRKME2. 00401290 <-- 入这 Call , 里面是将我输入的放进内存
.
.
F7 至 004012BA Call IDCRKME2. 00401520 <-- 入这 Call ,
.
.
00401531  CMP ECX,7FFFFFFF  <-- ECX 是 02625C9F , 比较两值
00401537  PUSH EDI
00401538  JBE SHORT IDCRKME2. 00401540    <-- 小于或相等跳
-00401540 MOV DWORD PTR DS:[409770],ECX
00401546  CMP DWORD PTR DS:[409788],ECX    <-- 再用 ECX 值作比较 , 真可疑
0040154C  JNZ SHORT IDCRKME2.004015B1      <-- 不相等 , 所以会跳 (你会见到 , 再下两行是"REGISTERED!"字串)
.
.
若上面不跳的话 , 会怎样呢 ? 是否就会 "REGISTERED!" ?
想一下 , 程序将02625C9F 作比较 , 是否注册码 ?
输入2625C9F作为 code , 倒 ! 不对
呵呵 , 但我一想 , 它要将我的 十进位转做 十六进位 , 那我可将它的十六进位转回十进位啊 ,
好 ! 2625C9F hex 是 40000671 dec , 再试 , 按"Check" ,  哗哈哈 (是内地的出名饮料 , 我爱喝 :-))
Congratulations !

整理:
Name:Freeplayer 
Group:Free 
Code:40000671

** 我为什麽会选用 OllyDBg ? 因为它有很多好处 (我觉得 :-P )
1, 用 Sice 的话 , 中断多几次之後 , 我的 internet connection 会断 , 好多时我要连线干活 , Sice 就总爱断我连线 ...
2, GUI 介面 , 不再死气沉沉
3, 很多资料都不用再 "d" 或者 "?" 就会显示 , 尤其是 ASCII string
4, 最方面是可以程序与程序间来回 , 不受限制 , 我可以一边看 tuts , 一边动态追踪 , 不明白再回到 tuts 看 , 看完再到程序处 trace , 酷 :-)

再补充关於 OllyDBg 的四个区域含意 :
左上角为主程序运行过程内码
右上角为 Register 资料
左下角为内存资料
右下角为入栈出栈资料

其实我写这篇的目的是因为好像找不到一篇"仿" Sice 般用OllyDBg动态追踪的破文
平常在 Sice 的过程 , 怎样用在 OllyDBg 呢 ?
OllyDBg 又怎样可以像 Sice 般动态追踪呢 ?
我尝试用最详细的方法显示整个过程和要注意的地方 , 令不熟悉 OllyDBg 运作的朋友也能有个入门,
希望可以因此文而令多些高手出手 , 那就最好了 !

Toye 大哥 , 值得放在精华区吧 :-P

在此谢谢: WinDos2k , Fpc , Hume , 云观(Half) 和 论坛上的朋友 , 他们一直在 Cracking 上给了我很多宝贵意见 ! :-)

转贴请不要修改任何内容 , 保持完整性 , 谢谢 !!

作者: Freeplayer
写於: 2001年11月13日 4:45 PM