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说了,爆破版有任何问题,他概不负责,他只是负责爆破的…… 注册信息在这:计算机\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);
}
}
}
本帖最后由 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
另外我不觉得不会编程是借口…
看你分析的逻辑挺清楚,而写代码所需要的无非就是清晰的逻辑,以及一个愿意花时间去查文档的心。 谢谢分享 感谢楼主分享! 签名是什么电影 同问签名是什么电影
签名的两个女生是拉拉??? 正正经经的发技术贴不好?非要把签名搞得gay里gay气的?还是说你就是gay里gay气? 怎么清除注册信息 请问一下签名是什么电影? 谢谢分享