Ps出来的小赵 发表于 2018-2-1 18:32

GEditor3(女娲设计器)算法分析——也是一款算法很简单的软件

本帖最后由 zhaozdy 于 2018-2-1 20:30 编辑


上次的帖子有点水,挺不好意思的,所以这次厚颜无耻得再水一贴……


这次的软件和上次的是同一个作者的,算法有些相同,不过更加复杂点……


还是老规矩,大佬请继续浏览别的帖子,我是为小白服务的。


软件补张截图吧…………


下面是分析代码,实在看不懂的话看我后面的式子(关键位置自己找吧,挺好找的)

00404813|.59            pop ecx                                  ;0012EBA8
00404814|.8945 A4       mov ,eax
00404817|.8B45 A4       mov eax,
0040481A|.83F8 0A       cmp eax,0xA                              ;检验注册码是不是大于10位
0040481D|.74 75         je short GEditor.00404894                ;上面如果注册码小于十位,则跳,否则不跳,失败
0040481F|.6A 00         push 0x0
00404821|.8D45 9A       lea eax,dword ptr ss:
00404824|.E8 83020000   call GEditor.00404AAC
00404829|.B2 02         mov dl,0x2
0040482B|.E8 B0020000   call GEditor.00404AE0
00404830|.66:8B08       mov cx,word ptr ds:
00404833|.51            push ecx
00404834|.66:C745 C8 2C>mov word ptr ss:,0x2C
0040483A|.BA 3C814F00   mov edx,GEditor.004F813C               ;注册失败:注册码号码不对,请核对后输入!
0040483F|.8D45 F4       lea eax,
00404842|.E8 45070F00   call GEditor.004F4F8C
00404847|.FF45 D4       inc
0040484A|.8B00          mov eax,dword ptr ds:
0040484C|.B2 01         mov dl,0x1
0040484E|.59            pop ecx                                  ;0012EBA8
0040484F|.E8 A4650B00   call GEditor.004BADF8
00404854|.FF4D D4       dec
00404857|.8D45 F4       lea eax,
0040485A|.BA 02000000   mov edx,0x2
0040485F|.E8 F4080F00   call GEditor.004F5158
00404864|.8B4D B4       mov ecx,
00404867|.8B81 10030000 mov eax,dword ptr ds:
0040486D|.8B10          mov edx,dword ptr ds:
0040486F|.FF92 C0000000 call dword ptr ds:
00404875|.FF4D D4       dec
00404878|.8D45 FC       lea eax,
0040487B|.BA 02000000   mov edx,0x2
00404880|.E8 D3080F00   call GEditor.004F5158
00404885|.8B4D B8       mov ecx,
00404888|.64:890D 00000>mov dword ptr fs:,ecx
0040488F|.E9 02020000   jmp GEditor.00404A96
00404894|>33C0          xor eax,eax                              ;eax清零
00404896|.8945 AC       mov ,eax                     ;local 21清零
00404899|.33D2          xor edx,edx                              ;edx清零
0040489B|.8955 A8       mov ,edx                     ;local 22 清零
0040489E|>8B4D A8       /mov ecx,                      ;LOCAL 22给ecx
004048A1|.0FBE440D 84   |movsx eax,byte ptr ss:    ;取当前循环次数位的ASCII注册码的十六进制值(至于为啥,请参考上一帖)
004048A6|.8B55 AC       |mov edx,                      ;第一次相减结果(local 21)给edx 首次为0
004048A9|.03C2          |add eax,edx                           ;当前循环次数位的ASCII注册码的十六进制值+第一次相减结果
004048AB|.83C0 D0       |add eax,-0x30                           ;相加后的eax-30(小于30则溢出)
004048AE|.8945 AC       |mov ,eax                      ;相减后的值给local 21即第一次相减结果
004048B1|.8B4D A8       |mov ecx,                      ;local 22(循环次数)给ecx
004048B4|.0FBE440D 84   |movsx eax,byte ptr ss:    ;再次取当前循环次数位的ASCII注册码的十六进制值
004048B9|.8B55 9C       |mov edx,                      ;第二次相减结果给edx
004048BC|.03C2          |add eax,edx                           ;当前循环次数位的ASCII注册码的十六进制值+第二次相减结果
004048BE|.83C0 D0       |add eax,-0x30                           ;相加的值-30
004048C1|.8945 9C       |mov ,eax                      ;将相减结果给LOCAL 25 即第二次相减结果
004048C4|.FF45 A8       |inc                         ;LOCAL 22 +1即循环次数
004048C7|.8B4D A8       |mov ecx,                      ;循环次数给ecx
004048CA|.83F9 09       |cmp ecx,0x9                           ;当前循环次数与9比较
004048CD|.^ 7C CF         \jl short GEditor.0040489E               ;上面的比较小于9 则跳回继续运算,否则不跳
004048CF|.8B45 9C       mov eax,                     ;第二次相减结果给eax
004048D2|.B9 0A000000   mov ecx,0xA                              ;A给ecx
004048D7|.99            cdq                                    ;符号位扩展 (注释1)相减结果不会大于80000000 所以EDX 00000000
004048D8|.F7F9          idiv ecx                                 ;除以A EAX放商 EDX放余数 上面因为小于80000000 所以被除数就是第二次相减结果
004048DA|.83C2 30       add edx,0x30                           ;余数+30,并放回edx
004048DD|.8955 9C       mov ,edx                     ;相加结果给local 25
004048E0|.8B45 AC       mov eax,                     ;第一次相加结果给eax
004048E3|.3D A0000000   cmp eax,0xA0                           ;第一次相加结果与A0比较
004048E8|.75 0B         jnz short GEditor.004048F5               ;上面不想等则跳失败,相等则不跳
004048EA|.0FBE55 8D   movsx edx,byte ptr ss:         ;取注册码最后一位 给edx
004048EE|.8B4D 9C       mov ecx,                     ;余数+30结果给ecx
004048F1|.3BD1          cmp edx,ecx                              ;最后一位注册码与余数+30比较
004048F3|.74 62         je short GEditor.00404957                ;最后一位注册码小于余数+30,则跳,反之则不跳
004048F5|>FF75 AC       push
004048F8|.68 63814F00   push GEditor.004F8163                  ;注册失败:注册码号码错误,请核对后输入!%d
004048FD|.8D45 FC       lea eax,
00404900|.50            push eax
00404901|.E8 A2090F00   call GEditor.004F52A8
00404906|.83C4 0C       add esp,0xC
00404909|.6A 00         push 0x0
0040490B|.8D45 98       lea eax,
0040490E|.E8 99010000   call GEditor.00404AAC
00404913|.B2 02         mov dl,0x2
00404915|.E8 C6010000   call GEditor.00404AE0
0040491A|.66:8B08       mov cx,word ptr ds:
0040491D|.B2 01         mov dl,0x1
0040491F|.8B45 FC       mov eax,
00404922|.E8 D1640B00   call GEditor.004BADF8
00404927|.8B4D B4       mov ecx,
0040492A|.8B81 10030000 mov eax,dword ptr ds:
00404930|.8B10          mov edx,dword ptr ds:
00404932|.FF92 C0000000 call dword ptr ds:
00404938|.FF4D D4       dec
0040493B|.8D45 FC       lea eax,
0040493E|.BA 02000000   mov edx,0x2
00404943|.E8 10080F00   call GEditor.004F5158
00404948|.8B4D B8       mov ecx,
0040494B|.64:890D 00000>mov dword ptr fs:,ecx
00404952|.E9 3F010000   jmp GEditor.00404A96
00404957|>66:C745 C8 38>mov word ptr ss:,0x38          ;跳到这里说明注册码对了
0040495D|.BA 01000080   mov edx,0x80000001
00404962|.8B45 A0       mov eax,
00404965|.E8 1A060F00   call GEditor.004F4F84
0040496A|.66:C745 C8 44>mov word ptr ss:,0x44
00404970|.BA 8C814F00   mov edx,GEditor.004F818C               ;\Software\wujian\GEditor3.0



注释1的解释:
对于小白来说 CDQ还是很坑爹的,网上的一句话解释就是 “先把edx的每一位置成eax的最高位(若eax>=0x80000000, 则edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000) ,再把edx扩展为eax的高位。”
可能小白看不明白,我这里就画张图说明吧。


而这里用的ASCII码,就算是最大的F不减,离80 00 00 00还有好多好多的距离。所以这里的值依然是EAX的值作为被除数

下面是算法的式子

还是假设注册码为x1 x2 x3 x4 x5 x6 x7 x8 x9 x10   当然,这里也都是十六进制的,用的时候要转换会ASCII码

条件一:x1(必须大于30)-30 + x2(相加结果必须大于30)-30 + x3(相加结果必须大于30)-30…… x9(相加结果必须大于30)-30=A0
条件二:最后一位注册码   x10 <A0除以A所得的余数+30然而余数是0,也就是说,最后一位必须为0。(这里偷个懒,因为ASCII码有小于30的,比如% *,前面应该有检测,不能用,我懒得找了……)

至于注册机,不是我这样不懂编程的小白能写得出来的,交给哪位大神吧。。。。。


另外,毕竟本人是小白,难免有各种错误,请各位大佬不吝指出。

下面提供610基友凑出来的一个注册码    H9DAAAADC0   


感谢@610100这位好基友对我错误的及时指出,这里就不么么哒了,我知道你会害羞的。
好开森,又水了一帖………………


软件下载地址:点我下载   
里面有610100基友爆破的软件,在crack文件夹里面,建议研究算法的童鞋先自己研究,毕竟该软件算法不是很难。

嗯……610说了,爆破版有任何问题,他概不负责,他只是负责爆破的……

初亦泽 发表于 2018-2-2 11:38

注册信息在这:计算机\HKEY_CURRENT_USER\Software\wujian\GEditor3.0
删除了就可以重玩了

import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;

public class KeyGen {
       
        static int[] intNum= {'1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println("");
                GetKey();
        }
        //
        static void GetKey() {
                Scanner in=new Scanner(System.in);
                System.out.println("请输入要生成的密钥数量");
                int num=in.nextInt();
                Random ran=new Random();
                int length=10;
                char[] fakeKey=new char;
                boolean judge=true;       
                int[] intKey= new int;
                String realKey="";
                int count=0;
                //随机产生一个密钥
                while(judge) {
                        int sum=0;
                        for(int i=0;i<9;i++) {
                                intKey=intNum;
                        }
                        intKey='0';
               
                        for(int i=0;i<9;i++) {
                                sum=sum+intKey;
                        }
                        sum=sum-9*0x30;
                       
                        for(int i=0;i<10;i++) {
                                fakeKey=(char)intKey;
                        }
                        if(sum==0xA0) {
                               intKey=0x30;
                                        for(int i=0;i<fakeKey.length;i++) {
                                                fakeKey=(char)intKey;
                                        }
                               fakeKey='0';
                               realKey=new String(fakeKey);       
                               WriteKeyToFile(realKey);       
                               ++count;
                               while(count>=num) {
                                       System.out.println("已经生成"+count+"个密钥,生成的密钥存放在路径:D:/GEditorKey.txt\n");
                                       judge=false;
                                       break;
                               }
                               
                        }       
               
                }
        }
       
        static void WriteKeyToFile(String key) {
                try(FileWriter writer=new FileWriter("D:/GEditorKey.txt",true)) {
                        writer.write(key+"\r\n");
                }catch(IOException e) {
                        System.out.println("写入发生错误:"+e);
                }
                       
               
        }
       

}

爱飞的猫 发表于 2018-2-3 08:03

本帖最后由 jixun66 于 2018-2-3 08:11 编辑

https://www.52pojie.cn/thread-694775-1-1.html

用 C++ 和 MFC 做了个注册机模板;注册机需要 VS2017 运行时。





放几个吾爱破解专属序列号:

[*]LCG-G2LS50
[*]LCG-FFK1E0
[*]LCG-KP3G80
[*]LCG-13MKQ0

另外我不觉得不会编程是借口…
看你分析的逻辑挺清楚,而写代码所需要的无非就是清晰的逻辑,以及一个愿意花时间去查文档的心。

3114488 发表于 2018-2-1 19:10

谢谢分享

Aaron丶玖瑾 发表于 2018-2-1 19:22

感谢楼主分享!

钰树临风 发表于 2018-2-1 19:57

签名是什么电影

zz0147 发表于 2018-2-1 20:14

同问签名是什么电影

tangfangxi 发表于 2018-2-1 20:46

签名的两个女生是拉拉???

丶小明 发表于 2018-2-1 21:00

正正经经的发技术贴不好?非要把签名搞得gay里gay气的?还是说你就是gay里gay气?

初亦泽 发表于 2018-2-1 21:23

怎么清除注册信息

八云紫轩 发表于 2018-2-2 02:04

请问一下签名是什么电影?

feng1234 发表于 2018-2-2 08:08

谢谢分享
页: [1] 2 3
查看完整版本: GEditor3(女娲设计器)算法分析——也是一款算法很简单的软件