lgjxj 发表于 2006-8-11 21:39:50

完全面向初学者的 破文 ,简单

【破文标题】破解一个老外的 Crackme
【破文作者】lgjxj
【作者邮箱】[email protected]
【作者主页】
【破解工具】OllyDbg 1.1
【破解平台】Windows xp SP2
【软件名称】crackme_5.exe
【软件大小】
【原版下载】
【保护方式】UPX 0.89.6 - 1.02 / 1.05
【软件简介】这个 Crackme 是由一个老外网页合集中下的,强度 弱   壳也很弱

------------------------------------------------------------------------
这个壳手脱比用脱壳机还快,但想到新手开始不要分心的话,可以用脱壳机,脱壳后 OD 载入,大家如果学过一些
简单的破解(初学),应该知道要搜索字符串的,不过这个 Crackme,你会失望,没有有用的,不过这里我可以教大家
一个简单的方法。载入后,F9 运行,输入用户名和注册码后在插件里找到 ApiBreak 这个插件,点击-算中 万能断点
把里面的勾上后,从新在任务栏提出 Crackme ,点 check 中断。Alt+F9 返回 ,一般的软件和 Crackme 只要按 F8
几下就能找到关键的地方了,可是这个 XXX 妈的,按了我一分钟才到算法点,晕。(上面的方法对付一般的 Crackme都有效)来到下面


00450482|.C645 FF 01    MOV BYTE PTR SS:,1               ; 这里下断

00450486|>33C0          /XOR EAX,EAX                           ;每轮首先清空 EAX
00450488|.8A45 FF       |MOV AL,BYTE PTR SS:
0045048B|.8B55 F8       |MOV EDX,DWORD PTR SS:
0045048E|.0FB64402 FF   |MOVZX EAX,BYTE PTR DS:       ;每个字符入EAX
00450493|.03D8          |ADD EBX,EAX                           ;bx+ax bx 初始值为 0
00450495|.8BC3          |MOV EAX,EBX
00450497|.25 01000080   |AND EAX,80000001                        ;与固定数值 2147483649 作与运算
0045049C|.79 05         |JNS SHORT 1.004504A3
0045049E|.48            |DEC EAX
0045049F|.83C8 FE       |OR EAX,FFFFFFFE
004504A2|.40            |INC EAX
004504A3|>F7EB          |IMUL EBX                              ;把 ax 的结果和 bx 相乘
004504A5|.03D8          |ADD EBX,EAX                           ;把结果和 bx 相加
004504A7|.8BC3          |MOV EAX,EBX                           ;又回传给 ax
004504A9|.B9 05000000   |MOV ECX,5                               ;固定数值 5 传 cx
004504AE|.99            |CDQ
004504AF|.F7F9          |IDIV ECX                              ;用 AX 除以 5,DX 存高位数,ax 存底位数值
004504B1|.03DA          |ADD EBX,EDX                           ;bx + dx
004504B3|.8BC3          |MOV EAX,EBX
004504B5|.25 07000080   |AND EAX,80000007                        ;ax 命苦啊,又和固定数值 2147483655 作与运算
004504BA|.79 05         |JNS SHORT 1.004504C1
004504BC|.48            |DEC EAX
004504BD|.83C8 F8       |OR EAX,FFFFFFF8
004504C0|.40            |INC EAX
004504C1|>03D8          |ADD EBX,EAX                           ;bx+ax (bx 命好,得收成果)
004504C3|.03DE          |ADD EBX,ESI                           ;si 初始值为一
004504C5|.8B45 F8       |MOV EAX,DWORD PTR SS:            ;用户名入 AX
004504C8|.E8 1340FBFF   |CALL 1.004044E0                         ;这个 CALL 的用处是得到用户名的长度
004504CD|.8B55 F8       |MOV EDX,DWORD PTR SS:            ;用户名入 EDX
004504D0|.0FB64402 FF   |MOVZX EAX,BYTE PTR DS:       ;最后一个字符入 EAX
004504D5|.8BD3          |MOV EDX,EBX                           ;把上面一轮结果入 EDX
004504D7|.C1E2 02       |SHL EDX,2                               ;DX * 4
004504DA|.03C2          |ADD EAX,EDX                           ;AX + DX
004504DC|.8BD8          |MOV EBX,EAX                           ;都说 BX 命好,又收结果
004504DE|.C1EB 02       |SHR EBX,2                               ;bx / 4
004504E1|.C1EB 02       |SHR EBX,2                               ;bx / 4
004504E4|.33DE          |XOR EBX,ESI
004504E6|.33DE          |XOR EBX,ESI
004504E8|.0FAFDE      |IMUL EBX,ESI
004504EB|.8BF3          |MOV ESI,EBX                           ;原来最好命的是 ESI
004504ED|.FE45 FF       |INC BYTE PTR SS:
004504F0|.FE4D F3       |DEC BYTE PTR SS:
004504F3|.^ 75 91         \JNZ SHORT 1.00450486

上面这里是一个循环,你输入的用户名有多小个字符就循环几次,下面的 CALL 的分析就不写了,累

004504F5|>8D55 E0       LEA EDX,DWORD PTR SS:
004504F8|.8B87 04030000 MOV EAX,DWORD PTR DS:
004504FE|.E8 8DEEFDFF   CALL 1.0042F390
00450503|.8B45 E0       MOV EAX,DWORD PTR SS:
00450506|.50            PUSH EAX
00450507|.8D45 DC       LEA EAX,DWORD PTR SS:
0045050A|.50            PUSH EAX
0045050B|.8D55 D8       LEA EDX,DWORD PTR SS:
0045050E|.8BC6          MOV EAX,ESI
00450510|.E8 B37DFBFF   CALL 1.004082C8
00450515|.8B45 D8       MOV EAX,DWORD PTR SS:            ;输入用户名 lgjxj 经上面计算后结果 -640106896
00450518|.E8 C33FFBFF   CALL 1.004044E0
0045051D|.83E8 02       SUB EAX,2
00450520|.50            PUSH EAX
00450521|.8D55 D4       LEA EDX,DWORD PTR SS:
00450524|.8BC6          MOV EAX,ESI
00450526|.E8 9D7DFBFF   CALL 1.004082C8                        ;
0045052B|.8B45 D4       MOV EAX,DWORD PTR SS:
0045052E|.BA 03000000   MOV EDX,3
00450533|.59            POP ECX                                  ;CX=8
00450534|.E8 FF41FBFF   CALL 1.00404738                        ;这个 CALL 是用来出去上面结果的前两位数
00450539|.8B55 DC       MOV EDX,DWORD PTR SS:            ;结果



------------------------------------------------------------------------
这个 crackme 就是把用户名经计算后的结果,去除前两位,如 我的用户名 lgjxj 得到 -640106896
那么就去除了 -6 ,注册码就是 40106896,很简单的

很多新手都说看不懂算法,其实你要多留意寄存器的变化,基本的汇编语言很容易学的,我中学毕业就没读书了
现在一间五星酒店任西饼房主管,30多岁的人了,几个月前那起本汇编语言(王爽的那本),三个月就读完了,当然还不能完全理解,但我告诉大家,破解不需要全部的汇编语言,全会当然好
以前也自学过 C 语言,相信没有什么东西是学不会的,只是没那些大虾厉害,写教程比破解这个 Crackme还累
------------------------------------------------------------------------
【版权声明】随意转载,收藏 ,请注明出处

lgjxj 发表于 2006-8-12 00:25:55

斑竹不要笑我了

杜杜哎哟 发表于 2006-8-12 16:27:37

偶是新手,谢谢楼主的文章!

黑夜彩虹 发表于 2006-8-12 17:52:33

为何不结合静态分析,我是在00450374下的断。。。。

不过你的文章让我学习了万能断点,不错~~:victory:

用户名:vxin

堆栈 ss:=00D859E0, (ASCII "881490687")

lgjxj 发表于 2006-8-12 18:10:24

静态分析

我习惯了,动态追,很小只用静态分析,所以连 IDA 都不会用:$:$

特别 发表于 2006-8-25 23:49:59

文章没有平时看破文时闷哦,写得挺生动的

wbhing 发表于 2006-8-26 00:56:30

值得认真学习~

野猫III 发表于 2006-8-26 10:20:20

学无止境,佩服楼主的学习精神!

加精以示鼓励!咱们菜鸟向您学习啦!

obi-one 发表于 2006-8-26 10:26:25

自此知道了万能断点!

caterpilla 发表于 2006-8-26 12:52:15

先标记下。。。。。。。
页: [1] 2
查看完整版本: 完全面向初学者的 破文 ,简单