本文最后更新于:2021-08-09 晚上
初探
打开程序,看到提示输入name和serial,输入后,提示错误。
分析
查壳,看到程序没有加壳,是用VB语言写的。
使用OD进行分析,搜索错误提示的字符串,可以直接定位到关键的跳转
开始分析生成serial的过程,首先是获取了name的长度然后将其乘以17CFB再加上name的第一个ASCII码,最后转为十进制字符串。
| 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进行比较。
| 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>>; 比较
|
注册机编写
根据分析的结果进行注册机编写
| #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后,弹出正确提示