不脱壳破解 ASProtect 2.0x Registered -> Alexey Solodovnikov 加壳程序
e2h-dist.exe。。
首先用 OD 载入程序。忽略出 int3 外的所有异常。。
运行它。。出现注册对话窗口。。
填入假码和注册信息。。。确定,,出现一个对话框 “invalidus code”
记住它。。暂停后,分析一下代码,搜索-》所有文本参考字符串。。
将 “invalidus code” 找到,然后来到它那里
004A04B1 |. 8D85 34FEFFFF LEA EAX,DWORD PTR SS:[EBP-1CC]
004A04B7 |. E8 A849F6FF CALL exif2htm.00404E64
004A04BC |. E8 F72FF6FF CALL exif2htm.004034B8
004A04C1 |. E8 C623F6FF CALL exif2htm.0040288C
004A04C6 |. 8D85 34FEFFFF LEA EAX,DWORD PTR SS:[EBP-1CC]
004A04CC |. E8 332AF6FF CALL exif2htm.00402F04
004A04D1 |. E8 B623F6FF CALL exif2htm.0040288C
004A04D6 |. A1 389D4A00 MOV EAX,DWORD PTR DS:[4A9D38]
004A04DB |. E8 F44FFDFF CALL exif2htm.004754D4
004A04E0 |. EB 0A JMP SHORT exif2htm.004A04EC
004A04E2 |> B8 98054A00 MOV EAX,exif2htm.004A0598 // 就是他了
ASCII"Invalidus codus."
004A04E7 |. E8 F82AF9FF CALL exif2htm.00432FE4
004A04EC |> 33C0 XOR EAX,EAX
004A04EE |. 5A POP EDX
004A04EF |. 59 POP ECX
004A04F0 |. 59 POP ECX
004A04F1 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
004A04F4 |. 68 2C054A00 PUSH exif2htm.004A052C
。。向上找
004A0417 |. 5A POP EDX
004A0418 |. E8 57B1FFFF CALL exif2htm.0049B574 // 在这下断
004A041D |. 84C0 TEST AL,AL
004A041F |. 0F84 BD000000 JE exif2htm.004A04E2
004A0425 |. B8 3C054A00 MOV EAX,exif2htm.004A053C ;
ASCII "The code seems to be OK. Restart the program."
004A042A |. E8 B52BF9FF CALL exif2htm.00432FE4
004A042F |. 8B15 888D4A00 MOV EDX,DWORD PTR DS:[4A8D88] ;
exif2htm.004A9C44
004A0435 |. 8B12 MOV EDX,DWORD PTR DS:[EDX]
004A0437 |. 8D85 28FEFFFF LEA EAX,DWORD PTR SS:[EBP-1D8]
004A043D |. B9 74054A00 MOV ECX,exif2htm.004A0574 ;
ASCII "/exif2htm.key"
004A0442 |. E8 4D46F6FF CALL exif2htm.00404A94
004A0447 |. 8B95 28FEFFFF MOV EDX,DWORD PTR SS:[EBP-1D8]
004A044D |. 8D85 34FEFFFF LEA EAX,DWORD PTR SS:[EBP-1CC]
004A0453 |. E8 E429F6FF CALL exif2htm.00402E3C
004A0458 |. 8D85 34FEFFFF LEA EAX,DWORD PTR SS:[EBP-1CC]
004A045E |. E8 7527F6FF CALL exif2htm.00402BD8
004A0463 |. E8 2424F6FF CALL exif2htm.0040288C
004A0468 |. 8D95 20FEFFFF LEA EDX,DWORD PTR SS:[EBP-1E0]
用硬件执行断点保险一点。。。
断下后,跟进。。
0049B5B5 |. BA 01000000 MOV EDX,1
0049B5BA |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4]
0049B5BD |. 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1]
0049B5C2 |. 03F1 |ADD ESI,ECX
0049B5C4 |. 42 |INC EDX
0049B5C5 |. 48 |DEC EAX
0049B5C6 |.^ 75 F2 /JNZ SHORT exif2htm.0049B5BA
这是将输入的 ID 号转换成部分假码的算法。。。
0049B5DC |. E8 CBD7F6FF CALL exif2htm.00408DAC ;
产生部分假码
跟进。。
00408DAC /$ 56 PUSH ESI
00408DAD |. 89E6 MOV ESI,ESP
00408DAF |. 83EC 10 SUB ESP,10
00408DB2 |. 31C9 XOR ECX,ECX
00408DB4 |. 52 PUSH EDX
00408DB5 |. 31D2 XOR EDX,EDX
00408DB7 |. E8 A4FFFFFF CALL exif2htm.00408D60
00408DBC |. 89F2 MOV EDX,ESI
00408DBE |. 58 POP EAX
00408DBF |. E8 B4BAFFFF CALL exif2htm.00404878
00408DC4 |. 83C4 10 ADD ESP,10
00408DC7 |. 5E POP ESI
00408DC8 /. C3 RETN
得到 0012EA50 02423504 ASCII "52265"
部分假码。。。
0049B626 |. E8 7D96F6FF CALL exif2htm.00404CA8
得到从我们输入假码中抽取作为注册码的一部分。。
0012EA4C 02423504 ASCII "67890"
从而,在数据窗口得到
0012EA4C 02423504 ASCII "67890"
0012EA50 024226F0 ASCII "52265"
注册码也就是由他们组成的。。6789052265
F9 运行试验一下。。。
ok !!!
从他的算法来看,注册码是由我们的假码与他的算法给出的这注册码组成的。。
前五位是我们的假码,后五位是它的注册码。。。
而他的注册码有时根据我们的 ID 计算出来的,由此我们可以想想,如果我们只要
得到它计算 ID 的算法,我们就能够随意的填入我们的那部分假码,就可以组成
无数的注册码。。
那么就让我们来分析一下它吧。。。
0049B5B5 |. BA 01000000 MOV EDX,1
0049B5BA |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4]
0049B5BD |. 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1]
0049B5C2 |. 03F1 |ADD ESI,ECX
0049B5C4 |. 42 |INC EDX
0049B5C5 |. 48 |DEC EAX
0049B5C6 |.^ 75 F2 /JNZ SHORT exif2htm.0049B5BA
这是从我们的 ID 将它转化成 ASCII码 储存在 esi 中的,每读入一位,
edx 就加一,而 eax 就减一。。从这里我们就可以知道,eax 最初是用来存放我们
id 位数的,当 eax = 0 时,循环就结束。。
而程序从我们的假码产生的这注册码部分则是通过先判断我们假码位数,满足条件就继续取,否则就结束。。当然注册码它认为最小为5位的。。只要大于等于它。就
ok!! 这后它就去他们的后五位!!
最后与前面的这注册码组合,得到注册码!!!