首页
社区
课程
招聘
初入樵新手 crackme 博物馆
发表于: 2005-3-17 14:45 467880

初入樵新手 crackme 博物馆

2005-3-17 14:45
467880
收藏
免费 0
支持
分享
最新回复 (267)
雪    币: 395
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
用W32Dasm查registrortion fail可看到字串
2005-5-27 21:38
0
雪    币: 395
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
yico那个带音乐的你做出来了吗?太难了,字串怎么也找不到啊,“错了”还有一个是“不要灰心,再来”我的QQ是29890872,好想有几个朋友一起玩啊!!!
2005-5-27 21:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
最初由 riijj 发布
没有人回应..


没人支持,偶支持呀!
2005-5-30 17:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
支持啊,感谢为广大菜鸟着想
2005-6-20 16:47
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
30
献给所有爱好破解的初学者的Crackme - by 破解爱好者

网上找到的,可能是写出来给新手练手的吧,我也不知道,简单的出奇!

爆破容易!算法也简单!

献给所有爱好破解的初学者的Crackme.rar
2005-7-17 16:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
是我们新手学习的好文章,非常感谢
2005-7-19 00:40
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
32
破解ncarcakme历程
1. w32dasm打开ncarcakme,反汇编,串式参考,找到错误提示"Registration fail",双击

:00401000 8B4C2408                mov ecx, dword ptr [esp+08]<-------ecx=[ESP+08]=?
:00401004 8BC1                    mov eax, ecx  <-----------------EAX=ECX
:00401006 83E802                  sub eax, 00000002         <----------EAX=EAX-2
:00401009 742E                    je 00401039                 <---------小于跳到00401039,也就ExitProcess
:0040100B 83E80E                  sub eax, 0000000E         <---------eax=eax-14
:0040100E 7419                    je 00401029             <-------小于跳到00401029,既DestroyWindow
:00401010 8B442410                mov eax, dword ptr [esp+10] 〈-----------eax=[esp+10]中的内容=?
:00401014 8B54240C                mov edx, dword ptr [esp+0C]  <-----------edx=[esp+0c]中的内容=?
:00401018 50                      push eax                       〈---------DefWindowProcA的Lparam参数
:00401019 8B442408                mov eax, dword ptr [esp+08]   〈--------eax=[esp+8]
:0040101D 52                      push edx 〈-------------------DefWindowProcA的wparam参数                       
:0040101E 51                      push ecx 〈------------------DefWindowProcA的Msg参数
:0040101F 50                      push eax  〈----------------DefWindowProcA的句柄

* Reference To: USER32.DefWindowProcA, Ord:0084h
                                  |
:00401020 FF15C4404000            Call dword ptr [004040C4]  〈-----------call DefWindowProcA 处理程序位处理的消息
:00401026 C21000                  ret 0010

(*以上应该和破解关系不大哦,看下来一大段应该是对DefWindowProcA的调用而已*)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040100E(C)
|
:00401029 8B4C2404                mov ecx, dword ptr [esp+04]
:0040102D 51                      push ecx

* Reference To: USER32.DestroyWindow, Ord:008Eh
                                  |
:0040102E FF15C8404000            Call dword ptr [004040C8]
:00401034 33C0                    xor eax, eax
:00401036 C21000                  ret 0010

(*依样画葫芦,以上应该是对DestroyWindow的调用哦*)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401009(C)
|
:00401039 6A00                    push 00000000

* Reference To: USER32.PostQuitMessage, Ord:01E0h
                                  |
:0040103B FF15CC404000            Call dword ptr [004040CC]
:00401041 33C0                    xor eax, eax
:00401043 C21000                  ret 0010
(*依样画葫芦,以上应该是对PostQuitMessage的调用哦*)

:00401046 90                      nop
:00401047 90                      nop
:00401048 90                      nop
:00401049 90                      nop
:0040104A 90                      nop
:0040104B 90                      nop
:0040104C 90                      nop
:0040104D 90                      nop
:0040104E 90                      nop
:0040104F 90                      nop
:00401050 817C240811010000        cmp dword ptr [esp+08], 00000111<-----------[esp+08]中的内容和111比较
:00401058 7574                    jne 004010CE        〈----------不等跳到004010CE也就是这句:004010CE 33C0  xor eax, eax
:0040105A 8B44240C                mov eax, dword ptr [esp+0C]〈------eax=[esp+0c]中的内容
:0040105E 663DEA03                cmp ax, 03EA   〈---------------eax的低16位AX和03EA比较
:00401062 7542                    jne 004010A6    〈---------------不等则跳到004010A6,如下褐色部分。
:00401064 E8C7010000              call 00401230   〈---------------这个call不知道干什么
:00401069 85C0                    test eax, eax    〈--------------??是不是上面对上面这个call的返回值的测试呢?,我对test的作用不大熟悉
:0040106B 6A00                    push 00000000    〈--------------这个是MessageBox的一个参数吧?全部是0代表NULL吗?MessageBox的第四个参数好象不是这样的吧;

* Possible StringData Ref from Data Obj ->"ncrackme"
                                  |
:0040106D 6880504000              push 00405080  〈-------------00405080中不知道是什么内容.是上面这个"ncrackme"吗?
:00401072 751B                    jne 0040108F    〈------------跳到下面红色的地方
:00401074 A1B8564000              mov eax, dword ptr [004056B8]
* Possible StringData Ref from Data Obj ->"Registration successful."
                                  |
:00401079 6864504000              push 00405064<-------"Registration successful."
:0040107E 50                      push eax〈-----------这个应该是句柄了哦

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:0040107F FF15C0404000            Call dword ptr [004040C0]〈--------------CALL MessagEBoxA
:00401085 E8A6020000              call 00401330〈-----―――SHIFT F12输入00401330就看到:00401330 C705C056400001000000    mov dword ptr [004056C0], 00000001这一句
:0040108A 33C0                    xor eax, eax
:0040108C C21000                  ret 0010
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401072(C)
|
:0040108F 8B0DB8564000            mov ecx, dword ptr [004056B8]

* Possible StringData Ref from Data Obj ->"Registration fail."
                                  |
:00401095 6850504000              push 00405050<-------双击来到这里//
:0040109A 51                      push ecx
* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
2005-7-21 03:31
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
33
:004010C8 FF15C0404000            Call dword ptr [004040C0]

2.分析完上面的代码,,打开OD,想了想,还是在我不知道做什么的哪个call下断吧,因为附近没发现又到出错或者正确提示的跳转呢~!00401064这里按了F2,F9运行它,输入密码点确定,然后按F7跟进,F8单步跳过,
00401230   /$  8B0D BC564000     mov ecx,dword ptr ds:[4056BC]
00401236   |.  83EC 30           sub esp,30                                        ;  esp=0012fa68-30=0012fa38
00401239   |.  8D4424 00         lea eax,dword ptr ss:[esp]                        ;  eax={(ss;[ebp])=0012fa38}
0040123D   |.  53                push ebx                                          ;  ebx入栈
0040123E   |.  56                push esi                                          ;  esi入栈,esi=00401050(ncrackme.00401050)
0040123F   |.  8B35 94404000     mov esi,dword ptr ds:[<&USER32.GetDlgItemTextA>]  ;  USER32.GetDlgItemTextA
00401245   |.  6A 10             push 10                                           ; /count=10(16)取前面16个字符吗?
00401247   |.  50                push eax                                          ; |Buffer
00401248   |.  68 E8030000       push 3E8                                          ; |ControlID = 3E8 (1000.)
0040124D   |.  51                push ecx                                          ; |hWnd => 003801AA (class='#32770',parent=0029023A)
0040124E   |.  33DB              xor ebx,ebx                                       ; |
00401250   |.  FFD6              call esi                                          ; \GetDlgItemTextA
00401252   |.  83F8 03           cmp eax,3                                         ;  eax=13  13>3(我输入的用户名正好是13位呢)
00401255   |.  73 0B             jnb short ncrackme.00401262                       ;大于等于且(CF=0)跳到ncrackme.00401262
00401257   |.  5E                pop esi
00401258   |.  B8 01000000       mov eax,1
0040125D   |.  5B                pop ebx
0040125E   |.  83C4 30           add esp,30                                        ;恢复堆栈指针
00401261   |.  C3                retn
00401262   |>  A1 BC564000       mov eax,dword ptr ds:[4056BC]                        ;eax=??
00401267   |.  8D5424 28         lea edx,dword ptr ss:[esp+28]                        ;edx=(ss:[ebp+28]=0012fa58有效内容)
0040126B   |.  6A 10             push 10                                        ;
0040126D   |.  52                push edx
0040126E   |.  68 E9030000       push 3E9
00401273   |.  50                push eax
00401274   |.  FFD6              call esi
00401276   |.  0FBE4424 08       movsx eax,byte ptr ss:[esp+8]                     ;  eax=68('h')好象是我输入的第一个字符哦
0040127B   |.  0FBE4C24 09       movsx ecx,byte ptr ss:[esp+9]                     ;  ecx=75('u')好象是我输入的第2个字符哦
00401280   |.  99                cdq                                               ;  cdq是什么指令?
00401281   |.  F7F9              idiv ecx                                          ;  eax=edx:eax/75  edx=edx:eax%75
00401283   |.  8BCA              mov ecx,edx                                       ;  把余数存入ecx ecx=68
00401285   |.  83C8 FF           or eax,FFFFFFFF                                   ;  eax=0
00401288   |.  0FBE5424 0A       movsx edx,byte ptr ss:[esp+A]                     ;  edx=61,啊,ASCII码不就是a吗,我输入的第三个字符
0040128D   |.  0FAFCA            imul ecx,edx                                      ;  啊??难道是ecx=ecx*edx or edx:eax=ecx*eax
00401290   |.  41                inc ecx                                           ;  ecx++
00401291   |.  33D2              xor edx,edx                                       ;  edx清零了
00401293   |.  F7F1              div ecx                                           ;  eax=edx:eax/ecx  edx=edx:eax%ecx
00401295   |.  50                push eax                                          ;  eax=67eeb
00401296   |.  E8 A5000000       call ncrackme.00401340
0040129B   |.  83C4 04           add esp,4
0040129E   |.  33F6              xor esi,esi

我自己先用vb整理一下思路,表达如下:

ecx=asc(mid(text1.text,2,1)  ;ecx=输入用户名的第2个字符的ASCII码
eax=asc(text1.text)         ;eax=输入用户名的第1个字符的ASCII码
ecx=edx:eax mod ecx         ;ecx取余数,(但是edx不知道)
ecx=ecx*edx                    ;ecx=ecx*edx,这时候edx=输入用户名的第三个字符的ASCII码
ecx=ecx+1
eax=fix(edx:ecx /ecx)            ;eax计算出来应该就是注册码
///////////////////////////////////////////////////////////////////////////////////
(edx:eax) 除以输入的第2个字符的ASCII码,取其余数(这里的EDX应该是ss:[ebp+28]=0012fa58中的内容吧,但我还不知道)
余数再和edx中的内容(edx=输入用户名的第三个字符的ASCII码)相乘,积加1,
edx:eax除以上述结果就是注册码
///////////////////////////////////////////////////////////////////////////////////
那么 这两句的意思应该是
00401295   |.  50                push eax                                          ;  
00401296   |.  E8 A5000000       call ncrackme.00401340
把计算出来的注册码压栈,进入call和真注册码比较了吧~!
好了,学校要停电了,我明天继续吧。

一大早就爬起来了,接着昨天OD的老步骤,我不知道如何查看
00401267   |.  8D5424 28         lea edx,dword ptr ss:[esp+28]
中的内容,后来在下边那里右键-->前往-->表达-->CTRL+G输入ss:[esp+28]指向的地址0012fa58,在ASCII那里发现了123456,那这一句话的意思应该是取假的注册码了哦.
那我参考上面的我所认为的计算注册码的算法,其中,我已经把edx当作了输入用户名的第三个字符的ASCII码,写了一个程序如下:
其中要特别注意的是,上述的ASCII码都是十六进制的
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Integer
Dim result1 As Double, result2 As Double
Dim zhucema As Double
Rem a,b,c分别保存输入名字的第一个,第2个,第三个的ASCII码
Rem result1 , result2分别用来保存中间结果
Rem zhucema 用来保存计算出来的注册码
a = Hex(Asc(Text1.Text))
b = Hex(Asc(Mid(Text1.Text, 2, 1)))
c = Hex(Asc(Mid(Text1.Text, 3, 1)))
result1 = (c * 2 ^ 8 Mod b)
Rem edx:eax表示edx做高32位,eax做低32位,左移一位相当于乘以2,左移32位就是2^32,16进制的就是2^8
result2 = result1 * c + 1
zhucema = Fix((c * 2 ^ 32 + a) / result2)
Text2.Text = Str(zhucema)
End Sub
输入:huanghongqiao
计算出来的是:268160701
好了,填进去试试,"Registration fail."!#$%^&*(()
OH ,my good!
应为输入的是huanghongqiao,我直接取前三个字符做了下面这个:
#include
main()
{
  int a=0x68;
  int b=0x75;
  int c=0x61;
  double result1=(c*256+a) % b;
  double result2=result1*c+1;
  double result3=(c*256+a)/result2;
  cout<<result2;
}
计算出来的是1456,输进去试试,也不对,555555555555555555,&*^%易水寒,壮士一去不复还,我要去自杀了
2005-7-21 03:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
比我强
潜水多半年,只会爆破!
2005-9-1 20:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
我也学过汇编语言,crackme 这是什么意思?我还不太懂,请教于大家~~~~~~`
想学破解
2005-9-7 22:15
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
看不懂...建议出录像
2005-9-9 17:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
今天利用假期学习破解,努力。
2005-10-2 10:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
呵呵,刚爆破了,将
::00401072::  75 1B    JNE SHORT 0040108F   
改为      
::00401072::  74 1B    JE SHORT 0040108F  
注册成功   Registration successful
下一步试试找用户名和密码。
2005-10-2 11:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
支持啊顶啊高手们多发点带些录相是最好的
2005-10-2 16:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
最初由 虫虫 发布
支持啊顶啊高手们多发点带些录相是最好的

是啊,我们新手需要这些阿!!
2005-10-2 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
各位大侠,你们在写破解crack me的破解过程时,
拜托先写一下你们破解的思路
要不然大段大段的编码
看得人头发晕
谢谢
2005-10-11 00:00
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
我正在学习,就是没有什么进展。。。
2005-10-15 20:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
这个东西可以非常简单的被爆破,话说回来,爆破没什么意思。对爆破太感兴趣,很难提高自己的水平。上面的那个“破解ncarcakme历程“非常不错,很适合菜鸟。
2005-10-16 20:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
学习ing
2005-10-24 23:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
I find an answer:
  name:123456
  key: DVWCDT
But I haven't know the program clearly.
Thanks my first Crackme
2005-11-7 13:08
0
雪    币: 208
活跃值: (42)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
46
爆破了
我的第一个破解
看不懂汇编,没学过啊
不过还是很快找到00401072
将jne改为je了
继续努力
2005-11-7 20:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
使用工具:OllDbg
破解结果:得到一个垃圾keygen。
先看看程序的代码:

00401152  |.  50            PUSH EAX                                           ; /pWndClassEx
00401153  |.  FF15 A0404000 CALL DWORD PTR DS:[<&USER32.RegisterClassExA>]     ; \RegisterClassExA
00401159  |.  53            PUSH EBX                                           ; /lParam => NULL
0040115A  |.  56            PUSH ESI                                           ; |hInst
0040115B  |.  53            PUSH EBX                                           ; |hMenu => NULL
0040115C  |.  53            PUSH EBX                                           ; |hParent => NULL
0040115D  |.  68 C8000000   PUSH 0C8                                           ; |Height = C8 (200.)
00401162  |.  68 2C010000   PUSH 12C                                           ; |Width = 12C (300.)
00401167  |.  68 C8000000   PUSH 0C8                                           ; |Y = C8 (200.)
0040116C  |.  68 C8000000   PUSH 0C8                                           ; |X = C8 (200.)
00401171  |.  68 0000CA00   PUSH 0CA0000                                       ; |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION
00401176  |.  68 8C504000   PUSH ncrackme.0040508C                             ; |WindowName = "Newbie smallsize crackme - v1"
0040117B  |.  68 D8404000   PUSH ncrackme.004040D8                             ; |Class = "myWindowClass"
00401180  |.  53            PUSH EBX                                           ; |ExtStyle => 0
00401181  |.  FF15 A4404000 CALL DWORD PTR DS:[<&USER32.CreateWindowExA>]      ; \CreateWindowExA
00401187  |.  53            PUSH EBX                                           ; /lParam => 0
00401188  |.  68 50104000   PUSH ncrackme.00401050                             ; |pDlgProc = ncrackme.00401050  窗口函数地址
0040118D  |.  50            PUSH EAX                                           ; |hOwner
0040118E  |.  6A 65         PUSH 65                                            ; |pTemplate = 65
00401190  |.  56            PUSH ESI                                           ; |hInst
00401191  |.  A3 B8564000   MOV DWORD PTR DS:[4056B8],EAX                      ; |
00401196  |.  FF15 A8404000 CALL DWORD PTR DS:[<&USER32.CreateDialogParamA>]   ; \CreateDialogParamA

首先看到一段熟悉的代码,先CreateWindowExA(),然后再CreateDialogParamA。这个就是程序的主函数了。

从CreateDialogParamA函数中找到pDlgProc = ncrackme.00401050。这个地址就是窗口函数的地址了。

看看这里的代码:
00401050   .  817C24 08 110>CMP DWORD PTR SS:[ESP+8],111
00401058   .  75 74         JNZ SHORT ncrackme.004010CE
0040105A   .  8B4424 0C     MOV EAX,DWORD PTR SS:[ESP+C]
0040105E   .  66:3D EA03    CMP AX,3EA
00401062   .  75 42         JNZ SHORT ncrackme.004010A6
00401064   .  E8 C7010000   CALL ncrackme.00401230
00401069   .  85C0          TEST EAX,EAX                                       ; 判断ncrackme.00401230函数返回的值是否为0;为0则注册成功。
0040106B   .  6A 00         PUSH 0                                             ; /Style = MB_OK|MB_APPLMODAL
0040106D   .  68 80504000   PUSH ncrackme.00405080                             ; |Title = "ncrackme"
00401072   .  75 1B         JNZ SHORT ncrackme.0040108F                        ; |
00401074   .  A1 B8564000   MOV EAX,DWORD PTR DS:[4056B8]                      ; |
00401079   .  68 64504000   PUSH ncrackme.00405064                             ; |Text = "Registration successful."
0040107E   .  50            PUSH EAX                                           ; |hOwner => NULL
0040107F   .  FF15 C0404000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>]          ; \MessageBoxA

好,再看看这里的代码ncrackme.00401230:

00401230  /$  8B0D BC564000 MOV ECX,DWORD PTR DS:[4056BC]
00401236  |.  83EC 30       SUB ESP,30
00401239  |.  8D4424 00     LEA EAX,DWORD PTR SS:[ESP]
0040123D  |.  53            PUSH EBX
0040123E  |.  56            PUSH ESI
0040123F  |.  8B35 94404000 MOV ESI,DWORD PTR DS:[<&USER32.GetDlgItemTextA>]   ;  USER32.GetDlgItemTextA
00401245  |.  6A 10         PUSH 10                                            ; /Count = 10 (16.)
00401247  |.  50            PUSH EAX                                           ; |Buffer
00401248  |.  68 E8030000   PUSH 3E8                                           ; |ControlID = 3E8 (1000.)
0040124D  |.  51            PUSH ECX                                           ; |hWnd => NULL
0040124E  |.  33DB          XOR EBX,EBX                                        ; |
00401250  |.  FFD6          CALL ESI                                           ; \GetDlgItemTextA
00401252  |.  83F8 03       CMP EAX,3
00401255  |.  73 0B         JNB SHORT ncrackme.00401262
00401257  |.  5E            POP ESI
00401258  |.  B8 01000000   MOV EAX,1
0040125D  |.  5B            POP EBX
0040125E  |.  83C4 30       ADD ESP,30
00401261  |.  C3            RETN
00401262  |>  A1 BC564000   MOV EAX,DWORD PTR DS:[4056BC]
00401267  |.  8D5424 28     LEA EDX,DWORD PTR SS:[ESP+28]
0040126B  |.  6A 10         PUSH 10
0040126D  |.  52            PUSH EDX
0040126E  |.  68 E9030000   PUSH 3E9
00401273  |.  50            PUSH EAX
00401274  |.  FFD6          CALL ESI                                               ; 分别将输入的用户名user,密码pass存到函数堆栈的esp和esp+20处。
00401276 >|.  0FBE4424 08   MOVSX EAX,BYTE PTR SS:[ESP+8]
0040127B  |.  0FBE4C24 09   MOVSX ECX,BYTE PTR SS:[ESP+9]
00401280  |.  99            CDQ
00401281  |.  F7F9          IDIV ECX
00401283  |.  8BCA          MOV ECX,EDX                                        ;  ecx=user[0]%user[1]
00401285  |.  83C8 FF       OR EAX,FFFFFFFF
00401288  |.  0FBE5424 0A   MOVSX EDX,BYTE PTR SS:[ESP+A]
0040128D  |.  0FAFCA        IMUL ECX,EDX                                       ;  ecx=ecx*user[2]
00401290  |.  41            INC ECX                                            ;  ecx=ecx+1
00401291  |.  33D2          XOR EDX,EDX
00401293  |.  F7F1          DIV ECX
00401295  |.  50            PUSH EAX                                           ;  eax=ffffffff/ecx
00401296  |.  E8 A5000000   CALL ncrackme.00401340                             ;  4050ac=eax
0040129B  |.  83C4 04       ADD ESP,4
0040129E  |.  33F6          XOR ESI,ESI
004012A0  |>  E8 A5000000   /CALL ncrackme.0040134A                            ;  这里调用的函数功能主要是这样4050ac=eax*343fd+269ec3   eax=eax>>10h&7fff
004012A5  |.  99            |CDQ
004012A6  |.  B9 1A000000   |MOV ECX,1A
004012AB  |.  F7F9          |IDIV ECX                                          ;  eax=eax/1A  edx=eax&%1A+41
004012AD  |.  80C2 41       |ADD DL,41
004012B0  |.  885434 18     |MOV BYTE PTR SS:[ESP+ESI+18],DL                   ;  byte[esp+18+i]=dl
004012B4  |.  46            |INC ESI
004012B5  |.  83FE 0F       |CMP ESI,0F                                        ;  for(i=0,i<10H,i++)
004012B8  |.^ 72 E6         \JB SHORT ncrackme.004012A0
004012BA  |.  57            PUSH EDI
004012BB  |.  8D7C24 0C     LEA EDI,DWORD PTR SS:[ESP+C]                       ;  edi=user[0]
004012BF  |.  83C9 FF       OR ECX,FFFFFFFF
004012C2  |.  33C0          XOR EAX,EAX
004012C4  |.  33F6          XOR ESI,ESI
004012C6  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
004012C8  |.  F7D1          NOT ECX
004012CA  |.  49            DEC ECX
004012CB  |.  74 59         JE SHORT ncrackme.00401326
004012CD  |>  8A4434 0C     /MOV AL,BYTE PTR SS:[ESP+ESI+C]
004012D1  |.  C0F8 05       |SAR AL,5
004012D4  |.  0FBEC0        |MOVSX EAX,AL
004012D7  |.  8D1480        |LEA EDX,DWORD PTR DS:[EAX+EAX*4]
004012DA  |.  8D04D0        |LEA EAX,DWORD PTR DS:[EAX+EDX*8]                  ;  eax=eax+(eax+4*eax)*8
004012DD  |.  8D0440        |LEA EAX,DWORD PTR DS:[EAX+EAX*2]                  ;  eax=eax+eax*2
004012E0  |.  85C0          |TEST EAX,EAX
004012E2  |.  7E 0A         |JLE SHORT ncrackme.004012EE
004012E4  |.  8BF8          |MOV EDI,EAX
004012E6  |>  E8 5F000000   |/CALL ncrackme.0040134A
004012EB  |.  4F            ||DEC EDI
004012EC  |.^ 75 F8         |\JNZ SHORT ncrackme.004012E6
004012EE  |>  E8 57000000   |CALL ncrackme.0040134A
004012F3  |.  99            |CDQ
004012F4  |.  B9 1A000000   |MOV ECX,1A
004012F9  |.  8D7C24 0C     |LEA EDI,DWORD PTR SS:[ESP+C]
004012FD  |.  F7F9          |IDIV ECX
004012FF  |.  0FBE4C34 2C   |MOVSX ECX,BYTE PTR SS:[ESP+ESI+2C]
00401304  |.  80C2 41       |ADD DL,41
00401307  |.  0FBEC2        |MOVSX EAX,DL
0040130A  |.  2BC1          |SUB EAX,ECX                                       ;  eax=eax%1A+41-pass[0]
0040130C  |.  885434 1C     |MOV BYTE PTR SS:[ESP+ESI+1C],DL                   ;  dl=eax%1A+41
00401310  |.  99            |CDQ
00401311  |.  33C2          |XOR EAX,EDX
00401313  |.  83C9 FF       |OR ECX,FFFFFFFF
00401316  |.  2BC2          |SUB EAX,EDX
00401318  |.  03D8          |ADD EBX,EAX
0040131A  |.  33C0          |XOR EAX,EAX
0040131C  |.  46            |INC ESI
0040131D  |.  F2:AE         |REPNE SCAS BYTE PTR ES:[EDI]
0040131F  |.  F7D1          |NOT ECX
00401321  |.  49            |DEC ECX
00401322  |.  3BF1          |CMP ESI,ECX
00401324  |.^ 72 A7         \JB SHORT ncrackme.004012CD
00401326  |>  5F            POP EDI
00401327  |.  8BC3          MOV EAX,EBX
00401329  |.  5E            POP ESI
0040132A  |.  5B            POP EBX
0040132B  |.  83C4 30       ADD ESP,30
0040132E  \.  C3            RETN

前面一段为主要为将用户名和密码读入堆栈,后面是主要的判断程序。
2005-11-11 17:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
判断注册码的主要过程大概如下:
将用户名前两个字符进行一系列的操作,获得一个参数。然后再逐个字符进行操作,跟密码字符进行比对。如相同则注册成功。
写了段keygen:
#include "stdafx.h"
#include <stdio.h>

unsigned int iTemp ;

int exchange()
{
        unsigned int i ;
        iTemp = iTemp * 0x343FD + 0x269ec3 ;
        i = iTemp >> 0x10 ;
        i = i & 0x7fff ;
        return i ;
}

int main(int argc, char* argv[])
{
        static char iUser[16] ;
        printf("%s","please input the user name...") ;
        scanf("%s",&iUser) ;
        unsigned int eax ;
        int i ;
        int j ;
       
        eax = iUser[0] % iUser[1] * iUser[2] + 1 ;
        eax = 0xffffffff / eax ;

        iTemp = eax ;

        for (i = 0 ; i< 15 ; i++)
        {
                exchange() ;
        }
       
        i = iTemp ;
        for (i = 0 ; iUser[i] ; i++)
        {
                eax = iUser[i] >> 5 ;
                eax = eax + (eax + 4*eax)*8 ;
                eax = eax + 2* eax ;
                for (j = eax ; j >= 0 ; j--)
                {
                        eax = exchange() ;
                }
                eax = eax % 0x1A +0x41 ;
                char cTemp = eax ;
                printf("%c",eax) ;
        }
        return 0 ;

}
测试了一下,可以正常获得注册码。分析算法的过程中发现几个比较有意思的东西。
1、判断程序开始使用了30h的堆栈空间,其中esp和esp+20分别用来存用户名和密码。而esp+10h这里表面上作了很多存入的工作,实际上一点用都没有。
2、最后的判断时采用了eax%0x1A+0x41,结果就是注册码中只有大写字母,一个小写字母和数字都没有。
3、由于判断时只使用逐位判断,再输入注册码时后面可以随便输。如用户名为willis时得到的密码为ERRDGI,你输入ERRDGI1234也可以正常注册成功。

后来看了下riijj大大的破文,发现我开始找算法过程中很有问题,居然不知道用断点,汗............第一次写破文,思路和程序都很有问题,请大家多多指教
               willis  qq:112935459
2005-11-11 17:43
0
雪    币: 158
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
49
希望多发好东东上来...
2005-11-30 12:23
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
谢谢照顾新手啊
2005-12-1 13:25
0
游客
登录 | 注册 方可回帖
返回
//