欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

多开程序,我用程序多开器

程序员文章站 2022-04-03 11:48:31
文/图 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,得到的就是注册码了。
老实说,注册算法实在是非常简单,写注册机也很容易,这个我就不做了,而且我编程水平实在是糟糕的很,算法简单,简单算法,希望可以对想入门算法的朋友有一点帮助,我的希望也就达到了,最后祝大家轻松入门算法