我这里和大家声明一下 我这个是文件 是来自吾爱破解的creakme 160 导航链接 帖子里面有更厉害的思路
本帖是编号为47的creakme
这个creakme 我感觉到的难度主要是自己需要创建一个文件
Creatfilea这个大家可以百度一下 如果文件不存在的话 这个函数是不会自己创建的 然后从fliename 我们可以把它的名字给猜出来 创建的文件如下(要和源文件一块 在一个文件夹)
然后我们求出来这个之后 再分析这个程序就很简单了 我们往下走就可以 算法内容我就写到了od里面
004010A9 . E8 2F020000 call <jmp.&KERNEL32.ReadFile> ; \下面应该就是重点了(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_.<ModuleEntryPoint>
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_.<ModuleEntryPoint>
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 <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
0040110A . E8 AA010000 call <jmp.&KERNEL32.ExitProcess> ; \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_.<ModuleEntryPoint>
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
注册机自己还没想出来 想出来就补充