yyhd 发表于 2021-2-8 08:48

玩玩破解,写给新人看(第二十集)

本帖最后由 yyhd 于 2021-10-16 00:25 编辑

西天取经—第2难

新人朋友们好!今天我们要猎杀的对象是什么样的呢?


是VB程序编写的软件。

CM名称:Afkayas.1

首先运行一下,看看失败后的结果。




从结果分析,我们可以使用的线索有两个。

1、搜索字符串。

2、弹窗

我们先用搜索字符串。然后到这个位置:




红色箭头就是关键跳,把JE改成NOP就成功了。

我们再往上看看。看到红色箭头的00402532就是关键CALL。




注意一下这个函数的名称是_VbaStrCmp。这个函数是VB程序特有的,功能就是进行字符串比较。

在VB程序中真假码的比较通常会使用_VbaStrCmp函数,所以对这个函数下断点是捷径。

我们直接对_VbaStrCmp函数下断。见下图:




看到吗?蓝色方框内直接显示出真假码,分别是这个函数的两个参数。

阶段总结:VB编写的软件可以在_VbaStrCmp函数下断点,因为这个函数往往在真假码比较时使用。

还没有完!

还记得我们以前分析易语言时,可以用搜索二进制字串FF25找到易语言体,我们同样用这种方法在VB程序中试试看。见下图:




会看到一连串的JMP,这些JMP后面都是函数。是的,这些函数就是这个VB程序会调用到的API函数。

其中红色箭头指的是rtcMsgBox,这个是VB程序特有的调用弹窗的函数,替代了我们在其他语言编写的程序中经常用的MessageBoxA。

蓝色箭头指的就是字符串比较函数_VbaStrCmp。

阶段总结:在VB程序中,要对rtcMsgBox函数下断点才能断下弹窗。

还没完!

呵呵,我们习惯于没完没了,因为爱玩,所以要玩出花样。

对于VB程序,还有专门的破解神器。

这个神器的名字叫:VB Decompiler

这个软件可以对没有加壳的VB程序进行几乎是源代码级别的还原。




我们打开VB Decompiler,选择要破解的VB程序,见下图:




红色箭头指的位置就是“ok”按钮点击后的“按钮事件”的首地址,我们一步就来到了关键代码段。

总结:以后遇到VB程序,如果是没有加壳的,直接用VB Decompiler工具找到按钮事件位置,即可快速破解。

补充一点:如果不想用工具,还可以用搜索二进制字串816C24,见下图:




红色箭头和蓝色箭头指的就是816C24,分别在下面有一个JMP,这两个JMP后面的地址就是点击“OK”按钮和“cancel”按钮后的按钮事件的首地址。

你把这两个地址和上图用工具找的地址对比看一下,完全一样。

好了,本集主要是对VB程序进行了破解分析。

大家记住三点:


1、VB程序与其他语言编写的程序在API函数名称不同,要用专门的API函数才可以下断。


2、破解VB程序有专门的核武器,就是VB Decompiler。


3、可以通过查询二进制字串816C24快速找到按钮事件的首地址。

本节课使用的CM发送到附件,大家可以玩玩。VB Decompiler工具可以在百度搜,很容易找到。


如果您觉得我发的内容确实对您有所帮助,请麻烦您支持一个热心值,进行精神鼓励,也是我继续写下去的动力!
玩玩破解,写给新人看(第一集)
玩玩破解,写给新人看(第二集)
玩玩破解,写给新人看(第三集)
玩玩破解,写给新人看(第四集)
玩玩破解,写个新人看(第五集)
玩玩破解,写给新人看(第六集)
玩玩破解,写给新人看(第七集)
玩玩破解,写给新人看(第八集)
玩玩破解,写给新人看(第九集)
玩玩破解,写给新人看(第十集)
玩玩破解,写给新人看(第十一集)
玩玩破解,写给新人看(第十二集)
玩玩破解,写给新人看(阶段练习1)
玩玩破解,写给新人看(第十三集)
玩玩破解,写给新人看(第十四集)
玩玩破解,写给新人看(第十五集)
玩玩破解,写给新人看(第十六集)
玩玩破解,写给新人看(第十七集)
玩玩破解,写给新人看(第十八集)
玩玩破解,写给新人看(第十九集)
玩玩破解,写给新人看(第二十集)
玩玩破解,写给新人看(第二十一集)
玩玩破解,写给新人看(第二十二集)
玩玩破解,写给新人看(第二十三集)
玩玩破解,写给新人看(第二十四集)
闲谈如何破解软件?
玩玩破解——小白实战1,你也行!
玩玩破解——小白实战2,巧搜字符串
玩玩破解——小白实战3,易语言字符串比较通杀
玩玩破解——小白实战4,冰火两重天
对新人们学习《玩玩破解》系列教程的集中解答
玩玩破解—加点油,再前行!

zppzq 发表于 2022-3-17 13:56

楼主没有讲怎么破解注册码,我们来尝试破解用户名跟注册码,在此基础上,可以自己写一个注册机来注册。
第一步,输入用户名,跟踪代码,看代码生成了什么样的注册码。先输入一个用户名“111”,注册码则输入“1111”,跟踪代码,发现在下图的位置,计算出来一个字符串:

其中,读到EAX中的应该是输入的注册码,读到ECX的应该是计算出来的注册码。
接着往下走,

到这里的时候,有一个函数调用,结果是在之前计算出来的注册码前加上“AKA-”,如此,新注册码为“AKA-292642”。再往下:

这里调用字符串比较函数,比较计算出来的注册码和我们输入的注册码是否匹配。
按道理来说,整个程序的流程就是这样大差不差,不过“AKA-292642”是否是真的注册码,我们还得试一下。
那我们把这个码输入到程序中看看:

看来没猜错。
程序怎么由用户名“111”计算出来这个注册吗的呢?我们还要继续探讨。
第二步,通过输入多个不同的用户名,看看计算出来的注册码有没有什么规律。经过一番操作,得到如下对应表:
用户名        注册码
111                AKA-292642
1111        AKA-390173
11111         AKA-487704
额~貌似没有什么规律。
再试一试:
用户名        注册码
112        AKA-292642
113        AKA-292642
124        AKA-292642
貌似后两位数对注册码没有影响。
那第一位数呢?
用户名        注册码
111        AKA-292642
211        AKA-292643
311        AKA-292644
有点小激动,注册码的尾数跟名词名第一个数有一个对应关系,赶紧试一下4位、5位数的用户名,结论一样。
到这里,我们已经知道了注册码跟用户名的第一位数有关系。然而这并没有什么L用,还是看不出来这注册码是怎么计算出来的,那只好去代码里面找了。
第三步,查找注册码的算法。
首先我们假设,注册码是通过一个子程序计算出来的,那么必然有call,而且,这个调用一定在我们第一步中真假码比较的前面:

箭头指的地方就是真假码比较的地方,事实上,注册码的计算应该还在上图红框之前。
但是,从这里往上,有很多的call啊。。。只能一个一个进去看,不过如果进去了是系统空间,就应该马上退出来了。
找啊找,一直找不对地方,就在我快要放弃的时候,这段代码引起了我的注意:

我猜测,这个call应该是计算用户名的字符长度的,代码走一步:

可以看到,返回值EAX是3,确实是计算字符串长度的。
接下来,字符串的长度转移到EDI,然后再乘以一个0X17CFB
然后,又是一个函数调用:

这个call前面push ecx这条指令是把“111”这个用户名压到栈里(函数参数),其返回值是0X31。然后再把这个返回值跟之前的相乘结果相加:

然后把相加结果压栈,再经过一个调用,返回了一个我们熟悉的字符串:

实际上,上面先乘后加就是注册码的算法,作者并没把这个算法放到一个独立的函数中去计算。
伪代码大概是这样的:
A = strlen(用户名)
B = A * 0X17CFB
C = 用户名第一个字符的Ascii值
D = B+C
把D转成十进制的字符串

我们输入的用户名为“111”,则整个就是:
3(字符串长度)* 0X17CFB + 0X31(第一个字符“1”的ascii码)= 0X47722
0X47722转成十进制就是292642。
再根据这个算法验证4、5长度的用户名,都正确,甚至第一个字符用标点符号,也没问题。
至此,破解完成。

konosubaakua 发表于 2021-2-14 16:37

交作业:

爆破方式:

keygen:



zhenyang 发表于 2021-2-9 08:54

楼主能讲讲VB P-code如何破解的方法吗,谢谢

繁华残存 发表于 2021-2-8 08:51

前排留座

Pau250 发表于 2021-2-8 08:52


前排留座

xyp 发表于 2021-2-8 08:59

好家伙。。。这高潮不错

zj2018 发表于 2021-2-8 09:13

首页(?)留名。感谢教程!

mzxc829 发表于 2021-2-8 09:13

大佬真早啊!

aliwinner 发表于 2021-2-8 09:20

学习是进步前提,感谢分享!

kelisi123 发表于 2021-2-8 09:20

话不多说,直接评分。分享辛苦

夜雪秣陵 发表于 2021-2-8 09:23

路过,辛苦大佬

dogzxcn 发表于 2021-2-8 09:23

学习了,哈哈一点一点得看,先关注了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 玩玩破解,写给新人看(第二十集)