新手逆向练习与详解(7)(详解带有源文件)47CrackMe

我这里和大家声明一下 我这个是文件 是来自吾爱破解的creakme 160   导航链接  帖子里面有更厉害的思路  

本帖是编号为47的creakme 

这个creakme 我感觉到的难度主要是自己需要创建一个文件 

新手逆向练习与详解(7)(详解带有源文件)47CrackMe_第1张图片

Creatfilea这个大家可以百度一下 如果文件不存在的话 这个函数是不会自己创建的 然后从fliename 我们可以把它的名字给猜出来 创建的文件如下(要和源文件一块 在一个文件夹) 

新手逆向练习与详解(7)(详解带有源文件)47CrackMe_第2张图片然后我们求出来这个之后 再分析这个程序就很简单了  我们往下走就可以  算法内容我就写到了od里面

004010A9   .  E8 2F020000   call             ; \下面应该就是重点了(readflie)
004010AE   .  85C0          test eax,eax
004010B0   .  75 02         jnz short DueList_.004010B4
004010B2   .  EB 43         jmp short DueList_.004010F7
004010B4   >  33DB          xor ebx,ebx                              ;  ebx=esi=0
004010B6   .  33F6          xor esi,esi                              ;  DueList_.
004010B8   .  833D 73214000>cmp dword ptr ds:[0x402173],0x12         ;  这里是比较长度
004010BF   .  7C 36         jl short DueList_.004010F7
004010C1   >  8A83 1A214000 mov al,byte ptr ds:[ebx+0x40211A]        ;  40211a这里是我们文件里面输入的内容
004010C7   .  3C 00         cmp al,0x0                               ;  0x0 相当于\0
004010C9   .  74 08         je short DueList_.004010D3               ;  字符串结束跳出循环
004010CB   .  3C 01         cmp al,0x1
004010CD   .  75 01         jnz short DueList_.004010D0
004010CF   .  46            inc esi                                  ;  1、esi是计算文件中的0x1个数
004010D0   >  43            inc ebx
004010D1   .^ EB EE         jmp short DueList_.004010C1              ;  这个循环就是来计算0x1的值
004010D3   >  83FE 02       cmp esi,0x2
004010D6   .  7C 1F         jl short DueList_.004010F7               ;  小于2就直接错误
004010D8   .  33F6          xor esi,esi                              ;  DueList_.
004010DA   .  33DB          xor ebx,ebx                              ;  清除寄存器 准备下一个循环
004010DC   >  8A83 1A214000 mov al,byte ptr ds:[ebx+0x40211A]
004010E2   .  3C 00         cmp al,0x0                               ;  2、比较第一部分的和是否等于1d5
004010E4   .  74 09         je short DueList_.004010EF
004010E6   .  3C 01         cmp al,0x1
004010E8   .  74 05         je short DueList_.004010EF               ;  遇到 0x0 0x1就直接跳出循环
004010EA   .  03F0          add esi,eax                              ;  esi 这次计数字符串的和
004010EC   .  43            inc ebx
004010ED   .^ EB ED         jmp short DueList_.004010DC
004010EF   >  81FE D5010000 cmp esi,0x1D5                            ;  要求等于0x1d5
004010F5   .  74 1D         je short DueList_.00401114
004010F7   >  6A 00         push 0x0                                 ; |/Style = MB_OK|MB_APPLMODAL
004010F9   .  68 01204000   push DueList_.00402001                   ; ||Title = "Duelist's Crackme #2"
004010FE   .  68 86204000   push DueList_.00402086                   ; ||Text = "Your current keyfile is invalid... Please obtain a valid one from the software author!"
00401103   .  6A 00         push 0x0                                 ; ||hOwner = NULL
00401105   .  E8 5D020000   call            ; |\MessageBoxA
0040110A   .  E8 AA010000   call          ; \ExitProcess
0040110F   .  E9 AE000000   jmp DueList_.004011C2
00401114   >  33F6          xor esi,esi                              ;  esi=0
00401116   >  43            inc ebx                                  ;  ebx就是从第一个0x1后面的值
00401117   .  8A83 1A214000 mov al,byte ptr ds:[ebx+0x40211A]        ;  这个是字符串后面的然后为0 直接跳过了
0040111D   .  3C 00         cmp al,0x0                               ;  3、用第二部分的值直接去算出名字
0040111F   .  74 18         je short DueList_.00401139
00401121   .  3C 01         cmp al,0x1
00401123   .  74 14         je short DueList_.00401139
00401125   .  83FE 0F       cmp esi,0xF                              ;  第二部分不能大于0xf
00401128   .  73 0F         jnb short DueList_.00401139
0040112A   .  3286 1A214000 xor al,byte ptr ds:[esi+0x40211A]
00401130   .  8986 60214000 mov dword ptr ds:[esi+0x402160],eax      ;  这个是名字部分
00401136   .  46            inc esi                                  ;  DueList_.
00401137   .^ EB DD         jmp short DueList_.00401116
00401139   >  43            inc ebx                                  ;  4、第三部分相加等于1b2
0040113A   .  33F6          xor esi,esi                              ;  再次清理寄存器
0040113C   >  8A83 1A214000 mov al,byte ptr ds:[ebx+0x40211A]        ;  再次来找后面的字符也就是第二个0x1开始的字符
00401142   .  3C 00         cmp al,0x0
00401144   .  74 09         je short DueList_.0040114F
00401146   .  3C 01         cmp al,0x1
00401148   .^ 74 F2         je short DueList_.0040113C
0040114A   .  03F0          add esi,eax
0040114C   .  43            inc ebx
0040114D   .^ EB ED         jmp short DueList_.0040113C
0040114F   >  81FE B2010000 cmp esi,0x1B2                            ;  比较是不是等于0x1b2
00401155   .^ 75 A0         jnz short DueList_.004010F7

1 2 3 4 代表了四个循环

长度大于18 两个以上 0x1
根据第二部分求出名字 最多是15个字符
第一部分需要等于0x1d5

注册机自己还没想出来 想出来就补充

你可能感兴趣的:(逆向之旅)