首页
社区
课程
招聘
[原创][原创]一个小CrackMe的分析~~~~
发表于: 2012-7-3 23:56 2873

[原创][原创]一个小CrackMe的分析~~~~

2012-7-3 23:56
2873
004011B3   .  66:3D 0200    CMP AX,2                                 ;  WM_DESTROY
004011B7   .  75 04         JNZ SHORT 004011BD
004011B9   .  EB 27         JMP SHORT 004011E2
004011BB   .  EB 1F         JMP SHORT 004011DC
004011BD   >  66:3D 1000    CMP AX,10                                ;  WM_CLOSE
004011C1   .  75 04         JNZ SHORT 004011C7
004011C3   .  EB 1D         JMP SHORT 004011E2
004011C5   .  EB 15         JMP SHORT 004011DC
004011C7   >  66:3D 1101    CMP AX,111                               ; 找到了 WM_COMMAND 消息处理的分支,接下来跳到该分支的处理过程去分析
004011CB   .  75 04         JNZ SHORT 004011D1
004011CD   .  EB 35         JMP SHORT 00401204
004011CF   .  EB 0B         JMP SHORT 004011DC
004011D1   >  66:3D 1001    CMP AX,110                               ;  WM_INITDIALOG
004011D5   .  75 05         JNZ SHORT 004011DC
004011D7   .  E9 B8010000   JMP 00401394
004011DC   >  33C0          XOR EAX,EAX
004011DE   .  C9            LEAVE
004011DF   .  C2 1000       RETN 10
004011E2   >  FF05 1C234000 INC DWORD PTR DS:[40231C]
004011E8   .  833D 1C234000>CMP DWORD PTR DS:[40231C],1
004011EF   .  75 05         JNZ SHORT 004011F6
004011F1   .  E8 29020000   CALL 0040141F
004011F6   >  6A 00         PUSH 0                                   ; /Result = 0
004011F8   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004011FB   .  E8 5E020000   CALL <JMP.&USER32.EndDialog>             ; \EndDialog
00401200   .  C9            LEAVE
00401201   .  C2 1000       RETN 10
00401204   >  817D 10 EB030>CMP DWORD PTR SS:[EBP+10],3EB
0040120B   .  0F85 3E010000 JNZ 0040134F
00401211   .  C16D 10 10    SHR DWORD PTR SS:[EBP+10],10
00401215   .  837D 10 00    CMP DWORD PTR SS:[EBP+10],0
00401219   .  0F85 2E010000 JNZ 0040134D
0040121F   .  60            PUSHAD
00401220   .  BF 47124000   MOV EDI,00401247
00401225   .  803F 84       CMP BYTE PTR DS:[EDI],84
00401228   .  0F85 DF000000 JNZ 0040130D
0040122E   .  68 57214000   PUSH 00402157                            ; /pModule = "User32"
00401233   .  E8 5C020000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401238   .  68 5F214000   PUSH 0040215F                            ; /ProcNameOrOrdinal = "GetDlgItemTextA"
0040123D   .  50            PUSH EAX                                 ; |hModule
0040123E   .  E8 4B020000   CALL <JMP.&KERNEL32.GetProcAddress>      ; \GetProcAddress
00401243   .  8038 CC       CMP BYTE PTR DS:[EAX],0CC
00401246   .  0F84 AB000000 JE 004012F7
0040124C   .  6A 28         PUSH 28                                  ; /Count = 28 (40.)
0040124E   .  68 06214000   PUSH 00402106                            ; |Buffer = crcme1.00402106
00401253   .  68 E9030000   PUSH 3E9                                 ; |ControlID = 3E9 (1001.)
00401258   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
0040125B   .  E8 10020000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
00401260   .  83F8 05       CMP EAX,5                                ;  用户名要大于等于5个字符
00401263   .  0F82 BD000000 JB 00401326
00401269   .  6A 28         PUSH 28                                  ; /Count = 28 (40.)
0040126B   .  68 2E214000   PUSH 0040212E                            ; |Buffer = crcme1.0040212E
00401270   .  68 EA030000   PUSH 3EA                                 ; |ControlID = 3EA (1002.)
00401275   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401278   .  E8 F3010000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
0040127D   .  BF 06214000   MOV EDI,00402106                         ;  ASCII "12345"
00401282   .  33DB          XOR EBX,EBX
00401284   .  33C0          XOR EAX,EAX
00401286   >  8A1F          MOV BL,BYTE PTR DS:[EDI]                 ;  取用户名字符
00401288   .  80FB 20       CMP BL,20                                ;  字符ASCII值不小于0x20
0040128B   .  0F82 95000000 JB 00401326
00401291   .  03C3          ADD EAX,EBX                              ;  累加字符的ASCII值,结果放到eax中
00401293   .  47            INC EDI
00401294   .  803F 00       CMP BYTE PTR DS:[EDI],0
00401297   .^ 75 ED         JNZ SHORT 00401286
00401299   .  C1C0 03       ROL EAX,3                                ;  将eax的值左移三位,相当于乘以8
0040129C   .  35 A5150500   XOR EAX,515A5                            ;  和 515AD异或
004012A1   .  50            PUSH EAX
004012A2   .  33C0          XOR EAX,EAX
004012A4   .  33DB          XOR EBX,EBX
004012A6   .  33FF          XOR EDI,EDI                              ;  开始假码的处理
004012A8   .  BE 2E214000   MOV ESI,0040212E                         ;  ASCII "67890"
004012AD   >  B8 0A000000   MOV EAX,0A
004012B2   .  8A1E          MOV BL,BYTE PTR DS:[ESI]                 ;  取假码的一个字符
004012B4   .  85DB          TEST EBX,EBX                             ;  如果为 \0 则跳出循环
004012B6   .  74 15         JE SHORT 004012CD
004012B8   .  80FB 30       CMP BL,30                                ;  判断字符是否是 '1' ~ '9',不是则跳出
004012BB   .  72 69         JB SHORT 00401326
004012BD   .  80FB 39       CMP BL,39
004012C0   .  7F 64         JG SHORT 00401326
004012C2   .  83EB 30       SUB EBX,30                               ;  将字符转换为数字
004012C5   .  0FAFF8        IMUL EDI,EAX
004012C8   .  03FB          ADD EDI,EBX
004012CA   .  46            INC ESI
004012CB   .^ EB E0         JMP SHORT 004012AD
004012CD   >  81F7 CA870000 XOR EDI,87CA                             ;  与 87CA 异或
004012D3   .  8BDF          MOV EBX,EDI                              ;  假码计算的值存入 ebx
004012D5   .  58            POP EAX                                  ;  取之前用户名计算得到的值
004012D6   .  03C3          ADD EAX,EBX                              ;  eax +=ebx
004012D8   .  35 E7970700   XOR EAX,797E7                            ;  eax 与 797E7异或
004012DD   .  85C0          TEST EAX,EAX                             ;  测试  eax == 0  是否成立
004012DF   .  75 45         JNZ SHORT 00401326                       ;  如果 eax == 0 则成功 否则跳转
004012E1   .  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004012E3   .  68 1B204000   PUSH 0040201B                            ; |Title = "-=ACG=- T h e   B e s t -=ACG=-"
004012E8   .  68 77204000   PUSH 00402077                            ; |Text = "Yeah You Did It!!!",LF,CR,"Czyli nareszczie ci si?uda硂",LF,CR,"Teraz mo縠sz przy彻

czy?si?do ACG"
004012ED   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
004012F0   .  E8 5D010000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
004012F5   .  EB 55         JMP SHORT 0040134C
004012F7   >  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004012F9   .  68 1B204000   PUSH 0040201B                            ; |Title = "-=ACG=- T h e   B e s t -=ACG=-"
004012FE   .  68 7F214000   PUSH 0040217F                            ; |Text = "No BPX Allowed!!!",LF,CR,"I oczywi渟ie standard:",LF,CR,"nie mo縩a zak砤da?pu砤pek!"
00401303   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
00401306   .  E8 47010000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
0040130B   .  EB 19         JMP SHORT 00401326
0040130D   >  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
0040130F   .  68 1B204000   PUSH 0040201B                            ; |Title = "-=ACG=- T h e   B e s t -=ACG=-"
00401314   .  68 21234000   PUSH 00402321                            ; |Text = "Gdzie mi grzebiesz w exe'cu??",LF,CR,"Jak cie trzepne to se w muzgu pogrzebiesz"
00401319   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
0040131C   .  E8 31010000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
00401321   .^ E9 BCFEFFFF   JMP 004011E2
00401326   >  6A 10         PUSH 10                                  ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00401328   .  68 1B204000   PUSH 0040201B                            ; |Title = "-=ACG=- T h e   B e s t -=ACG=-"
0040132D   .  68 CE204000   PUSH 004020CE                            ; |Text = "Nic z tego!!!"
00401332   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
00401335   .  E8 18010000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
0040133A   .  68 DD204000   PUSH 004020DD                            ; /Text = ""
0040133F   .  68 EA030000   PUSH 3EA                                 ; |ControlID = 3EA (1002.)
00401344   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401347   .  E8 F4000000   CALL <JMP.&USER32.SetDlgItemTextA>       ; \SetDlgItemTextA

分析过程都在上面   

大概的算法流程就是   取用户名的每个字符,然后累加期ascii值,放到eax中,然后值乘以8,接着再与 515AD异或,结果入栈,

                     接下来取   假码的值,看代码的步骤大概就是将输入的字符串转换为数字的形式 然后与87CA 异或  ,结果存放到ebx中

                     然后   eax+=ebx  ,eax 与 797E7比较,如果相等   就成功,不相等就失败

写个注册函数,参数为指向用户名和注册码的指针,返回指向真实注册码的字符串:
TCHAR * RegFunc(TCHAR* szName,TCHAR* szCode){
        DWORD        dwName=0;
        while(*szName!=0)dwName+=*szName++;
        dwName<<=3;
        dwName^=0x515AD;
        dwName =0x797E7 - dwName;
        dwName^=0x87CA;
        memset(szCode,0,16);
        wsprintf(szCode,"%ld",dwName);                 
        return  szCode;
}
       

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
感谢楼主的分享啊,何不把附件一起发上来啦?
2012-7-4 07:00
0
游客
登录 | 注册 方可回帖
返回
//