3、AfKayAs.2
3、AfKayAs.2
1、简述
操作系统: Windows(95)[I386, 32 位, GUI]
编译器: Microsoft Visual Basic(5.0)
语言: VB
2、初探
- 打开后会有一个七秒左右的弹窗。这个东西对我们的能力提升没有什么帮助,所以我们直接选择第二个吧
我们这里直接使用AfKayAs.2_pack.Exe
这个来调试把。
打开后也是和之前一样。用户名密码所生产的,所以这里我们就直接开始 操作
3、定位爆破跳转点
00408674 | 8945 B4 | mov dword ptr ss:[ebp-4C],eax |
00408677 | 74 62 | je afkayas.2_pack.4086DB |
00408679 | 8B35 14B14 | mov esi,dword ptr ds:[<&__vbaStrCat>] |
0040867F | 68 C06F400 | push afkayas.2_pack.406FC0 | 406FC0:L"You Get It"
00408684 | 68 DC6F400 | push afkayas.2_pack.406FDC | 406FDC:L"\r\n"
00408689 | FFD6 | call esi |
0040868B | 8BD0 | mov edx,eax |
0040868D | 8D4D E8 | lea ecx,dword ptr ss:[ebp-18] |
00408690 | FF15 94B14 | call dword ptr ds:[<&__vbaStrMove>] |
00408696 | 50 | push eax |
00408697 | 68 E86F400 | push afkayas.2_pack.406FE8 | 406FE8:L"KeyGen It Now"
其实这个je就是关键点,思路有两个,
一个是改成相反的,一个是直接nop掉。,注意nop占一个字节,所以要nop两个
爆破就完成了。
4、分析算法
①、定位密码注册码生成部分汇编
这里定位有个巧妙的方法,就是 无脑调试,然后寻找我们的用户名,什么时候在堆栈中出现,因为我们就算是用指针,一般指针也在栈区,这时候,x32dbg的好处就出来了,他会自动显示字符串根据, 会调几个函数。然后依次打断点即可。
这里就不多说了。
00408194 | 8B03 | mov eax,dword ptr ds:[ebx] |
00408196 | FF90 A0000 | call dword ptr ds:[eax+A0] |
0040819C | 3BC7 | cmp eax,edi |
这个函数执行结束后出现的用户名。所以这里就可以直接大概确定这个函数是一个读取的函数,进去看一下是不是系统api就知道了。
进入后发现正如我们所猜测,在msvbvm50.dll文件上。
004081EF | 8B45 E4 | mov eax,dword ptr ss:[ebp-1C] | 开始各种计算了
004081F2 | 50 | push eax |
004081F3 | 8B1A | mov ebx,dword ptr ds:[edx] |
004081F5 | FF15 F8B04 | call dword ptr ds:[<&__vbaLenBstr>] |
004081FB | 8BF8 | mov edi,eax |
004081FD | 8B4D E8 | mov ecx,dword ptr ss:[ebp-18] | [ebp-18]:L"weiran"
00408200 | 69FF 385B0 | imul edi,edi,15B38 |
00408206 | 51 | push ecx | ecx:L"weiran"
还原为
len(username) * 0x15b38 = 00082350
下一个
0040820D | FF15 0CB14 | call dword ptr ds:[<&rtcAnsiValueBstr>] |
00408213 | 0FBFD0 | movsx edx,ax | edx:L"eiran"
00408216 | 03FA | add edi,edx | edx:L"eiran
这个函数是提取出来第一个,的大小。,放ax中。并加上上面的结果
int(username[0]) + len(username) * 0x15b38 = 00082350 + number = 000823C7
后面username都用weiran 吧 要不然太难受了。
0040821E | 57 | push edi |
0040821F | FF15 F4B04 | call dword ptr ds:[<&__vbaStrI4>] |
00408225 | 8BD0 | mov edx,eax | eax:L"533447"
把上面的结果转为十进制
也就是
000823C7 转换成十进制 0045A964
再往后看有几个浮点数的计算
004082E9 | FF15 74B14 | call dword ptr ds:[<&__vbaR8Str>] |
004082EF | D905 08104 | fld st(0),dword ptr ds:[401008] |
这两个有点意思哦。
先是把参数的值转换成浮点数,如何往st(0)的位置写入 401008 位置的值,也就是10.0
这时候1 2 3位置的依次都向后移动。这里类似于一个固定大小的队列。
004082FE | D835 0C104 | fdiv st(0),dword ptr ds:[40100C] |
这里有一个运算 0x40100c位置的值是40a000000 这个值是5.0 所以,绥中st(0)位置的值是2.0
这里就可以说了。我觉得我编译器还是挺不错的。
00408314 | DFE0 | fnstsw ax |
00408316 | A8 0D | test al,D |
00408318 | 0F85 A1040 | jne afkayas.2_pack.4087BF |
0040831E | DEC1 | faddp st(1),st(0) |
00408320 | DFE0 | fnstsw ax |
这里哟一个运算,就是st(1) + st(0)
但是外层的也需要理解。跟上次一样留后面把 ,先把 大体逻辑旅顺了。
后面又来一个
004083FB | DC0D 10104 | fmul st(0),qword ptr ds:[401010] |
也就是这个值
401010 位置id值为:0x 4008000000000000 转换成 小数就是3.0
多以这个也就是 533449 * 3 = 1600347
00408404 | DC25 18104 | fsub st(0),qword ptr ds:[401018] |
这里又减去了一个2
也就是 1600347 - 2 = 1600345
004084E5 | DC25 20104 | fsub st(0),qword ptr ds:[401020] | C02E000000000000
其实就是1600345 - ( -15.0) = 1600360
好了所有的计算已经欧克了。
也就是用户名是weiran 密码就需要是1600360
验证一下
搞定了。
这个算法还原一个是无聊的吧。就一堆加减乘除,没什么很高级的操作。注册机就不写了