-
-
[原创]继续做功课,又一个比较简单的crackme脱壳+算法分析
-
发表于: 2009-8-12 16:38 4327
-
继续做功课,又一个比较简单的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
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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: