hrbx 发表于 2007-11-18 12:13:29

易课堂之CrackMe简单算法分析+VB注册机源码

【破文标题】易课堂之CrackMe简单算法分析+VB注册机源码
【破解作者】hrbx
【使用工具】OllDbg1.10、Peid
【破解日期】2007-11-17
【下载地址】https://www.chinapyg.com/viewthread.php?tid=22201
【软件简介】易课堂之CrackMe
-----------------------------------------------------------------------------------------------
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
-----------------------------------------------------------------------------------------------
【破解过程】
1.脱壳。用PEID扫描,显示为:Microsoft Visual C++ 6.0 ,实际上是易语言的程序,因为调试时可以见到易语言的krnln库。
2.追出算法。OD载入CrackMe,Alt+M打开内存映射,找到.ecode段F2下断:

==========================================================================================
地址         大小(十进制)      物主         区段      类型       访问      初始访问
0040C000    00002000 (8192.)   CrackMe0      .ecode       Imag      R         RWE
===========================================================================================

F9运行,输入注册信息:

====================================================
注册名:hrbx
注册码:9876543210
====================================================

点击"进入"按钮,立即中断:

0040C88E   55                push ebp                         ; F2在.ecode段下断,中断在这里
0040C88F   8BEC            mov ebp,esp
0040C891   81EC D0000000   sub esp,0D0

---------------------------------------------------------------------

省略部分代码

---------------------------------------------------------------------

0040CB6B   6A 00             push 0
0040CB6D   8B45 F0         mov eax,dword ptr ss:
0040CB70   85C0            test eax,eax
0040CB72   75 05             jnz short CrackMe0.0040CB79
0040CB74   B8 D4C04000       mov eax,CrackMe0.0040C0D4      ; 用户名"hrbx"
0040CB79   50                push eax
0040CB7A   68 01000000       push 1
0040CB7F   BB 30010000       mov ebx,130
0040CB84   E8 B00B0000       call CrackMe0.0040D739         ; 获取用户名长度
0040CB89   83C4 10         add esp,10
0040CB8C   8945 EC         mov dword ptr ss:,eax    ; EAX=0x4
0040CB8F   6A FF             push -1
0040CB91   6A 08             push 8
0040CB93   68 03000116       push 16010003
0040CB98   68 01000152       push 52010001
0040CB9D   E8 A30B0000       call CrackMe0.0040D745         ; 假码"9876543210"
0040CBA2   83C4 10         add esp,10
0040CBA5   8985 7CFFFFFF   mov dword ptr ss:,eax
0040CBAB   8B85 7CFFFFFF   mov eax,dword ptr ss:
0040CBB1   50                push eax
0040CBB2   8B5D E8         mov ebx,dword ptr ss:
0040CBB5   85DB            test ebx,ebx
0040CBB7   74 09             je short CrackMe0.0040CBC2
0040CBB9   53                push ebx
0040CBBA   E8 740B0000       call CrackMe0.0040D733
0040CBBF   83C4 04         add esp,4
0040CBC2   58                pop eax
0040CBC3   8945 E8         mov dword ptr ss:,eax
0040CBC6   68 04000080       push 80000004
0040CBCB   6A 00             push 0
0040CBCD   8B45 E8         mov eax,dword ptr ss:
0040CBD0   85C0            test eax,eax
0040CBD2   75 05             jnz short CrackMe0.0040CBD9
0040CBD4   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040CBD9   50                push eax
0040CBDA   68 01000000       push 1
0040CBDF   BB 30010000       mov ebx,130
0040CBE4   E8 500B0000       call CrackMe0.0040D739         ; 获取假码"9876543210"长度
0040CBE9   83C4 10         add esp,10
0040CBEC   8945 E4         mov dword ptr ss:,eax    ; EAX=0xA
0040CBEF   DB45 E4         fild dword ptr ss:       ; 假码长度
0040CBF2   DD9D 78FFFFFF   fstp qword ptr ss:       ; st=10.0
0040CBF8   DD85 78FFFFFF   fld qword ptr ss:
0040CBFE   DC25 2DC14000   fsub qword ptr ds:       ; 假码长度减1,ds:=1.0
0040CC04   DD9D 70FFFFFF   fstp qword ptr ss:       ; st=9.0
0040CC0A   DD85 70FFFFFF   fld qword ptr ss:
0040CC10   E8 52FCFFFF       call CrackMe0.0040C867
0040CC15   68 01030080       push 80000301
0040CC1A   6A 00             push 0
0040CC1C   50                push eax
0040CC1D   68 04000080       push 80000004
0040CC22   6A 00             push 0
0040CC24   8B45 E8         mov eax,dword ptr ss:
0040CC27   85C0            test eax,eax
0040CC29   75 05             jnz short CrackMe0.0040CC30
0040CC2B   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040CC30   50                push eax                         ; 假码"9876543210"
0040CC31   68 02000000       push 2
0040CC36   BB 38010000       mov ebx,138
0040CC3B   E8 F90A0000       call CrackMe0.0040D739         ; 取去掉假码第一位的字符串
0040CC40   83C4 1C         add esp,1C
0040CC43   8985 6CFFFFFF   mov dword ptr ss:,eax    ; "876543210"
0040CC49   8B85 6CFFFFFF   mov eax,dword ptr ss:
0040CC4F   50                push eax
0040CC50   8B5D E0         mov ebx,dword ptr ss:
0040CC53   85DB            test ebx,ebx
0040CC55   74 09             je short CrackMe0.0040CC60
0040CC57   53                push ebx
0040CC58   E8 D60A0000       call CrackMe0.0040D733
0040CC5D   83C4 04         add esp,4
0040CC60   58                pop eax
0040CC61   8945 E0         mov dword ptr ss:,eax
0040CC64   837D EC 01      cmp dword ptr ss:,1
0040CC68   0F8C AB090000   jl CrackMe0.0040D619
0040CC6E   8B45 EC         mov eax,dword ptr ss:
0040CC71   3945 DC         cmp dword ptr ss:,eax
0040CC74   0F8F 7E000000   jg CrackMe0.0040CCF8
0040CC7A   68 01030080       push 80000301
0040CC7F   6A 00             push 0
0040CC81   FF75 DC         push dword ptr ss:
0040CC84   68 04000080       push 80000004
0040CC89   6A 00             push 0
0040CC8B   8B45 F0         mov eax,dword ptr ss:
0040CC8E   85C0            test eax,eax
0040CC90   75 05             jnz short CrackMe0.0040CC97
0040CC92   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040CC97   50                push eax                         ; 用户名"hrbx"
0040CC98   68 02000000       push 2
0040CC9D   BB 44010000       mov ebx,144
0040CCA2   E8 920A0000       call CrackMe0.0040D739         ; 依次取用户名每一位字符的ASCII值
0040CCA7   83C4 1C         add esp,1C
0040CCAA   8845 D8         mov byte ptr ss:,al      ; al=68 ('h')
0040CCAD   DB45 D4         fild dword ptr ss:
0040CCB0   DD9D 78FFFFFF   fstp qword ptr ss:
0040CCB6   DD85 78FFFFFF   fld qword ptr ss:
0040CCBC   8B45 D8         mov eax,dword ptr ss:
0040CCBF   25 FF000000       and eax,0FF
0040CCC4   8985 70FFFFFF   mov dword ptr ss:,eax
0040CCCA   DB85 70FFFFFF   fild dword ptr ss:
0040CCD0   DD9D 70FFFFFF   fstp qword ptr ss:
0040CCD6   DC85 70FFFFFF   fadd qword ptr ss:       ; 用户名每一位字符的ASCII值累加,记为Sum
0040CCDC   DD9D 68FFFFFF   fstp qword ptr ss:       ; Sum=436.0
0040CCE2   DD85 68FFFFFF   fld qword ptr ss:
0040CCE8   E8 7AFBFFFF       call CrackMe0.0040C867
0040CCED   8945 D4         mov dword ptr ss:,eax
0040CCF0   FF45 DC         inc dword ptr ss:
0040CCF3   ^ E9 76FFFFFF       jmp CrackMe0.0040CC6E
0040CCF8   DB45 EC         fild dword ptr ss:
0040CCFB   DD9D 78FFFFFF   fstp qword ptr ss:
0040CD01   DD85 78FFFFFF   fld qword ptr ss:
0040CD07   DC25 2DC14000   fsub qword ptr ds:
0040CD0D   DD9D 70FFFFFF   fstp qword ptr ss:
0040CD13   DB45 D0         fild dword ptr ss:
0040CD16   DD9D 68FFFFFF   fstp qword ptr ss:
0040CD1C   DD85 68FFFFFF   fld qword ptr ss:
0040CD22   DCA5 70FFFFFF   fsub qword ptr ss:
0040CD28   DC1D 35C14000   fcomp qword ptr ds:
0040CD2E   DFE0            fstsw ax
0040CD30   F6C4 41         test ah,41
0040CD33   0F84 54040000   je CrackMe0.0040D18D
0040CD39   DB45 D0         fild dword ptr ss:
0040CD3C   DD9D 78FFFFFF   fstp qword ptr ss:
0040CD42   DD85 78FFFFFF   fld qword ptr ss:
0040CD48   DC05 2DC14000   fadd qword ptr ds:
0040CD4E   DD9D 70FFFFFF   fstp qword ptr ss:
0040CD54   DD85 70FFFFFF   fld qword ptr ss:
0040CD5A   E8 08FBFFFF       call CrackMe0.0040C867
0040CD5F   68 01030080       push 80000301
0040CD64   6A 00             push 0
0040CD66   50                push eax
0040CD67   68 04000080       push 80000004
0040CD6C   6A 00             push 0
0040CD6E   8B45 F0         mov eax,dword ptr ss:
0040CD71   85C0            test eax,eax
0040CD73   75 05             jnz short CrackMe0.0040CD7A
0040CD75   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040CD7A   50                push eax
0040CD7B   68 02000000       push 2
0040CD80   BB 44010000       mov ebx,144
0040CD85   E8 AF090000       call CrackMe0.0040D739         ; 依次取用户名每一位字符的ASCII值,记为Num1
0040CD8A   83C4 1C         add esp,1C                     ; 设N为每一位字符在用户名中的位置
0040CD8D   8845 CC         mov byte ptr ss:,al
0040CD90   DB45 D0         fild dword ptr ss:
0040CD93   DD9D 78FFFFFF   fstp qword ptr ss:
0040CD99   DD85 78FFFFFF   fld qword ptr ss:
0040CD9F   DC0D 3DC14000   fmul qword ptr ds:       ; (N-1)*3.0,ds:=3.0
0040CDA5   DD9D 70FFFFFF   fstp qword ptr ss:
0040CDAB   DD85 70FFFFFF   fld qword ptr ss:
0040CDB1   E8 B1FAFFFF       call CrackMe0.0040C867         ; 根据(N-1)*3.0乘积结果在固定字符串中取字符
0040CDB6   68 01030080       push 80000301                  
0040CDBB   6A 00             push 0
0040CDBD   50                push eax                         ; 固定字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
0040CDBE   68 04000080       push 80000004
0040CDC3   6A 00             push 0
0040CDC5   8B45 F4         mov eax,dword ptr ss:
0040CDC8   85C0            test eax,eax
0040CDCA   75 05             jnz short CrackMe0.0040CDD1
0040CDCC   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040CDD1   50                push eax
0040CDD2   68 02000000       push 2
0040CDD7   BB 44010000       mov ebx,144
0040CDDC   E8 58090000       call CrackMe0.0040D739         ; 取出的字符的ASCII值,记为Num2
0040CDE1   83C4 1C         add esp,1C                        ; 当(N-1)=0时,Num2=0
0040CDE4   8845 C8         mov byte ptr ss:,al
0040CDE7   8B45 C8         mov eax,dword ptr ss:
0040CDEA   25 FF000000       and eax,0FF
0040CDEF   68 01030080       push 80000301
0040CDF4   6A 00             push 0
0040CDF6   50                push eax
0040CDF7   8B45 CC         mov eax,dword ptr ss:
0040CDFA   25 FF000000       and eax,0FF
0040CDFF   68 01030080       push 80000301
0040CE04   6A 00             push 0
0040CE06   50                push eax
0040CE07   68 02000000       push 2
0040CE0C   BB CC000000       mov ebx,0CC
0040CE11   E8 23090000       call CrackMe0.0040D739                ; Num1 Xor Num2,结果记为Num3
0040CE16   83C4 1C         add esp,1C
0040CE19   99                cdq
0040CE1A   8945 C0         mov dword ptr ss:,eax
0040CE1D   8955 C4         mov dword ptr ss:,edx
0040CE20   DB45 D0         fild dword ptr ss:
0040CE23   DD9D 78FFFFFF   fstp qword ptr ss:
0040CE29   DD85 78FFFFFF   fld qword ptr ss:
0040CE2F   DC25 2DC14000   fsub qword ptr ds:       ; (N-1-1.0),ds:=1.0
0040CE35   DD9D 70FFFFFF   fstp qword ptr ss:
0040CE3B   DB45 D4         fild dword ptr ss:
0040CE3E   DD9D 68FFFFFF   fstp qword ptr ss:       ; 用户名所有字符的ASCII值累加之和,Sum
0040CE44   DD85 68FFFFFF   fld qword ptr ss:
0040CE4A   DC8D 70FFFFFF   fmul qword ptr ss:       ; Sum*(N-1-1.0)
0040CE50   DD9D 60FFFFFF   fstp qword ptr ss:
0040CE56   68 01030080       push 80000301
0040CE5B   6A 00             push 0
0040CE5D   68 FFFFFFFF       push -1
0040CE62   DD85 60FFFFFF   fld qword ptr ss:
0040CE68   E8 FAF9FFFF       call CrackMe0.0040C867         ; 转为16进制数
0040CE6D   68 01030080       push 80000301
0040CE72   6A 00             push 0
0040CE74   50                push eax
0040CE75   68 02000000       push 2
0040CE7A   BB CC000000       mov ebx,0CC
0040CE7F   E8 B5080000       call CrackMe0.0040D739         ; 取反,Not(Sum*(N-1-1.0))
0040CE84   83C4 1C         add esp,1C
0040CE87   99                cdq
0040CE88   8945 B8         mov dword ptr ss:,eax
0040CE8B   8955 BC         mov dword ptr ss:,edx
0040CE8E   DB45 D0         fild dword ptr ss:
0040CE91   DD9D 78FFFFFF   fstp qword ptr ss:
0040CE97   DD85 78FFFFFF   fld qword ptr ss:
0040CE9D   DC05 3DC14000   fadd qword ptr ds:       ; (N-1+3.0),ds:=3.0
0040CEA3   DD9D 70FFFFFF   fstp qword ptr ss:
0040CEA9   DB45 EC         fild dword ptr ss:       ; 用户名长度Len
0040CEAC   DD9D 68FFFFFF   fstp qword ptr ss:
0040CEB2   DD85 68FFFFFF   fld qword ptr ss:
0040CEB8   DC8D 70FFFFFF   fmul qword ptr ss:       ; (N-1+3.0)*Len
0040CEBE   8B45 CC         mov eax,dword ptr ss:    ; 用户名每一位字符的ASCII值,Num1
0040CEC1   25 FF000000       and eax,0FF
0040CEC6   8985 60FFFFFF   mov dword ptr ss:,eax
0040CECC   DB85 60FFFFFF   fild dword ptr ss:
0040CED2   DD9D 60FFFFFF   fstp qword ptr ss:
0040CED8   DC8D 60FFFFFF   fmul qword ptr ss:       ; (N-1+3.0)*Len*Num1
0040CEDE   DD9D 58FFFFFF   fstp qword ptr ss:
0040CEE4   DF6D C0         fild qword ptr ss:
0040CEE7   DD9D 50FFFFFF   fstp qword ptr ss:
0040CEED   DD85 50FFFFFF   fld qword ptr ss:
0040CEF3   DF6D B8         fild qword ptr ss:
0040CEF6   DD9D 48FFFFFF   fstp qword ptr ss:
0040CEFC   DC85 48FFFFFF   fadd qword ptr ss:       ; Num3+Not((Sum*(N-1-1.0)))
0040CF02   DC85 58FFFFFF   fadd qword ptr ss:       ; Num3+Not((Sum*(N-1-1.0)))+(N-1+3.0)*Len*Num1
0040CF08   DC05 45C14000   fadd qword ptr ds:       ; Num3+Not((Sum*(N-1-1.0)))+(N-1+3.0)*Len*Num1+333.0
0040CF0E   DD9D 40FFFFFF   fstp qword ptr ss:       ; ds:=333.0
0040CF14   68 01060080       push 80000601                  ; 上面运算结果记为TmpNum
0040CF19   68 00002440       push 40240000
0040CF1E   68 00000000       push 0
0040CF23   68 01060080       push 80000601
0040CF28   FFB5 44FFFFFF   push dword ptr ss:
0040CF2E   FFB5 40FFFFFF   push dword ptr ss:
0040CF34   68 02000000       push 2
0040CF39   BB 48000000       mov ebx,48
0040CF3E   E8 F6070000       call CrackMe0.0040D739         ; TmpNum Mod 10.0
0040CF43   83C4 1C         add esp,1C
0040CF46   8985 38FFFFFF   mov dword ptr ss:,eax
0040CF4C   8995 3CFFFFFF   mov dword ptr ss:,edx
0040CF52   DD85 38FFFFFF   fld qword ptr ss:
0040CF58   DC05 4DC14000   fadd qword ptr ds:
0040CF5E   DD9D 30FFFFFF   fstp qword ptr ss:
0040CF64   DD85 30FFFFFF   fld qword ptr ss:
0040CF6A   E8 F8F8FFFF       call CrackMe0.0040C867         ; 取Mod 结果的ASCII值
0040CF6F   8845 B4         mov byte ptr ss:,al      ; ASC(TmpNum Mod 10.0)
0040CF72   68 01030080       push 80000301
0040CF77   6A 00             push 0
0040CF79   68 ACAD0000       push 0ADAC
0040CF7E   8B45 B4         mov eax,dword ptr ss:
0040CF81   25 FF000000       and eax,0FF
0040CF86   68 01030080       push 80000301
0040CF8B   6A 00             push 0
0040CF8D   50                push eax
0040CF8E   68 02000000       push 2
0040CF93   BB CC000000       mov ebx,0CC
0040CF98   E8 9C070000       call CrackMe0.0040D739         ; ASC(TmpNum Mod 10.0) Xor 0xADAC
0040CF9D   83C4 1C         add esp,1C
0040CFA0   8985 7CFFFFFF   mov dword ptr ss:,eax
0040CFA6   DB45 D0         fild dword ptr ss:
0040CFA9   DD9D 74FFFFFF   fstp qword ptr ss:
0040CFAF   DD85 74FFFFFF   fld qword ptr ss:      ; 每一位字符在用户名中的位置N
0040CFB5   DC05 55C14000   fadd qword ptr ds:       ; (N+2.0),ds:=2.0
0040CFBB   DD9D 6CFFFFFF   fstp qword ptr ss:
0040CFC1   DB85 7CFFFFFF   fild dword ptr ss:
0040CFC7   DD9D 64FFFFFF   fstp qword ptr ss:
0040CFCD   DD85 64FFFFFF   fld qword ptr ss:
0040CFD3   DC8D 6CFFFFFF   fmul qword ptr ss:       ; (ASC(TmpNum Mod 10.0) Xor 0xADAC)*(N-1+2.0)
0040CFD9   DD9D 5CFFFFFF   fstp qword ptr ss:
0040CFDF   68 01060080       push 80000601
0040CFE4   68 00002440       push 40240000
0040CFE9   68 00000000       push 0
0040CFEE   68 01060080       push 80000601
0040CFF3   FFB5 60FFFFFF   push dword ptr ss:
0040CFF9   FFB5 5CFFFFFF   push dword ptr ss:
0040CFFF   68 02000000       push 2
0040D004   BB 48000000       mov ebx,48
0040D009   E8 2B070000       call CrackMe0.0040D739         ; ((ASC(TmpNum Mod 10.0) Xor 0xADAC)*(N-1+2.0))Mod 10.0
0040D00E   83C4 1C         add esp,1C
0040D011   8985 54FFFFFF   mov dword ptr ss:,eax
0040D017   8995 58FFFFFF   mov dword ptr ss:,edx
0040D01D   DD85 54FFFFFF   fld qword ptr ss:
0040D023   DC05 4DC14000   fadd qword ptr ds:
0040D029   DD9D 4CFFFFFF   fstp qword ptr ss:
0040D02F   DD85 4CFFFFFF   fld qword ptr ss:
0040D035   E8 2DF8FFFF       call CrackMe0.0040C867         ; 取Mod 结果的ASCII值,即数字转为字符
0040D03A   8945 B0         mov dword ptr ss:,eax    ; ASC((ASC(TmpNum Mod 10.0) Xor 0xADAC)*(N-1+2.0))Mod 10.0)
0040D03D   68 01030080       push 80000301                  ; 0x8--->"8"
0040D042   6A 00             push 0
0040D044   FF75 B0         push dword ptr ss:
0040D047   68 01000000       push 1
0040D04C   BB D4010000       mov ebx,1D4
0040D051   E8 E3060000       call CrackMe0.0040D739
0040D056   83C4 10         add esp,10
0040D059   8985 7CFFFFFF   mov dword ptr ss:,eax
0040D05F   8B85 7CFFFFFF   mov eax,dword ptr ss:
0040D065   50                push eax
0040D066   8B5D AC         mov ebx,dword ptr ss:
0040D069   85DB            test ebx,ebx
0040D06B   74 09             je short CrackMe0.0040D076
0040D06D   53                push ebx
0040D06E   E8 C0060000       call CrackMe0.0040D733
0040D073   83C4 04         add esp,4
0040D076   58                pop eax
0040D077   8945 AC         mov dword ptr ss:,eax
0040D07A   68 01030080       push 80000301
0040D07F   6A 00             push 0
0040D081   68 01000000       push 1
0040D086   68 04000080       push 80000004
0040D08B   6A 00             push 0
0040D08D   8B45 AC         mov eax,dword ptr ss:
0040D090   85C0            test eax,eax
0040D092   75 05             jnz short CrackMe0.0040D099
0040D094   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D099   50                push eax
0040D09A   68 02000000       push 2
0040D09F   BB 38010000       mov ebx,138
0040D0A4   E8 90060000       call CrackMe0.0040D739
0040D0A9   83C4 1C         add esp,1C
0040D0AC   8985 7CFFFFFF   mov dword ptr ss:,eax
0040D0B2   8B85 7CFFFFFF   mov eax,dword ptr ss:
0040D0B8   50                push eax
0040D0B9   8B5D A8         mov ebx,dword ptr ss:
0040D0BC   85DB            test ebx,ebx
0040D0BE   74 09             je short CrackMe0.0040D0C9
0040D0C0   53                push ebx
0040D0C1   E8 6D060000       call CrackMe0.0040D733
0040D0C6   83C4 04         add esp,4
0040D0C9   58                pop eax
0040D0CA   8945 A8         mov dword ptr ss:,eax
0040D0CD   68 04000080       push 80000004
0040D0D2   6A 00             push 0
0040D0D4   8B45 A4         mov eax,dword ptr ss:
0040D0D7   85C0            test eax,eax
0040D0D9   75 05             jnz short CrackMe0.0040D0E0
0040D0DB   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D0E0   50                push eax
0040D0E1   68 01000000       push 1
0040D0E6   BB 68010000       mov ebx,168
0040D0EB   E8 49060000       call CrackMe0.0040D739
0040D0F0   83C4 10         add esp,10
0040D0F3   8985 7CFFFFFF   mov dword ptr ss:,eax
0040D0F9   68 04000080       push 80000004
0040D0FE   6A 00             push 0
0040D100   8B45 A8         mov eax,dword ptr ss:
0040D103   85C0            test eax,eax
0040D105   75 05             jnz short CrackMe0.0040D10C
0040D107   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D10C   50                push eax
0040D10D   68 01000000       push 1
0040D112   BB 68010000       mov ebx,168
0040D117   E8 1D060000       call CrackMe0.0040D739
0040D11C   83C4 10         add esp,10
0040D11F   8985 78FFFFFF   mov dword ptr ss:,eax
0040D125   FFB5 78FFFFFF   push dword ptr ss:
0040D12B   FFB5 7CFFFFFF   push dword ptr ss:
0040D131   B9 02000000       mov ecx,2
0040D136   E8 D0F6FFFF       call CrackMe0.0040C80B         ; 依次连接每次得到的字符
0040D13B   83C4 08         add esp,8                        ; 得到的字符串1,"8345"
0040D13E   8985 74FFFFFF   mov dword ptr ss:,eax
0040D144   8B9D 7CFFFFFF   mov ebx,dword ptr ss:
0040D14A   85DB            test ebx,ebx
0040D14C   74 09             je short CrackMe0.0040D157
0040D14E   53                push ebx
0040D14F   E8 DF050000       call CrackMe0.0040D733
0040D154   83C4 04         add esp,4
0040D157   8B9D 78FFFFFF   mov ebx,dword ptr ss:
0040D15D   85DB            test ebx,ebx
0040D15F   74 09             je short CrackMe0.0040D16A
0040D161   53                push ebx
0040D162   E8 CC050000       call CrackMe0.0040D733
0040D167   83C4 04         add esp,4
0040D16A   8B85 74FFFFFF   mov eax,dword ptr ss:
0040D170   50                push eax
0040D171   8B5D A4         mov ebx,dword ptr ss:
0040D174   85DB            test ebx,ebx
0040D176   74 09             je short CrackMe0.0040D181
0040D178   53                push ebx
0040D179   E8 B5050000       call CrackMe0.0040D733
0040D17E   83C4 04         add esp,4
0040D181   58                pop eax
0040D182   8945 A4         mov dword ptr ss:,eax
0040D185   FF45 D0         inc dword ptr ss:
0040D188   ^ E9 6BFBFFFF       jmp CrackMe0.0040CCF8
0040D18D   DB45 D4         fild dword ptr ss:       ; 用户名所有字符的ASCII值累加之和,Sum
0040D190   DD9D 78FFFFFF   fstp qword ptr ss:
0040D196   DD85 78FFFFFF   fld qword ptr ss:
0040D19C   DB45 EC         fild dword ptr ss:
0040D19F   DD9D 70FFFFFF   fstp qword ptr ss:       ; 用户名长度Len
0040D1A5   DC8D 70FFFFFF   fmul qword ptr ss:       ; Sum*Len
0040D1AB   DD9D 68FFFFFF   fstp qword ptr ss:
0040D1B1   68 01060080       push 80000601
0040D1B6   68 00005940       push 40590000
0040D1BB   68 00000000       push 0
0040D1C0   68 01060080       push 80000601
0040D1C5   FFB5 6CFFFFFF   push dword ptr ss:
0040D1CB   FFB5 68FFFFFF   push dword ptr ss:
0040D1D1   68 02000000       push 2
0040D1D6   BB 48000000       mov ebx,48
0040D1DB   E8 59050000       call CrackMe0.0040D739         ; (Sum*Len) Mod 100.0
0040D1E0   83C4 1C         add esp,1C
0040D1E3   8985 60FFFFFF   mov dword ptr ss:,eax
0040D1E9   8995 64FFFFFF   mov dword ptr ss:,edx
0040D1EF   DD85 60FFFFFF   fld qword ptr ss:
0040D1F5   DC05 4DC14000   fadd qword ptr ds:       ; (Sum*Len) Mod 100.0+48.0,ds:=48.0
0040D1FB   DD9D 58FFFFFF   fstp qword ptr ss:
0040D201   DD85 58FFFFFF   fld qword ptr ss:
0040D207   E8 5BF6FFFF       call CrackMe0.0040C867
0040D20C   8945 A0         mov dword ptr ss:,eax
0040D20F   68 04000080       push 80000004
0040D214   6A 00             push 0
0040D216   8B45 A4         mov eax,dword ptr ss:
0040D219   85C0            test eax,eax
0040D21B   75 05             jnz short CrackMe0.0040D222
0040D21D   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D222   50                push eax
0040D223   68 01000000       push 1
0040D228   BB 68010000       mov ebx,168
0040D22D   E8 07050000       call CrackMe0.0040D739         ; 字符串1,"8345"
0040D232   83C4 10         add esp,10
0040D235   8985 7CFFFFFF   mov dword ptr ss:,eax
0040D23B   68 01030080       push 80000301
0040D240   6A 00             push 0
0040D242   FF75 A0         push dword ptr ss:
0040D245   68 01000000       push 1
0040D24A   BB 68010000       mov ebx,168
0040D24F   E8 E5040000       call CrackMe0.0040D739         ; (Sum*Len) Mod 100.0+48.0转为字符串
0040D254   83C4 10         add esp,10                     ; 得到的字符串2,"92"
0040D257   8985 78FFFFFF   mov dword ptr ss:,eax
0040D25D   FFB5 78FFFFFF   push dword ptr ss:
0040D263   68 5DC14000       push CrackMe0.0040C15D
0040D268   FFB5 7CFFFFFF   push dword ptr ss:
0040D26E   B9 03000000       mov ecx,3
0040D273   E8 93F5FFFF       call CrackMe0.0040C80B         ; 用"-"连接字符串1,字符串2
0040D278   83C4 0C         add esp,0C
0040D27B   8985 74FFFFFF   mov dword ptr ss:,eax    ; 得到的新字符串3,"8345-92"
0040D281   8B9D 7CFFFFFF   mov ebx,dword ptr ss:
0040D287   85DB            test ebx,ebx
0040D289   74 09             je short CrackMe0.0040D294
0040D28B   53                push ebx
0040D28C   E8 A2040000       call CrackMe0.0040D733
0040D291   83C4 04         add esp,4
0040D294   8B9D 78FFFFFF   mov ebx,dword ptr ss:
0040D29A   85DB            test ebx,ebx
0040D29C   74 09             je short CrackMe0.0040D2A7
0040D29E   53                push ebx
0040D29F   E8 8F040000       call CrackMe0.0040D733
0040D2A4   83C4 04         add esp,4
0040D2A7   8B85 74FFFFFF   mov eax,dword ptr ss:
0040D2AD   50                push eax
0040D2AE   8B5D 9C         mov ebx,dword ptr ss:
0040D2B1   85DB            test ebx,ebx
0040D2B3   74 09             je short CrackMe0.0040D2BE
0040D2B5   53                push ebx
0040D2B6   E8 78040000       call CrackMe0.0040D733
0040D2BB   83C4 04         add esp,4
0040D2BE   58                pop eax
0040D2BF   8945 9C         mov dword ptr ss:,eax
0040D2C2   68 04000080       push 80000004
0040D2C7   6A 00             push 0
0040D2C9   8B45 9C         mov eax,dword ptr ss:
0040D2CC   85C0            test eax,eax
0040D2CE   75 05             jnz short CrackMe0.0040D2D5
0040D2D0   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D2D5   50                push eax                         ; 字符串3,"8345-92"
0040D2D6   68 01000000       push 1
0040D2DB   BB 30010000       mov ebx,130
0040D2E0   E8 54040000       call CrackMe0.0040D739         ; 获取字符串3长度
0040D2E5   83C4 10         add esp,10
0040D2E8   8945 98         mov dword ptr ss:,eax
0040D2EB   8B45 98         mov eax,dword ptr ss:
0040D2EE   3945 94         cmp dword ptr ss:,eax
0040D2F1   0F8D 77010000   jge CrackMe0.0040D46E
0040D2F7   FF45 94         inc dword ptr ss:
0040D2FA   68 01030080       push 80000301
0040D2FF   6A 00             push 0
0040D301   FF75 94         push dword ptr ss:
0040D304   68 04000080       push 80000004
0040D309   6A 00             push 0
0040D30B   8B45 9C         mov eax,dword ptr ss:
0040D30E   85C0            test eax,eax
0040D310   75 05             jnz short CrackMe0.0040D317
0040D312   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D317   50                push eax
0040D318   68 02000000       push 2
0040D31D   BB 44010000       mov ebx,144
0040D322   E8 12040000       call CrackMe0.0040D739         ; 依次取字符串3每一位字符的ASCII值
0040D327   83C4 1C         add esp,1C
0040D32A   8845 B4         mov byte ptr ss:,al
0040D32D   68 01030080       push 80000301
0040D332   6A 00             push 0
0040D334   68 20000000       push 20                        ; 常数,0x20
0040D339   8B45 B4         mov eax,dword ptr ss:
0040D33C   25 FF000000       and eax,0FF
0040D341   68 01030080       push 80000301
0040D346   6A 00             push 0
0040D348   50                push eax
0040D349   68 02000000       push 2
0040D34E   BB CC000000       mov ebx,0CC
0040D353   E8 E1030000       call CrackMe0.0040D739         ; 字符串3每一位字符的ASCII值减去0x20
0040D358   83C4 1C         add esp,1C
0040D35B   8985 7CFFFFFF   mov dword ptr ss:,eax
0040D361   68 01060080       push 80000601
0040D366   68 00002440       push 40240000
0040D36B   68 00000000       push 0
0040D370   DB85 7CFFFFFF   fild dword ptr ss:
0040D376   DD9D 74FFFFFF   fstp qword ptr ss:
0040D37C   68 01060080       push 80000601
0040D381   FFB5 78FFFFFF   push dword ptr ss:
0040D387   FFB5 74FFFFFF   push dword ptr ss:
0040D38D   68 02000000       push 2
0040D392   BB 48000000       mov ebx,48
0040D397   E8 9D030000       call CrackMe0.0040D739         ; (字符串3每一位字符的ASCII值减去0x20) Mod 10.0
0040D39C   83C4 1C         add esp,1C
0040D39F   8985 6CFFFFFF   mov dword ptr ss:,eax
0040D3A5   8995 70FFFFFF   mov dword ptr ss:,edx
0040D3AB   DD85 6CFFFFFF   fld qword ptr ss:
0040D3B1   DC05 4DC14000   fadd qword ptr ds:
0040D3B7   DD9D 64FFFFFF   fstp qword ptr ss:
0040D3BD   DD85 64FFFFFF   fld qword ptr ss:
0040D3C3   E8 9FF4FFFF       call CrackMe0.0040C867         ; 取Mod 结果的ASCII值
0040D3C8   8945 8C         mov dword ptr ss:,eax
0040D3CB   8955 90         mov dword ptr ss:,edx
0040D3CE   68 01030080       push 80000301
0040D3D3   6A 00             push 0
0040D3D5   FF75 94         push dword ptr ss:
0040D3D8   68 04000080       push 80000004
0040D3DD   6A 00             push 0
0040D3DF   8B45 E0         mov eax,dword ptr ss:
0040D3E2   85C0            test eax,eax
0040D3E4   75 05             jnz short CrackMe0.0040D3EB
0040D3E6   B8 D4C04000       mov eax,CrackMe0.0040C0D4
0040D3EB   50                push eax                         ; 假码"9876543210"
0040D3EC   68 02000000       push 2
0040D3F1   BB 44010000       mov ebx,144
0040D3F6   E8 3E030000       call CrackMe0.0040D739         ; 依次取假码每一位字符的ASCII值
0040D3FB   83C4 1C         add esp,1C
0040D3FE   68 01030080       push 80000301
0040D403   6A 00             push 0
0040D405   50                push eax
0040D406   68 01000000       push 1
0040D40B   BB 64010000       mov ebx,164
0040D410   E8 24030000       call CrackMe0.0040D739
0040D415   83C4 10         add esp,10
0040D418   8985 6CFFFFFF   mov dword ptr ss:,eax
0040D41E   8995 70FFFFFF   mov dword ptr ss:,edx
0040D424   DD85 6CFFFFFF   fld qword ptr ss:
0040D42A   E8 38F4FFFF       call CrackMe0.0040C867
0040D42F   8945 88         mov dword ptr ss:,eax
0040D432   8B45 88         mov eax,dword ptr ss:
0040D435   99                cdq
0040D436   8985 78FFFFFF   mov dword ptr ss:,eax
0040D43C   8995 7CFFFFFF   mov dword ptr ss:,edx
0040D442   8B55 90         mov edx,dword ptr ss:
0040D445   8B45 8C         mov eax,dword ptr ss:
0040D448   3985 78FFFFFF   cmp dword ptr ss:,eax    ; 两者比较,在这里可找出明码
0040D44E   75 06             jnz short CrackMe0.0040D456      ; 不等则Over,暴破点,Nop掉
0040D450   3995 7CFFFFFF   cmp dword ptr ss:,edx
0040D456   0F85 08000000   jnz CrackMe0.0040D464
0040D45C   FF45 84         inc dword ptr ss:
0040D45F   E9 05000000       jmp CrackMe0.0040D469
0040D464   E9 05000000       jmp CrackMe0.0040D46E
0040D469   ^ E9 7DFEFFFF       jmp CrackMe0.0040D2EB
0040D46E   8B45 98         mov eax,dword ptr ss:
0040D471   3945 84         cmp dword ptr ss:,eax
0040D474   0F85 9A010000   jnz CrackMe0.0040D614
0040D47A   68 04000080       push 80000004
0040D47F   6A 00             push 0
0040D481   68 5FC14000       push CrackMe0.0040C15F
0040D486   68 01030080       push 80000301
0040D48B   6A 00             push 0
0040D48D   68 00000000       push 0
0040D492   68 04000080       push 80000004
0040D497   6A 00             push 0
0040D499   68 68C14000       push CrackMe0.0040C168         ; 成功提示"O!!!Good Lucky"
0040D49E   68 03000000       push 3

-----------------------------------------------------------------------------------------------
【破解总结】
1.设用户名长度为Len,依次取用户名每一位字符的ASCII值累加,累加结果记为Sum。
2.依次取用户名每一位字符的ASCII值,记为Num1,取出的字符在用户名中的位置记为N。
3.计算(N-1)*3.0,并根据计算结果在固定字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZ"取相应字符的ASCII值,记为Num2。
若N=1,则Num2=0。
4.进行计算Num1 Xor Num2,结果记为Num3。
5.进行计算TmpNum=Num3+Not((Sum*(N-1-1.0)))+(N-1+3.0)*Len*Num1+333.0。
6.进行计算((ASC(TmpNum Mod 10.0) Xor 0xADAC)*(N-1+2.0))Mod 10.0。
7.取经过第4、5、6步运算结果的数值转为字符依次连接,记为字符串str1。
8.进行计算(Sum*Len) Mod 100.0+48.0,运算结果的数值转为字符串,记为字符串str2。
9.用"-"连接字符串str1,字符串str2,记为字符串str3。
10. (依次取str3每一位字符的ASCII值减去0x20) Mod 10.0,运算结果的数值转为字符串即为真码,记为str4。
11.注册码去掉第1位字符,依次取每一位字符与字符串str4比较,相等则注册成功。

一组可用注册信息:
====================================================
注册名:hrbx
注册码:04901358
====================================================

暴破更改以下位置:

0040D44E             jnz short CrackMe0.0040D456             ; jnz====>Nop

-----------------------------------------------------------------------------------------------
【VB注册机源码】

Private Sub Generate_Click()
Dim UserName As String
Dim Serial As String
Dim TmpStr As String
Dim Str1 As String
Dim Str2 As String
Dim Str3 As String
Dim TmpNum As Double
Dim Length As Long
Dim Sum As Long
Dim Num As Integer
Dim N As Integer
Dim i As Integer

TmpStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

On Error Resume Next

    If Text1.Text = "" Then
      Text2.Text = "请输入用户名!"
    Else
      UserName = Trim(Text1.Text)
      Length = Len(UserName)
      
      For i = 1 To Length
            Sum = Sum + Asc(Mid(UserName, i, 1))
      Next i
      
      For i = 1 To Length
            N = (i - 1) * 3
            
            If N = 0 Then
               Num = Asc(Mid(UserName, 1, 1))
            Else
               Num = Asc(Mid(UserName, i, 1)) Xor Asc(Mid(TmpStr, N, 1))
            End If
         
            TmpNum = Not (Sum * (i - 1 - 1))
            TmpNum = Num + TmpNum + (i - 1 + 3) * Length * Asc(Mid(UserName, i, 1)) + 333
            TmpNum = (Asc(TmpNum Mod 10) Xor &HADAC + 65536) * (i - 1 + 2)
            TmpNum = TmpNum Mod 10
            Str1 = Str1 & CStr(TmpNum)
      Next i

      Str2 = (Sum * Length) Mod 100 + 48
      Str3 = Str1 & "-" & Str2
   
      Length = Len(Str3)

      For i = 1 To Length
            Serial = Serial & (Asc(Mid(Str3, i, 1)) - &H20) Mod 10
      Next i
      
      Randomize
      Serial = Int(10 * Rnd) & Serial
      
      Text2 = Serial
    End If

End Sub
-----------------------------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

[ 本帖最后由 hrbx 于 2007-11-18 12:15 编辑 ]

lvcaolhx 发表于 2007-11-18 12:19:05

兄弟真牛!
向你学习

hrbx 发表于 2007-11-18 13:00:54

截个图,:)

lvcaolhx 发表于 2007-11-19 08:45:41

注意:
用OD载入程序
在OD中F9运行,输入注册信息:

====================================================
注册名:hrbx
注册码:9876543210
====================================================

Alt+M打开内存映射,找到.ecode段F2下断:

==========================================================================================
地址         大小(十进制)      物主         区段      类型       访问      初始访问
0040C000    00002000 (8192.)   CrackMe0      .ecode       Imag      R         RWE
===========================================================================================

点击"进入"按钮,立即中断:

0040C88E   55                push ebp                         ; F2在.ecode段下断,中断在这里

sdprtf 发表于 2007-11-21 21:13:07

好东西,下来看看!!!!
页: [1]
查看完整版本: 易课堂之CrackMe简单算法分析+VB注册机源码