能力值:
( LV13,RANK:760 )
|
-
-
2 楼
直接看到EAX中的注册码 HEXA
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
晕死
为什么我换了两个OD,都用不了啊
|
能力值:
(RANK:260 )
|
-
-
5 楼
楼上几位,再努把力。
没爆对位置。 要达到fullregister才行啊!fullregister可不是明文比较的哟,需要算法分析哦。
|
能力值:
(RANK:260 )
|
-
-
6 楼
郁闷,这个方程还挺不好解。
首先,注册码位数:
1位无解
2位:正在研究,貌似无解。
3位有很多解,给出一组OPR,可以full register
4位若为HEXA为light register
5位以上,只需要前3位正确即可full register。
|
能力值:
( LV9,RANK:180 )
|
-
-
7 楼
这个Crackme被改过
|
能力值:
(RANK:260 )
|
-
-
8 楼
如何得知?
那原来的程序是什么样子的呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我完全是给它搬了个家.....没有动过手脚哦...
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
刚刚看了一下
的确跟原网站的一样
但总觉得像是有被改过的感觉
很多地方都怪怪的. 可能作者在练习用吧.
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
00401000 Cra> 64:A1 30000000 mov eax,dword ptr fs:[30]
00401006 8B40 68 mov eax,dword ptr ds:[eax+68]
00401009 83E0 70 and eax,70
0040100C 85C0 test eax,eax
0040100E /0F85 88000000 jnz CrackMe#.0040109C //程序就退出 此处:NOP掉
00401014 |EB 03 jmp short CrackMe#.00401019
00401016 |3A4D 3A cmp cl,byte ptr ss:[ebp+3A]
00401019 |1E push ds
0040101A |EB 66 jmp short CrackMe#.00401082
0040101C |02CD add cl,ch
0040101E |209CEB 02CD20EB and byte ptr ds:[ebx+ebp*8+EB20CD02]>
00401025 |02CD add cl,ch
00401027 |2060 33 and byte ptr ds:[eax+33],ah
0040102A |C033 DB sal byte ptr ds:[ebx],0DB
0040102D |61 popad
0040102E |9D popfd
0040102F |1F pop ds
00401030 |68 67104000 push CrackMe#.00401067
00401035 |64:FF35 1E00000>push dword ptr fs:[1E]
0040103C |64:8925 0000000>mov dword ptr fs:[0],esp
00401043 |9C pushfd
00401044 |813424 54010000 xor dword ptr ss:[esp],154
0040104B |9D popfd
0040104C |6A 30 push 30
0040104E |68 58984000 push CrackMe#.00409858
00401053 |68 8B974000 push CrackMe#.0040978B ; ASCII "OLLY"
00401058 |6A 00 push 0
0040105A |E8 0F660000 call <jmp.&user32.MessageBoxA>
0040105F |6A 00 push 0
00401061 |E8 44660000 call <jmp.&kernel32.ExitProcess>
00401066 |C3 retn
00401067 |64:8F05 0000000>pop dword ptr fs:[0]
0040106E |83C4 04 add esp,4
00401071 |6A 00 push 0
00401073 |E8 3E660000 call <jmp.&kernel32.GetModuleHandleA>
00401078 |A3 A4964000 mov dword ptr ds:[4096A4],eax
0040107D |E8 2E660000 call <jmp.&kernel32.GetCommandLineA>
00401082 |A3 94964000 mov dword ptr ds:[409694],eax
00401087 |6A 0A push 0A
00401089 |FF35 94964000 push dword ptr ds:[409694]
0040108F |6A 00 push 0
00401091 |FF35 A4964000 push dword ptr ds:[4096A4]
00401097 |E8 06000000 call CrackMe#.004010A2
0040109C \50 push eax
0040109D E8 08660000 call <jmp.&kernel32.ExitProcess>
00403C1F $ 51 push ecx
00403C20 . 52 push edx
00403C21 . 6A 1D push 1D ; /Count = 1D (29.)
00403C23 . 68 A0974000 push CrackMe#.004097A0 ; |Buffer = CrackMe#.004097A0
00403C28 . FF35 B4964000 push dword ptr ds:[4096B4] ; |hWnd = 001B05EC (class='Edit',parent=001705EA)
00403C2E . E8 233A0000 call <jmp.&user32.GetWindowTextA> ; \GetWindowTextA
00403C33 . 83F8 03 cmp eax,3
00403C36 . 75 00 jnz short CrackMe#.00403C38
00403C38 > 83F8 04 cmp eax,4
00403C3B . 0F84 AF250000 je CrackMe#.004061F0
00403C41 . 8D35 A0974000 lea esi,dword ptr ds:[4097A0] ;
00403C47 . B3 01 mov bl,1
00403C49 > 8A06 mov al,byte ptr ds:[esi] ;
00403C4B . 0105 D2974000 add dword ptr ds:[4097D2],eax ;
00403C51 . 32C3 xor al,bl ;
00403C53 . F6E0 mul al
00403C55 . 46 inc esi
00403C56 . FEC3 inc bl
00403C58 . 80FB 04 cmp bl,4
00403C5B .^ 75 EC jnz short CrackMe#.00403C49
00403C5D . BB F1310000 mov ebx,31F1
00403C62 . A1 D2974000 mov eax,dword ptr ds:[4097D2]
00403C67 . 3BD8 cmp ebx,eax
00403C69 0F85 81250000 jnz CrackMe#.004061F0 -> 暴掉会到A处,否则到B处
00403C6F . E9 E0130000 jmp CrackMe#.00405054
->A处
00405054 > \FC cld
00405055 . 68 3A944000 push CrackMe#.0040943A ; /full registered
0040505A . FF35 CC964000 push dword ptr ds:[4096CC] ; |hWnd = 001C0598 (' ',class='Static',parent=001705EA)
00405060 . E8 2D260000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
00405065 . C705 D2974000>mov dword ptr ds:[4097D2],0
0040506F . B8 00000000 mov eax,0
00405074 . 5A pop edx
00405075 . 59 pop ecx
->B处
004061F0 > \FC cld
004061F1 . 8B35 A0974000 mov esi,dword ptr ds:[4097A0]
004061F7 . A1 90974000 mov eax,dword ptr ds:[409790]
004061FC . 3BF0 cmp esi,eax ;eax ->HEXA
004061FE . 0F84 04140000 je CrackMe#.00407608 ;暴掉或填写密码为:HEXA 都会到C处
00406204 . EB 00 jmp short CrackMe#.00406206
00406206 > 68 5B944000 push CrackMe#.0040945B ; /wrong serial
0040620B . FF35 CC964000 push dword ptr ds:[4096CC] ; |hWnd = 001D0598 (' ',class='Static',parent=002F0612)
00406211 . E8 7C140000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
00406216 . C705 D2974000>mov dword ptr ds:[4097D2],0
00406220 . B8 00000000 mov eax,0
00406225 . 5A pop edx
00406226 . 59 pop ecx
00406227 . C3 retn
-C处
00407608 > \FC cld
00407609 . 68 4A944000 push CrackMe#.0040944A ; /light registered
0040760E . FF35 CC964000 push dword ptr ds:[4096CC] ; |hWnd = 001D0598 ('wrong serial',class='Static',parent=002F0612)
00407614 . E8 79000000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
00407619 . C705 D2974000>mov dword ptr ds:[4097D2],0
00407623 . B8 00000000 mov eax,0
00407628 . 5A pop edx
00407629 . 59 pop ecx
|
能力值:
( LV9,RANK:180 )
|
-
-
12 楼
虽说可能是ASM写的, 可是这个判断太怪了
00403C33 83F8 03 cmp eax, 3
00403C36 75 00 jnz short 00403C38
00403C38 83F8 04 cmp eax, 4
00403C3B 0F84 AF250000 je 004061F0
00403C41 8D35 A0974000 lea esi, dword ptr [4097A0]
而且下面的数据其实是程序
00403C67 . 3BD8 cmp ebx, eax
00403C69 . 0F85 81250000 jnz 004061F0
00403C6F . E9 E0130000 jmp 00405054
00403C74 E9 db E9
00403C75 A2 db A2
00403C76 01 db 01
00403C77 00 db 00
00403C78 00 db 00
翻成如下:(若强将 EIP 改来这里,也是一个 Full Register,但是有Anti及像是壳的Code)
00403C74 /E9 A2010000 jmp 00403E1B
00403E1B 0F31 rdtsc
00403E1D 8BC8 mov ecx, eax
00403E1F 0F31 rdtsc
00403E21 2BC8 sub ecx, eax
00403E23 F7D1 not ecx
00403E25 81F9 00500000 cmp ecx, 5000
00403E2B - 7F FE jg short 00403E2B
00403E2D EB 0B jmp short 00403E3A
类似的地方前面还有一大堆,完全没被用到
所以我才会想说是不是被改过
可能是作者自己在练习用的吧
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
不懂英文还是不行呀。爆都爆不对。
在改下。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
啊,这个也反调试吗,我用ollydbg跟踪一点反应也有没啊
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
00401000 Cra> 64:A1 30000000 mov eax,dword ptr fs:[30]
00401006 8B40 68 mov eax,dword ptr ds:[eax+68]
00401009 83E0 70 and eax,70
0040100C 85C0 test eax,eax
0040100E /0F85 88000000 jnz CrackMe#.0040109C //程序就退出 此处:NOP掉
这个就是标准的反调试。你的od用了插件,你吧插件的文件夹名字换了.就会知道了反调试的效果了
|
能力值:
(RANK:410 )
|
-
-
16 楼
这里是个bug?跳错标签了?
确实貌似一个有bug的crackme
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
实际上开始看的时候也发现了...没有看懂它的意图...
|
能力值:
( LV13,RANK:760 )
|
-
-
18 楼
这个只管注册码的前三位,但是注册码长度不能为4位。可以为3位和5位,6位等
附计算注册程序,注册码全写在a.txt里面
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
该软件用OD进入调试,很快就运行到
0040100E /0F85 88000000 jnz 0040109C
这里的跳转直接跳到ExitProcess函数,退出进程,看来这是反调试
直接将该段代码NOP掉,保存,建立新的Crame文件
打开软件,随便输入任何注册码,如1111111,出现字符串wrong serial,很好
用Search for->all referenced strings进入字符串相关窗口,找到该字符串,Follow in Disassembler
004061F0 > \FC cld
004061F1 . 8B35 A0974000 mov esi, dword ptr [4097A0]
004061F7 . A1 90974000 mov eax, dword ptr [409790]
004061FC . 3BF0 cmp esi, eax
004061FE . 0F84 04140000 je 00407608 ; 关键跳,我们要实现这里的跳转
00406204 . EB 00 jmp short 00406206
00406206 > 68 5B944000 push 0040945B ; /Text = "wrong serial"
0040620B . FF35 CC964000 push dword ptr [4096CC] ; |hWnd = NULL
00406211 . E8 7C140000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
00406216 . C705 D2974000>mov dword ptr [4097D2], 0
00406220 . B8 00000000 mov eax, 0
在004061F0处,发现上面有个跳转直接跳到该处,上面跳转之前的程序进行了分析,发现并没有任何用处,其实该处用了一些算法,不过这个程序好像被改了,没有用到该算法运算后的结果进行比较
在[409790]就发现了注册字符串HEXA,直接进行比较就可以得到结果
很遗憾的发现我第一个解决的Crack Me是被人为修改后的程序,唉
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
我试了只要前四个字符串是HEXA,无论是四个还是五个字符串,都不会有错,我觉得这个Crack me被认为修改过,没意思啊
|
能力值:
(RANK:300 )
|
-
-
21 楼
楼上继续修炼....
你按跳转回到上面的判断,会更有收获....
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
俺是小菜一个,比较喜欢搞这些小玩意,呵呵.
长度为4个的时候,,直接比较,非常简单,算法如下
004061F0 > \FC cld
004061F1 . 8B35 A0974000 mov esi, dword ptr [4097A0] ; 输入
的四个字符
004061F7 . A1 90974000 mov eax, dword ptr [409790] ; 值为
HEXA
004061FC . 3BF0 cmp esi, eax ; 直接
明码比较
004061FE . 0F84 04140000 je 00407608
00406204 . EB 00 jmp short 00406206
字符长度不为4个的时候,只计算前三个字符(不够它自动补0计算),算法处如下:
00403C1F $ 51 push ecx
00403C20 . 52 push edx
00403C21 . 6A 1D push 1D ; /Count
= 1D (29.)
00403C23 . 68 A0974000 push 004097A0 ;
|Buffer = CrackMe#.004097A0
00403C28 . FF35 B4964000 push dword ptr [4096B4] ; |hWnd
= 000503F2 (class='Edit',parent=000603C4)
00403C2E . E8 233A0000 call <jmp.&user32.GetWindowTextA> ;
\GetWindowTextA
00403C33 . 83F8 03 cmp eax, 3
00403C36 . 75 00 jnz short 00403C38
00403C38 > 83F8 04 cmp eax, 4
00403C3B . 0F84 AF250000 je 004061F0 ; 检查
是否是4个字符,是则跳
00403C41 . 8D35 A0974000 lea esi, dword ptr [4097A0] ;
4097A0放注册码
00403C47 . B3 01 mov bl, 1
00403C49 > 8A06 mov al, byte ptr [esi] ; 依次
取三个字符分别处理
00403C4B . 0105 D2974000 add dword ptr [4097D2], eax ;
4097d2存放结果,累加上次的eax值保存
00403C51 . 32C3 xor al, bl ; 当前
字符与当前位置序号异或
00403C53 . F6E0 mul al ; 异或
结果再平方,结果放eax中
00403C55 . 46 inc esi
00403C56 . FEC3 inc bl
00403C58 . 80FB 04 cmp bl, 4
00403C5B .^ 75 EC jnz short 00403C49
00403C5D . BB F1310000 mov ebx, 31F1
00403C62 . A1 D2974000 mov eax, dword ptr [4097D2]
00403C67 . 3BD8 cmp ebx, eax ; 结果
与31F1相比 是则正确
00403C69 . 0F85 81250000 jnz 004061F0
00403C6F . E9 E0130000 jmp 00405054
附C++算法代码:
char a, b, c;
// 输入4个为HEXA,小于3个的,后面它把0补上去按3个计算
// 其它的,则通过如下计算,
// 可见ascii从0x20至0x80
const int min = 0x20, max = 0x80;
for(int i=min; i<=max; i++)
{
for(int j=min;j<=max; j++)
{
for(int k=min; k<=max; k++)
{
unsigned short al = 0;
unsigned long eax = 0, sum = 0;
// 取第一个
al = i;
eax = (eax & 0xFFFFFF00) + al;
sum = sum + eax;
al = al ^ 1; // 与1异或
eax = al * al; // 平方一下
// 取第二个
al = j;
eax = (eax & 0xFFFFFF00) + al; // 上次的eax低字节清0,
再加上这次的字符
sum = sum + eax; // 累计eax
al = al ^ 2; // 与2异或
eax = al * al; // 平方一下
// 取第三个,同上
al = k;
eax = (eax & 0xFFFFFF00) + al;
sum = sum + eax;
//结果与0x31f0比较,上收正确
if(sum == 0x31f1)
{
cout<<"OK-"<<(char)i<<(char)j<<(char)k<<endl;
}
}
}
}
|
|
|