3、AfKayAs.2

3、AfKayAs.2

1、简述

操作系统: Windows(95)[I386, 32 位, GUI]

编译器: Microsoft Visual Basic(5.0)

语言: VB

2、初探

  1. 打开后会有一个七秒左右的弹窗。这个东西对我们的能力提升没有什么帮助,所以我们直接选择第二个吧

我们这里直接使用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

验证一下

搞定了。

这个算法还原一个是无聊的吧。就一堆加减乘除,没什么很高级的操作。注册机就不写了

posted @ 2024-12-19 19:40  未然king  阅读(3)  评论(0编辑  收藏  举报