首页
社区
课程
招聘
[转帖]拿来注意...crackmes.de上的一个简单crackme 大家练手
发表于: 2008-12-25 15:48 8230

[转帖]拿来注意...crackmes.de上的一个简单crackme 大家练手

2008-12-25 15:48
8230
拿来主义.....
是个超级简单的小玩意......

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
2
直接看到EAX中的注册码 HEXA
上传的附件:
  • q.JPG (10.15kb,127次下载)
2008-12-25 16:36
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
数据窗口的确有
不过也的爆
上传的附件:
2008-12-25 17:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
晕死
为什么我换了两个OD,都用不了啊
2008-12-25 18:03
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
楼上几位,再努把力。

没爆对位置。

要达到fullregister才行啊!fullregister可不是明文比较的哟,需要算法分析哦。

上传的附件:
2008-12-25 19:13
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
郁闷,这个方程还挺不好解。

首先,注册码位数:

1位无解

2位:正在研究,貌似无解。

3位有很多解,给出一组OPR,可以full register

4位若为HEXA为light register

5位以上,只需要前3位正确即可full register。
2008-12-25 20:15
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
这个Crackme被改过
2008-12-25 20:51
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
如何得知?

那原来的程序是什么样子的呢?
2008-12-25 21:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我完全是给它搬了个家.....没有动过手脚哦...
2008-12-25 22:16
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
刚刚看了一下
的确跟原网站的一样
但总觉得像是有被改过的感觉
很多地方都怪怪的. 可能作者在练习用吧.
2008-12-25 23:23
0
雪    币: 204
活跃值: (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
2008-12-25 23:47
0
雪    币: 2067
活跃值: (82)
能力值: ( 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

类似的地方前面还有一大堆,完全没被用到
所以我才会想说是不是被改过
可能是作者自己在练习用的吧
2008-12-26 06:30
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不懂英文还是不行呀。爆都爆不对。
在改下。
上传的附件:
  • 1.jpg (11.07kb,101次下载)
2008-12-26 08:53
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
啊,这个也反调试吗,我用ollydbg跟踪一点反应也有没啊
2008-12-26 10:40
0
雪    币: 200
活跃值: (10)
能力值: ( 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用了插件,你吧插件的文件夹名字换了.就会知道了反调试的效果了
2008-12-26 12:39
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
16
这里是个bug?跳错标签了?
确实貌似一个有bug的crackme
2008-12-26 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
实际上开始看的时候也发现了...没有看懂它的意图...
2008-12-26 13:24
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
18
这个只管注册码的前三位,但是注册码长度不能为4位。可以为3位和5位,6位等
   附计算注册程序,注册码全写在a.txt里面
上传的附件:
2008-12-26 16:05
0
雪    币: 200
活跃值: (10)
能力值: ( 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是被人为修改后的程序,唉
2008-12-28 03:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我试了只要前四个字符串是HEXA,无论是四个还是五个字符串,都不会有错,我觉得这个Crack me被认为修改过,没意思啊
2008-12-28 03:57
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
21
楼上继续修炼....

你按跳转回到上面的判断,会更有收获....
2008-12-28 08:09
0
雪    币: 201
活跃值: (10)
能力值: ( 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;
			}

		}
	}
}
2008-12-28 11:34
0
游客
登录 | 注册 方可回帖
返回
//