二次追码分析木有爆破

①看起来就像是经典例题的程序

②还是老样子找函数下断

系统领空ALT+F9到程序领空

然后直接分析😎

✌️输入正确的注册码 (其实不是IceFengcc,🤗找到内存里的地址偷偷改了一下没人发现)

③ 🙃重头戏分析用户和序列号的算法

如何用时间到!(输入假的用户和序列号)😏

因为刚刚下好断点了所以这里直接运行就好,系统领空到程序领空这里

比较明显的是这是两个获取文本内容的函数 每个函数下面都有对输入的文本是否是空的判断

🌟[账户算法分析]🌟

紫色部分的区域 --> 是对用户名获取后的算法

1.先把用户名所在的内存给ESI

2.用一个空地址用来存储用户名经过算法一系列处理后保存的地址

3.扩充位列 除 10(A)然后保存余数 余数跟循环的次数(从0开始)进行异或处理 然后再+2

4.判断一下是否 >=10 如果>=10 就 减去10

5.存到预留的地址

🀄

🌟 [序列号算法分析]🌟

紫色紫色紫色紫色0-0 ----------------------------------------------------->序列号算法

PS:存储方式还是跟用户名一样 都是一个变址寄存器存储数据地址 另一个变址寄存器存储修改后的数据

🚀扩充位列 除 10 余数直接存储

④最后写注册机(🤐思路分析)

通过账户和序列号的算法之后应该看最后的判断

就是简单粗暴的 判断是否相同 可知条件

🌟 1.循环次数—>账户的长度

🌟 2.循环取出账户的第i个字符 然后转10进制 除10 与 当前循环次数 异或^ 然后加+2

🌟 3.根据2的结果枚举 然后乘10 到16进制 再到文本

🌟 4.注意枚举出的结果需要根据ASCII 表的可显示字符💪

注册机的实现代码

本来想用C写🤔转手java,根据主要思路写就好

JAVA的字节编码成16进制原理往这里看👉👉👉👉👉Java中把一个字节编码成16进制字符串的原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Scanner;
public class NEW{
public static void main(String[] args) {
String id,temp;
int Itemp;
Scanner s1=new Scanner(System.in);
id=s1.next();
System.out.print("Pass:");
for (int i=0;i<id.length();i++){//账号算法的实现
int k=0;
temp=String.valueOf(id.charAt(i)) ;
temp =str2HexStr(temp);
Itemp=Integer.parseInt(temp,16)%10;
Itemp=Itemp ^ i;
Itemp=Itemp+2;
if(Itemp>=10){
Itemp=Itemp-10;
}
int c=32;
for (;c<=126;c++) {//ASCII可显示字符32-126
if (c%10==Itemp && k==0){
String ss=Integer.toHexString(c);
ss=hexStr2Str(ss);
System.out.print(ss);
k=1;
}
}
if(c==127 && k==0){
System.out.print("ERROR!");
break;
}

}
}

public static String str2HexStr(String str) {
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
}
return sb.toString().trim();
}//文本转16
public static String hexStr2Str(String hexStr) {
String str = "0123456789ABCDEF";
char[] hexs = hexStr.toCharArray();
byte[] bytes = new byte[hexStr.length() / 2];
int n;
for (int i = 0; i < bytes.length; i++) {
n = str.indexOf(hexs[2 * i]) * 16;
n += str.indexOf(hexs[2 * i + 1]);
bytes[i] = (byte) (n & 0xff);
}
return new String(bytes);
}//16到文本

}

加油👌

本文标题:二次追码分析木有爆破

文章作者:IceFeng

发布时间:2019年10月08日 - 19:23:29

最后更新:2019年10月08日 - 22:57:34

原始链接:https://www.icefeng.cc/2019/Crack_2/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

------ 本文结束 ------
0%