首页
社区
课程
招聘
[原创]继续做功课,又一个比较简单的crackme脱壳+算法分析
发表于: 2009-8-12 16:38 4344

[原创]继续做功课,又一个比较简单的crackme脱壳+算法分析

2009-8-12 16:38
4344
继续做功课,又一个比较简单的crackme

peid查显示yoda's cryptor 1.2壳,od载入ctrl+g到GetModuleHandleA,找到retn下断,F9
断下后F8一下返回程序领空,向上翻
00401000    6A 00           PUSH 0
00401002    E8 71020000     CALL 00401278                            ; JMP 到 kernel32.GetModuleHandleA
00401007    A3 40314000     MOV DWORD PTR DS:[403140],EAX            ; d2k2_crk.00400000
0040100C    6A 00           PUSH 0
0040100E    68 28104000     PUSH 00401028
00401013    6A 00           PUSH 0
00401015    6A 01           PUSH 1
00401017    FF35 40314000   PUSH DWORD PTR DS:[403140]
0040101D    E8 62020000     CALL 00401284                            ; JMP 到 user32.DialogBoxParamA
00401022    50              PUSH EAX
00401023    E8 4A020000     CALL 00401272                            ; JMP 到 kernel32.ExitProcess

401000处新建eip,lordpe      dump,import rec    fix
关闭od,试一下可以运行。再用peid查dump出来的文件,显示MASM32 / TASM32

od载入dump好的文件,下断bp GetDlgItemTextA,F9运行,输入假码点按钮,断下清除断点开始跟

004010B6    6A 28           PUSH 28
004010B8    68 C8304000     PUSH 004030C8                            ; ASCII "1234567890"
004010BD    6A 68           PUSH 68
004010BF    FF75 08         PUSH DWORD PTR SS:[EBP+8]
004010C2    E8 C9010000     CALL <JMP.&user32.GetDlgItemTextA>
004010C7    83F8 10         CMP EAX,10                                       注册码必须16位
004010CA    75 5D           JNZ SHORT 00401129
004010CC    6A 28           PUSH 28
004010CE    68 A0304000     PUSH 004030A0
004010D3    6A 67           PUSH 67
004010D5    FF75 08         PUSH DWORD PTR SS:[EBP+8]
004010D8    E8 B3010000     CALL <JMP.&user32.GetDlgItemTextA>
004010DD    85C0            TEST EAX,EAX
004010DF    74 20           JE SHORT 00401101
004010E1    83F8 08         CMP EAX,8                                         名字小于等于8位
004010E4    7F 2F           JG SHORT 00401115
004010E6    83F8 01         CMP EAX,1                                         大于等于2位
004010E9    7C 02           JL SHORT 004010ED
004010EB    EB 50           JMP SHORT 0040113D                          跳到算法
004010ED    68 24304000     PUSH 00403024                            ; ASCII "Name must be at least 2 chars long!"
004010F2    6A 68           PUSH 68
004010F4    FF75 08         PUSH DWORD PTR SS:[EBP+8]
004010F7    E8 A0010000     CALL <JMP.&user32.SetDlgItemTextA>
004010FC    E9 41010000     JMP 00401242
00401101    68 04304000     PUSH 00403004                            ; ASCII "Enter a name!"
00401106    6A 68           PUSH 68
00401108    FF75 08         PUSH DWORD PTR SS:[EBP+8]
0040110B    E8 8C010000     CALL <JMP.&user32.SetDlgItemTextA>
00401110    E9 2D010000     JMP 00401242
00401115    68 12304000     PUSH 00403012                            ; ASCII "Name is too long!"
0040111A    6A 68           PUSH 68
0040111C    FF75 08         PUSH DWORD PTR SS:[EBP+8]
0040111F    E8 78010000     CALL <JMP.&user32.SetDlgItemTextA>
00401124    E9 19010000     JMP 00401242
00401129    68 48304000     PUSH 00403048                            ; ASCII "Your Registration Code is invalid!"
0040112E    6A 68           PUSH 68
00401130    FF75 08         PUSH DWORD PTR SS:[EBP+8]
00401133    E8 64010000     CALL <JMP.&user32.SetDlgItemTextA>

我们看看算法

0040113D    33DB            XOR EBX,EBX
0040113F    33C9            XOR ECX,ECX
00401141    33D2            XOR EDX,EDX
00401143    33FF            XOR EDI,EDI
00401145    33F6            XOR ESI,ESI
00401147    8A99 A0304000   MOV BL,BYTE PTR DS:[ECX+4030A0]
0040114D    80FB 41         CMP BL,41                                ; 检查是不是字母
00401150    7C 07           JL SHORT 00401159
00401152    80FB 5A         CMP BL,5A                                ; 检查是不是大写
00401155    7F 0E           JG SHORT 00401165
00401157    EB 1F           JMP SHORT 00401178
00401159    80C3 20         ADD BL,20
0040115C    80FB 41         CMP BL,41
0040115F    7D 02           JGE SHORT 00401163
00401161    B3 46           MOV BL,46
00401163  ^ EB ED           JMP SHORT 00401152
00401165    80EB 20         SUB BL,20                                ; 转换为大写
00401168    80FB 5A         CMP BL,5A
0040116B    7E 02           JLE SHORT 0040116F
0040116D    B3 47           MOV BL,47
0040116F    80FB 41         CMP BL,41
00401172    7D 02           JGE SHORT 00401176
00401174    B3 53           MOV BL,53
00401176  ^ EB DF           JMP SHORT 00401157
00401178    889A 87304000   MOV BYTE PTR DS:[EDX+403087],BL               
0040117E    83C2 02         ADD EDX,2
00401181    41              INC ECX
00401182    3BC8            CMP ECX,EAX
00401184  ^ 75 C1           JNZ SHORT 00401147

将用户名转换为大写后每位替换     SJKAZBVTECGIDFNG序列中的1.3.5.7.。。。

00401186    33C9            XOR ECX,ECX
00401188    33D2            XOR EDX,EDX
0040118A    33DB            XOR EBX,EBX
0040118C    8A99 87304000   MOV BL,BYTE PTR DS:[ECX+403087]
00401192    03D3            ADD EDX,EBX
00401194    41              INC ECX
00401195    83F9 10         CMP ECX,10                               ; 将替换过的序列诸位ascii码相加
00401198  ^ 75 F2           JNZ SHORT 0040118C
0040119A    69C0 FF000000   IMUL EAX,EAX,0FF                         ; 名字位数乘0ff
004011A0    0FAFD0          IMUL EDX,EAX                             ; 结果与诸位累加值乘
004011A3    81F2 ABDFEBAC   XOR EDX,ACEBDFAB                         ; 结果与acebdefab异或
004011A9    0FCA            BSWAP EDX                                ;

高地位互换   abcdefgh---》》ghefcdab

004011AB    52              PUSH EDX
004011AC    68 00304000     PUSH 00403000                            ; ASCII "%lX"
004011B1    68 18314000     PUSH 00403118                            ; ASCII "BCADFDAC"
004011B6    E8 C3000000     CALL <JMP.&user32.wsprintfA>
004011BB    83C4 0C         ADD ESP,0C
004011BE    33DB            XOR EBX,EBX
004011C0    33C9            XOR ECX,ECX
004011C2    8A99 18314000   MOV BL,BYTE PTR DS:[ECX+403118]          ; 诸位比较
004011C8    80FB 3A         CMP BL,3A                                ; 小于3a就跳
004011CB    7C 02           JL SHORT 004011CF
004011CD    EB 09           JMP SHORT 004011D8
004011CF    80C3 11         ADD BL,11                                ; 加11
004011D2    8899 18314000   MOV BYTE PTR DS:[ECX+403118],BL          ; 把原值替换掉
004011D8    41              INC ECX
004011D9    83F9 08         CMP ECX,8
004011DC  ^ 75 E4           JNZ SHORT 004011C2
004011DE    33DB            XOR EBX,EBX
004011E0    33C9            XOR ECX,ECX
004011E2    33D2            XOR EDX,EDX
004011E4    8A99 18314000   MOV BL,BYTE PTR DS:[ECX+403118]
004011EA    889A 88304000   MOV BYTE PTR DS:[EDX+403088],BL          ;

算过的值替换刚才处理过序列的序列。2.4.6.8.。。。位

004011F0    83C2 02         ADD EDX,2
004011F3    41              INC ECX
004011F4    83FA 10         CMP EDX,10
004011F7  ^ 75 EB           JNZ SHORT 004011E4
004011F9    33DB            XOR EBX,EBX
004011FB    33C9            XOR ECX,ECX
004011FD    33D2            XOR EDX,EDX
004011FF    33C0            XOR EAX,EAX
00401201    8A9A C8304000   MOV BL,BYTE PTR DS:[EDX+4030C8]
00401207    8A82 87304000   MOV AL,BYTE PTR DS:[EDX+403087]
0040120D    33C3            XOR EAX,EBX                              ; 比较1.3.5.7。。。。位
0040120F  ^ 0F85 14FFFFFF   JNZ 00401129                     跳了就完蛋
00401215    8A9A C9304000   MOV BL,BYTE PTR DS:[EDX+4030C9]
0040121B    8A82 88304000   MOV AL,BYTE PTR DS:[EDX+403088]
00401221    04 05           ADD AL,5                                 ; 2.4.6.8.。。。位的ascii码+5
00401223    38C3            CMP BL,AL                                ; 比较2.4.6.8.。。。位
00401225  ^ 0F85 FEFEFFFF   JNZ 00401129                 跳了就完蛋
0040122B    83C2 02         ADD EDX,2
0040122E    83FA 10         CMP EDX,10
00401231  ^ 75 CE           JNZ SHORT 00401201
00401233    68 6B304000     PUSH 0040306B                            ; ASCII "Thank you for your support!"注册成功
00401238    6A 68           PUSH 68
0040123A    FF75 08         PUSH DWORD PTR SS:[EBP+8]
0040123D    E8 5A000000     CALL <JMP.&user32.SetDlgItemTextA>

算法:用户名必须大于等于2位小于等于8位,注册码必须16位

将用户名中字母转换为大写后将用户名每位替换     SJKAZBVTECGIDFNG序列中的1.3.5.7.。。。位,替换后的16位序列诸位ascii码相加结果与
名字位数乘。结果乘0ff。再与ACEBDFAB异或,结果高地位互换(abcdefgh---》》ghefcdab)

诸位比较是否小于3a,小于就加11并把原值替换掉。算过的值+5再次每位替换     SJKAZBVTECGIDFNG序列中的2.4.6.8.。。。位。

注册机就不写了,vb不支持16进制直接操作,并且ACEBDFAB转10进制后太大了vb运算会溢出。看来得好好学delphi了。。。。

一组可用注册码:
name:hydon
key:HGYHDFOINKGIDFNH

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//