多开程序,我用程序多开器
程序员文章站
2022-07-03 08:26:13
文/图 December喜欢上网的网虫都习惯于每天开着QQ、MSN、FlashGet等程序,会不会觉得日复一日重复做着同一个动作很麻烦呢?所以使用一款程序多开器的话,肯定是一个好的选择,可以省...
文/图 December
喜欢上网的网虫都习惯于每天开着QQ、MSN、FlashGet等程序,会不会觉得日复一日重复做着同一个动作很麻烦呢?所以使用一款程序多开器的话,肯定是一个好的选择,可以省去不少时间,而且还可以选择在多少秒之后运行,确实挺不错的。不过这款小工具是共享软件,不注册的话,也只能运行几次而已,所以要不受限制地使用的话,那么也只能尝试去破解它了。
程序多开器2.1版比2.0版增加了修改MYPTC 1.1.0.7标题的功能和依次开启的功能。运行程序尝试性地注册了一下,发现没有什么错误之类的提示,初步估计可能是重启验证。到注册表里看看,发现注册信息写进了HKEY_LOCAL_MACHINESOFTWAREAutoSoftMultRun2。既然如此,我们可以先搜索一下字符串,以获得适合的断点。软件没有加壳,我们直接丢到OD中搜索字符串,会一点点破解的人都知道这个吧?随便看看可以发现如图1所示的两个信息。我们先到代码处看看。
图1
004035D2 E8 23730100 call 程序多开.0041A8FA
004035D7 A1 0C234300 mov eax,dword ptr ds:[43230C]
004035DC 85C0 test eax,eax
004035DE 74 37 je short 程序多开.00403617
004035E0 68 E8004300 push 程序多开.004300E8 ;你可以无限使用本程序!
004035E5 68 0A040000 push 40A
004035EA 8BCE mov ecx,esi
004035EC E8 3FA70100 call 程序多开.0041DD30
004035F1 68 DC004300 push 程序多开.004300DC ;感谢注册!
在004035D2处下断点的话,发现并不能中断下来,虽然这几行代码是提示感谢注册的,但是没中断下来,对于动态调试就比较麻烦了。即使是在004039E7处也不行,虽然这个地址处可以中断下来,但是对于注册验证来说,这里还不是关键的地方,难道就这么放弃吗?当然不是,我们再回到搜索后的字符串那里找找,看看还有什么地方遗漏了,又看了几遍,发现了如图2所示的地方。
图2
这里居然还有一个“感谢注册”,而且上面刚好也是注册表的键值,最下面一行“你还能使用本程序%d次”。其实这里就是提示你说还能使用多少次,应该有个计算器在这里,不过这个不用管了,先到代码那里去吧,找个适合的地方下断点。
004017DA 68 00014300 push 程序多开.00430100
;SOFTWAREAutoSoftMultRun2
004017DF 68 02000080 push 80000002
004017E4 FF15 0C604200 call dword ptr ds:[<&ADVAPI32.RegOpenKe>; ADVAPI32.RegOpenKeyA
……
004017FE FF15 08604200 call dword ptr ds:[<&ADVAPI32.RegQueryV>; ADVAPI32.RegQueryValueA
00401804 8B4C24 10 mov ecx,dword ptr ss:[esp+10]
00401808 51 push ecx
00401809 FF15 04604200 call dword ptr ds:[<&ADVAPI32.RegCloseK>; ADVAPI32.RegCloseKey
这是几个关于注册表的API函数。
0040180F 837C24 18 08 cmp dword ptr ss:[esp+18],8
;比较机器码位数
00401814 7D 0C jge short 程序多开.00401822
……
00401852 51 push ecx
00401853 E8 58240000 call 程序多开.00403CB0
;关键call
00401858 8B5424 14 mov edx,dword ptr ss:[esp+14]
0040185C 8B00 mov eax,dword ptr ds:[eax]
;eax保存注册码
0040185E 52 push edx
0040185F 50 push eax
00401860 E8 A9A50000 call 程序多开.0040BE0E
;注册码比较
到了这里就可以做内存注册机了,不想搞算法的话,可以在此结束。
00401865 83C4 10 add esp,10
00401868 8D4C24 1C lea ecx,dword ptr ss:[esp+1C]
0040186C 85C0 test eax,eax
0040186E 0F95C3 setne bl ;标志位判断
00401871 E8 D1C10100 call 程序多开.0041DA47
00401876 33C0 xor eax,eax
00401878 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0040187C 84DB test bl,bl
0040187E 0F94C0 sete al
00401881 A3 0C234300 mov dword ptr ds:[43230C],eax
00401886 C78424 8C04000>mov dword ptr ss:[esp+48C],-1
00401891 E8 B1C10100 call 程序多开.0041DA47
00401896 A1 0C234300 mov eax,dword ptr ds:[43230C]
0040189B 85C0 test eax,eax
0040189D 75 17 jnz short 程序多开.004018B6 ;爆点1
0040189F 8BCE mov ecx,esi
004018A1 E8 EA190000 call 程序多开.00403290
004018A6 8BCE mov ecx,esi
004018A8 E8 831B0000 call 程序多开.00403430
004018AD A1 0C234300 mov eax,dword ptr ds:[43230C]
004018B2 85C0 test eax,eax
004018B4 74 3C je short 程序多开.004018F2 ;爆点2
当然,如果你想爆破的话,也可以在这里来爆。
004018B6 68 E8004300 push 程序多开.004300E8
;你可以无限使用本程序!
004018BB 68 0A040000 push 40A
004018C0 8BCE mov ecx,esi
004018C2 E8 69C40100 call 程序多开.0041DD30
004018C7 68 DC004300 push 程序多开.004300DC
;感谢注册!
004018CC 68 09040000 push 409
……
00401907 BB 02000000 mov ebx,2
0040190C 52 push edx
0040190D 68 C4004300 push 程序多开.004300C4
;你还能使用本程序%d次!
从上面的代码发现了什么?至少可以知道,即使不搜索字符串的话,我们还可以使用API断点:bp RegOpenKeyA来下断点;还可以看出机器码应该至少都有8位,还有一个标志位判断,注册成功后,会提示你可以无限制使用本程序了。说了这么多,这些都不是主要的,主要的当然就是00401853处的关键call了,我们进去看看。
00403D08 E8 53000000 call 程序多开.00403D60 ;算法call
00403D0D 8BB424 2804000>mov esi,dword ptr ss:[esp+428]
00403D14 83C4 0C add esp,0C
进来后,发现第一个call就是算法call了,这里没什么关键的信息,所以进去看看。
00403D6D C64424 08 75 mov byte ptr ss:[esp+8],75
00403D72 C64424 09 6C mov byte ptr ss:[esp+9],6C
00403D77 C64424 0A 6F mov byte ptr ss:[esp+A],6F
00403D7C C64424 0B 76 mov byte ptr ss:[esp+B],76
00403D81 C64424 0C 65 mov byte ptr ss:[esp+C],65
00403D86 C64424 0D 6D mov byte ptr ss:[esp+D],6D
刚进来就看见这几行代码,查查ASCII码表,发现75 6C 6F 76 65 6D对应的就是 ulovem,都看得懂吧?继续看下面的代码。
00403D8D 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
;ecx保存机器码
00403D91 53 push ebx
……
00403D99 8A19 mov bl,byte ptr ds:[ecx]
;机器码保存到bl
00403D9B 84DB test bl,bl
00403D9D 74 1A je short 程序多开.00403DB9
00403D9F 8BC6 mov eax,esi
00403DA1 33D2 xor edx,edx
00403DA3 BD 06000000 mov ebp,6 ;ebp=6
00403DA8 F7F5 div ebp
00403DAA 8B6C24 24 mov ebp,dword ptr ss:[esp+24]
00403DAE 8A4414 10 mov al,byte ptr ss:[esp+edx+10]
;取ulovem的SCII值
00403DB2 32C3 xor al,bl ;超过六位就取6C做异或运算
00403DB4 88040F mov byte ptr ds:[edi+ecx],al
00403DB7 EB 03 jmp short 程序多开.00403DBC
00403DB9 881C0F mov byte ptr ds:[edi+ecx],bl
00403DBC 46 inc esi ;计数器
00403DBD 41 inc ecx
00403DBE 3BF5 cmp esi,ebp ;计算8次
00403DC0 ^ 7C D7 jl short 程序多开.00403D99 ;循环计算
将机器码和固定字符串ulovem做异或运算,因为不足8位,所以超过计算次数之后就取第二位来计算,这里很简单,看一下就知道的了,不多说,继续往下看代码。
00403DC6 85ED test ebp,ebp
00403DC8 7E 1F jle short 程序多开.00403DE9
00403DCA 8B5424 18 mov edx,dword ptr ss:[esp+18]
;edx保存刚才计算的结果
00403DCE BE 0A000000 mov esi,0A ; esi=A
00403DD3 0FBE0411 movsx eax,byte ptr ds:[ecx+edx]
00403DD7 99 cdq
00403DD8 F7FE idiv esi ; /A
00403DDA 8B4424 18 mov eax,dword ptr ss:[esp+18]
00403DDE 80C2 30 add dl,30 ;dl +30
00403DE1 881401 mov byte ptr ds:[ecx+eax],dl
00403DE4 41 inc ecx ;计数器
00403DE5 3BCD cmp ecx,ebp
00403DE7 ^ 7C E1 jl short 程序多开.00403DCA ;循环计算
很明显,程序经过两次运算,第一个将机器码和固定字符串ulovem做异或运算,因为不足8位,所以超过计算次数之后就取第二位来计算,计算完之后得到一个结果,将这个结果再与A求模之后加上30,得到的就是注册码了。
老实说,注册算法实在是非常简单,写注册机也很容易,这个我就不做了,而且我编程水平实在是糟糕的很,算法简单,简单算法,希望可以对想入门算法的朋友有一点帮助,我的希望也就达到了,最后祝大家轻松入门算法
喜欢上网的网虫都习惯于每天开着QQ、MSN、FlashGet等程序,会不会觉得日复一日重复做着同一个动作很麻烦呢?所以使用一款程序多开器的话,肯定是一个好的选择,可以省去不少时间,而且还可以选择在多少秒之后运行,确实挺不错的。不过这款小工具是共享软件,不注册的话,也只能运行几次而已,所以要不受限制地使用的话,那么也只能尝试去破解它了。
程序多开器2.1版比2.0版增加了修改MYPTC 1.1.0.7标题的功能和依次开启的功能。运行程序尝试性地注册了一下,发现没有什么错误之类的提示,初步估计可能是重启验证。到注册表里看看,发现注册信息写进了HKEY_LOCAL_MACHINESOFTWAREAutoSoftMultRun2。既然如此,我们可以先搜索一下字符串,以获得适合的断点。软件没有加壳,我们直接丢到OD中搜索字符串,会一点点破解的人都知道这个吧?随便看看可以发现如图1所示的两个信息。我们先到代码处看看。
图1
004035D2 E8 23730100 call 程序多开.0041A8FA
004035D7 A1 0C234300 mov eax,dword ptr ds:[43230C]
004035DC 85C0 test eax,eax
004035DE 74 37 je short 程序多开.00403617
004035E0 68 E8004300 push 程序多开.004300E8 ;你可以无限使用本程序!
004035E5 68 0A040000 push 40A
004035EA 8BCE mov ecx,esi
004035EC E8 3FA70100 call 程序多开.0041DD30
004035F1 68 DC004300 push 程序多开.004300DC ;感谢注册!
在004035D2处下断点的话,发现并不能中断下来,虽然这几行代码是提示感谢注册的,但是没中断下来,对于动态调试就比较麻烦了。即使是在004039E7处也不行,虽然这个地址处可以中断下来,但是对于注册验证来说,这里还不是关键的地方,难道就这么放弃吗?当然不是,我们再回到搜索后的字符串那里找找,看看还有什么地方遗漏了,又看了几遍,发现了如图2所示的地方。
图2
这里居然还有一个“感谢注册”,而且上面刚好也是注册表的键值,最下面一行“你还能使用本程序%d次”。其实这里就是提示你说还能使用多少次,应该有个计算器在这里,不过这个不用管了,先到代码那里去吧,找个适合的地方下断点。
004017DA 68 00014300 push 程序多开.00430100
;SOFTWAREAutoSoftMultRun2
004017DF 68 02000080 push 80000002
004017E4 FF15 0C604200 call dword ptr ds:[<&ADVAPI32.RegOpenKe>; ADVAPI32.RegOpenKeyA
……
004017FE FF15 08604200 call dword ptr ds:[<&ADVAPI32.RegQueryV>; ADVAPI32.RegQueryValueA
00401804 8B4C24 10 mov ecx,dword ptr ss:[esp+10]
00401808 51 push ecx
00401809 FF15 04604200 call dword ptr ds:[<&ADVAPI32.RegCloseK>; ADVAPI32.RegCloseKey
这是几个关于注册表的API函数。
0040180F 837C24 18 08 cmp dword ptr ss:[esp+18],8
;比较机器码位数
00401814 7D 0C jge short 程序多开.00401822
……
00401852 51 push ecx
00401853 E8 58240000 call 程序多开.00403CB0
;关键call
00401858 8B5424 14 mov edx,dword ptr ss:[esp+14]
0040185C 8B00 mov eax,dword ptr ds:[eax]
;eax保存注册码
0040185E 52 push edx
0040185F 50 push eax
00401860 E8 A9A50000 call 程序多开.0040BE0E
;注册码比较
到了这里就可以做内存注册机了,不想搞算法的话,可以在此结束。
00401865 83C4 10 add esp,10
00401868 8D4C24 1C lea ecx,dword ptr ss:[esp+1C]
0040186C 85C0 test eax,eax
0040186E 0F95C3 setne bl ;标志位判断
00401871 E8 D1C10100 call 程序多开.0041DA47
00401876 33C0 xor eax,eax
00401878 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0040187C 84DB test bl,bl
0040187E 0F94C0 sete al
00401881 A3 0C234300 mov dword ptr ds:[43230C],eax
00401886 C78424 8C04000>mov dword ptr ss:[esp+48C],-1
00401891 E8 B1C10100 call 程序多开.0041DA47
00401896 A1 0C234300 mov eax,dword ptr ds:[43230C]
0040189B 85C0 test eax,eax
0040189D 75 17 jnz short 程序多开.004018B6 ;爆点1
0040189F 8BCE mov ecx,esi
004018A1 E8 EA190000 call 程序多开.00403290
004018A6 8BCE mov ecx,esi
004018A8 E8 831B0000 call 程序多开.00403430
004018AD A1 0C234300 mov eax,dword ptr ds:[43230C]
004018B2 85C0 test eax,eax
004018B4 74 3C je short 程序多开.004018F2 ;爆点2
当然,如果你想爆破的话,也可以在这里来爆。
004018B6 68 E8004300 push 程序多开.004300E8
;你可以无限使用本程序!
004018BB 68 0A040000 push 40A
004018C0 8BCE mov ecx,esi
004018C2 E8 69C40100 call 程序多开.0041DD30
004018C7 68 DC004300 push 程序多开.004300DC
;感谢注册!
004018CC 68 09040000 push 409
……
00401907 BB 02000000 mov ebx,2
0040190C 52 push edx
0040190D 68 C4004300 push 程序多开.004300C4
;你还能使用本程序%d次!
从上面的代码发现了什么?至少可以知道,即使不搜索字符串的话,我们还可以使用API断点:bp RegOpenKeyA来下断点;还可以看出机器码应该至少都有8位,还有一个标志位判断,注册成功后,会提示你可以无限制使用本程序了。说了这么多,这些都不是主要的,主要的当然就是00401853处的关键call了,我们进去看看。
00403D08 E8 53000000 call 程序多开.00403D60 ;算法call
00403D0D 8BB424 2804000>mov esi,dword ptr ss:[esp+428]
00403D14 83C4 0C add esp,0C
进来后,发现第一个call就是算法call了,这里没什么关键的信息,所以进去看看。
00403D6D C64424 08 75 mov byte ptr ss:[esp+8],75
00403D72 C64424 09 6C mov byte ptr ss:[esp+9],6C
00403D77 C64424 0A 6F mov byte ptr ss:[esp+A],6F
00403D7C C64424 0B 76 mov byte ptr ss:[esp+B],76
00403D81 C64424 0C 65 mov byte ptr ss:[esp+C],65
00403D86 C64424 0D 6D mov byte ptr ss:[esp+D],6D
刚进来就看见这几行代码,查查ASCII码表,发现75 6C 6F 76 65 6D对应的就是 ulovem,都看得懂吧?继续看下面的代码。
00403D8D 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
;ecx保存机器码
00403D91 53 push ebx
……
00403D99 8A19 mov bl,byte ptr ds:[ecx]
;机器码保存到bl
00403D9B 84DB test bl,bl
00403D9D 74 1A je short 程序多开.00403DB9
00403D9F 8BC6 mov eax,esi
00403DA1 33D2 xor edx,edx
00403DA3 BD 06000000 mov ebp,6 ;ebp=6
00403DA8 F7F5 div ebp
00403DAA 8B6C24 24 mov ebp,dword ptr ss:[esp+24]
00403DAE 8A4414 10 mov al,byte ptr ss:[esp+edx+10]
;取ulovem的SCII值
00403DB2 32C3 xor al,bl ;超过六位就取6C做异或运算
00403DB4 88040F mov byte ptr ds:[edi+ecx],al
00403DB7 EB 03 jmp short 程序多开.00403DBC
00403DB9 881C0F mov byte ptr ds:[edi+ecx],bl
00403DBC 46 inc esi ;计数器
00403DBD 41 inc ecx
00403DBE 3BF5 cmp esi,ebp ;计算8次
00403DC0 ^ 7C D7 jl short 程序多开.00403D99 ;循环计算
将机器码和固定字符串ulovem做异或运算,因为不足8位,所以超过计算次数之后就取第二位来计算,这里很简单,看一下就知道的了,不多说,继续往下看代码。
00403DC6 85ED test ebp,ebp
00403DC8 7E 1F jle short 程序多开.00403DE9
00403DCA 8B5424 18 mov edx,dword ptr ss:[esp+18]
;edx保存刚才计算的结果
00403DCE BE 0A000000 mov esi,0A ; esi=A
00403DD3 0FBE0411 movsx eax,byte ptr ds:[ecx+edx]
00403DD7 99 cdq
00403DD8 F7FE idiv esi ; /A
00403DDA 8B4424 18 mov eax,dword ptr ss:[esp+18]
00403DDE 80C2 30 add dl,30 ;dl +30
00403DE1 881401 mov byte ptr ds:[ecx+eax],dl
00403DE4 41 inc ecx ;计数器
00403DE5 3BCD cmp ecx,ebp
00403DE7 ^ 7C E1 jl short 程序多开.00403DCA ;循环计算
很明显,程序经过两次运算,第一个将机器码和固定字符串ulovem做异或运算,因为不足8位,所以超过计算次数之后就取第二位来计算,计算完之后得到一个结果,将这个结果再与A求模之后加上30,得到的就是注册码了。
老实说,注册算法实在是非常简单,写注册机也很容易,这个我就不做了,而且我编程水平实在是糟糕的很,算法简单,简单算法,希望可以对想入门算法的朋友有一点帮助,我的希望也就达到了,最后祝大家轻松入门算法
下一篇: java中的按位与(&)用法说明
推荐阅读
-
C# Winform程序实现防止多开的方法总结【亲测】
-
为了完成这个功能,我竟然用5行代码制作了一个EXE可执行程序
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
-
详解微信小程序用定时器实现倒计时效果
-
Linux下用Nginx作Perl程序服务器及其中Perl模块的配置
-
程序员怒斥:阿里如此嚣张?为所欲为?谁让你动了我的浏览器
-
资深程序员:学Python我推荐你用这几款编辑器
-
用定制的PHP应用程序来获取Web服务器的状态信息
-
我是这样用Taro搭建小程序的架子的,你呢?
-
宅在家太无聊了,我用Python做了一个能作弊的抽奖程序