能力值:
( LV2,RANK:10 )
26 楼
用W32Dasm查registrortion fail可看到字串
能力值:
( LV2,RANK:10 )
27 楼
yico那个带音乐的你做出来了吗?太难了,字串怎么也找不到啊,“错了”还有一个是“不要灰心,再来”我的QQ是29890872,好想有几个朋友一起玩啊!!!
能力值:
( LV2,RANK:10 )
28 楼
最初由 riijj 发布 没有人回应..
没人支持,偶支持呀!
能力值:
( LV2,RANK:10 )
29 楼
支持啊,感谢为广大菜鸟着想
能力值:
( LV12,RANK:2670 )
30 楼
能力值:
( LV2,RANK:10 )
31 楼
是我们新手学习的好文章,非常感谢
能力值:
( 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
|
能力值:
( 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,&*^%易水寒,壮士一去不复还,我要去自杀了
能力值:
( LV2,RANK:10 )
34 楼
比我强
潜水多半年,只会爆破!
能力值:
( LV2,RANK:10 )
35 楼
我也学过汇编语言,crackme 这是什么意思?我还不太懂,请教于大家~~~~~~`
想学破解
能力值:
( LV2,RANK:10 )
36 楼
看不懂...建议出录像
能力值:
( LV2,RANK:10 )
37 楼
今天利用假期学习破解,努力。
能力值:
( LV2,RANK:10 )
38 楼
呵呵,刚爆破了,将
::00401072:: 75 1B JNE SHORT 0040108F
改为
::00401072:: 74 1B JE SHORT 0040108F
注册成功 Registration successful
下一步试试找用户名和密码。
能力值:
( LV2,RANK:10 )
39 楼
支持啊顶啊高手们多发点带些录相是最好的
能力值:
( LV2,RANK:10 )
40 楼
最初由 虫虫 发布 支持啊顶啊高手们多发点带些录相是最好的
是啊,我们新手需要这些阿!!
能力值:
( LV2,RANK:10 )
41 楼
各位大侠,你们在写破解crack me的破解过程时,
拜托先写一下你们破解的思路
要不然大段大段的编码
看得人头发晕
谢谢
能力值:
( LV2,RANK:10 )
42 楼
我正在学习,就是没有什么进展。。。
能力值:
( LV2,RANK:10 )
43 楼
这个东西可以非常简单的被爆破,话说回来,爆破没什么意思。对爆破太感兴趣,很难提高自己的水平。上面的那个“破解ncarcakme历程“非常不错,很适合菜鸟。
能力值:
( LV2,RANK:10 )
44 楼
学习ing
能力值:
( LV2,RANK:10 )
45 楼
I find an answer:
name:123456
key: DVWCDT
But I haven't know the program clearly.
Thanks my first Crackme
能力值:
( LV4,RANK:50 )
46 楼
爆破了
我的第一个破解
看不懂汇编,没学过啊
不过还是很快找到00401072
将jne改为je了
继续努力
能力值:
( 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
前面一段为主要为将用户名和密码读入堆栈,后面是主要的判断程序。
能力值:
( 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
能力值:
( LV3,RANK:20 )
49 楼
希望多发好东东上来...
能力值:
( LV2,RANK:10 )
50 楼
谢谢照顾新手啊