160CrackMe-002

本文最后更新于:2021-08-09 晚上

初探

打开程序,看到提示输入name和serial,输入后,提示错误。

分析

查壳,看到程序没有加壳,是用VB语言写的。

使用OD进行分析,搜索错误提示的字符串,可以直接定位到关键的跳转

开始分析生成serial的过程,首先是获取了name的长度然后将其乘以17CFB再加上name的第一个ASCII码,最后转为十进制字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00402412   .  50            push eax                                   ; /String = 0000000A ???
00402413 . 8B1A mov ebx,dword ptr ds:[edx] ; |
00402415 . FF15 E4404000 call dword ptr ds:[<&MSVBVM50.__vbaLenBstr>; \__vbaLenBstr
0040241B . 8BF8 mov edi,eax ; 获取输入的name长度传入edi以便运算
0040241D . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18]
00402420 . 69FF FB7C0100 imul edi,edi,0x17CFB ; 长度乘0x17CFB
00402426 . 51 push ecx ; /String = 80020004 ???
00402427 . 0F80 91020000 jo Afkayas_.004026BE ; |
0040242D . FF15 F8404000 call dword ptr ds:[<&MSVBVM50.#516>] ; \rtcAnsiValueBstr
00402433 . 0FBFD0 movsx edx,ax ; 获取输入的第一个ascii传给edx
00402436 . 03FA add edi,edx ; 乘法后的结果加上第一个ascii
00402438 . 0F80 80020000 jo Afkayas_.004026BE
0040243E . 57 push edi ; MSVBVM50.__vbaStrCat
0040243F . FF15 E0404000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>] ; 计算结果转为字符串(十进制)
00402445 . 8BD0 mov edx,eax
00402447 . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]

然后将计算出的结果与“AKA-”进行拼接,再获取serial进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
00402510   > \8B45 E8       mov eax,dword ptr ss:[ebp-0x18]            ;  输入的Serial
00402513 . 8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C] ; 计算后的结果
00402516 . 8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaStrC>; MSVBVM50.__vbaStrCat
0040251C . 50 push eax
0040251D . 68 701B4000 push Afkayas_.00401B70 ; AKA-
00402522 . 51 push ecx ; /String = 80020004 ???
00402523 . FFD7 call edi ; \将AKA- 与计算后的数值拼接起来
00402525 . 8B1D 70414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaStrM>; MSVBVM50.__vbaStrMove
0040252B . 8BD0 mov edx,eax
0040252D . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
00402530 . FFD3 call ebx ; MSVBVM50.__vbaStrMove; <&MSVBVM50.__vbaStrMove>
00402532 . 50 push eax
00402533 . FF15 28414000 call dword ptr ds:[<&MSVBVM50.__vbaStrCmp>>; 比较

注册机编写

根据分析的结果进行注册机编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <windows.h>

int main() {
printf("输入name\n");
char name[20];
gets_s(name, 20);
int length = strlen(name);
int num = length * 0x17CFB;
num += name[0];
char* s1 = "AKA-";
char* serial = (char*)malloc(100);
sprintf(serial, "%s%d",s1,num);
printf("用户名是%s\n注册码是%s\n",name, serial);
return 0;
}

运行输入name:b1ackie,输出serial:AKA-682815。

输入正确的name和serial后,弹出正确提示