Hallo,
Ik ben momenteel bezig met het reverse engineering van een stuk code.
Ik wil de volgende functie omdraaien.
Ik heb bovenstaand stuk zelf uitgerekend.
De input van x=9553 en de uitkomst is 31572 (gecheckt met de debug mode).
Wat ik nu wil is dus van de waarde 31572 naar 9553 terug rekenen.
Wat heb ik tot nu toe:
Waar ik tegen aanloop is het volgende hoe kan ik van de waarde 31552 weer naar de waarde 1342272 terwijl ik alleen een tweede waarde weet van 65535
Dit is maar een klein stukje van de totale code die ik aan het omzetten ben, wat het normale script doet ik het volgende.
Het normale script is een controle van een login methode.
Je krijgt een 4 letterige naam [hoofdletters] en een Id [4-6 cijfers] en Pin code [4 cijfers].
In die combinatie van [NAME], [ID] en [PIN] zit een geldigheidsdatum verwerkt bijvoorbeeld 12/2014
In de Id+Pin code zit ook de naam verwerkt. Hij checkt dus ook of de [ID]+[PIN] combinatie geldig is met de ingegeven [NAME]
Bijvoorbeeld de naam BERO.
Het bijbehorende id is: 180093
De bijbehorende pin is: 8770
Deze code is geldig tot 12/2014
Wat het totale script doet is hij checkt of de combinatie [ID] en [PIN] de naam BERO kunnen creëren en of de geldigheidsdatum hoger is dan de huidige datum.
Ik wil uiteindelijk zelf code's kunnen genereren zodat ik deze inlog methode ook kan gebruiken.
Ik zal het totaal plaatje even erbij plakken, misschien is het nodig om bovenstaande vraag te kunnen beantwoorden.
Kan iemand mij helpen om deze hindernis over te steken.
Ik ben momenteel bezig met het reverse engineering van een stuk code.
Ik wil de volgende functie omdraaien.
Java:
1
2
3
4
5
6
7
| private static int f(int x) { x &= 65535; x = 0xFFFF & k43[(x >> 8 & 0xFF)] << 8 | k21[(x & 0xFF)]; return (x << 5 & 0xFFFF | x >> 11) & 0xFFFF; } |
Ik heb bovenstaand stuk zelf uitgerekend.
De input van x=9553 en de uitkomst is 31572 (gecheckt met de debug mode).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| f(x=9553) { x &= 65535; x = 0xFFFF & k43[(x >> 8 & 0xFF)] << 8 | k21[(x & 0xFF)]; // x = 65535 & K43[(x >> 8 & 255)] << 8 | K21[(x & 255)]; // x = 65535 & K43[37] << 8 | K21[81]; // x = 65535 & 163 << 8 | 218; // x = 65535 & 41728 | 218 // x = 65535 & 41946 return (x << 5 & 0xFFFF | x >> 11) & 0xFFFF; //1 return (41946 << 5 & 65535 | 41946 >> 11) & 65535; //2 return (1342272 & 65535 | 20) & 65535; //3 return (31552 | 20) & 65535; //4 return 31572 & 65535; //5 return 31572 } |
Wat ik nu wil is dus van de waarde 31572 naar 9553 terug rekenen.
Wat heb ik tot nu toe:
Java:
1
2
3
4
5
6
7
8
9
| private static int fr(int x) { x ^= 20; System.out.println("x is now: " +x); // x= 31552 wat overeenkomt met return 3 x |= ~65535; System.out.println("x zou nu 1342272 moeten zijn."); return x; } |
Waar ik tegen aanloop is het volgende hoe kan ik van de waarde 31552 weer naar de waarde 1342272 terwijl ik alleen een tweede waarde weet van 65535
code:
1
2
3
4
5
6
7
8
9
10
11
| Functie f 00000000000101000111101101000000 1342272 00000000000000001111111111111111 65535 -------------------------------- AND (&) 00000000000000000111101101000000 31552 Functie fr ?? 00000000000000000111101101000000 31552 00000000000000001111111111111111 65535 ================================ ?????? 00000000000101000111101101000000 1342272 |
Dit is maar een klein stukje van de totale code die ik aan het omzetten ben, wat het normale script doet ik het volgende.
Het normale script is een controle van een login methode.
Je krijgt een 4 letterige naam [hoofdletters] en een Id [4-6 cijfers] en Pin code [4 cijfers].
In die combinatie van [NAME], [ID] en [PIN] zit een geldigheidsdatum verwerkt bijvoorbeeld 12/2014
In de Id+Pin code zit ook de naam verwerkt. Hij checkt dus ook of de [ID]+[PIN] combinatie geldig is met de ingegeven [NAME]
Bijvoorbeeld de naam BERO.
Het bijbehorende id is: 180093
De bijbehorende pin is: 8770
Deze code is geldig tot 12/2014
Wat het totale script doet is hij checkt of de combinatie [ID] en [PIN] de naam BERO kunnen creëren en of de geldigheidsdatum hoger is dan de huidige datum.
Ik wil uiteindelijk zelf code's kunnen genereren zodat ik deze inlog methode ook kan gebruiken.
Ik zal het totaal plaatje even erbij plakken, misschien is het nodig om bovenstaande vraag te kunnen beantwoorden.
Java:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| import java.io.Serializable; import java.util.ArrayList; import java.util.GregorianCalendar; public class User implements Serializable { private static final long serialVersionUID = 1L; private static int[] K4 = { 7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3 }; private static int[] K3 = { 5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11 }; private static int[] K2 = { 14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9 }; private static int[] K1 = { 4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3 }; private static int[] k43 = new int[256]; private static int[] k21 = new int[256]; private static int[] SDKEY = { 83, 75, 73, 68, 65, 84, 65, 0 }; private static int[] SDKEY1 = { 96, 87, 84, 78, 74, 92, 72, 0 }; public static void main(String[] args) { System.out.println("Login: 2014"); loginAsServiceTechnician("BERO", 180093, 8750); /* Waar ik uiteindelijk heen wil * generateServiceTechnicain("BERO", "12", "2014"); */ } private static long ghostdecrypt(long in, int[] key) { for (int i = 0; i < 256; i++) { k43[i] = ((K4[(i >> 4)] << 4 | K3[(i & 0xF)]) & 0xFFFF); k21[i] = ((K2[(i >> 4)] << 4 | K1[(i & 0xF)]) & 0xFFFF); } for (int i = 0; i < 7; i++) { SDKEY1[i] = (SDKEY1[i] - 13 + i); } for (int i = 0; i < 8; i++) { SDKEY[i] = ((SDKEY[i] ^ SDKEY1[(7 - i)]) & 0xFFFF); } int n2 = (int)(in >> 16 & 0xFFFF); int n1 = (int)(in & 0xFFFF); int f = f(n1 + key[0]); n2 ^= 0xFFFF & f; n1 ^= 0xFFFF & f(n2 + key[1]); n2 ^= 0xFFFF & f(n1 + key[2]); n1 ^= 0xFFFF & f(n2 + key[3]); n2 ^= 0xFFFF & f(n1 + key[4]); n1 ^= 0xFFFF & f(n2 + key[5]); n2 ^= 0xFFFF & f(n1 + key[6]); n1 ^= 0xFFFF & f(n2 + key[7]); n2 ^= 0xFFFF & f(n1 + key[7]); n1 ^= 0xFFFF & f(n2 + key[6]); n2 ^= 0xFFFF & f(n1 + key[5]); n1 ^= 0xFFFF & f(n2 + key[4]); n2 ^= 0xFFFF & f(n1 + key[3]); n1 ^= 0xFFFF & f(n2 + key[2]); n2 ^= 0xFFFF & f(n1 + key[1]); n1 ^= 0xFFFF & f(n2 + key[0]); K4 = new int[] { 7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3 }; K3 = new int[] { 5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11 }; K2 = new int[] { 14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9 }; K1 = new int[] { 4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3 }; k43 = new int[256]; k21 = new int[256]; SDKEY = new int[] { 83, 75, 73, 68, 65, 84, 65, 0 }; SDKEY1 = new int[] { 96, 87, 84, 78, 74, 92, 72, 0 }; return (n1 << 16) + n2; } private static int f(int x) { x &= 65535; x = 0xFFFF & k43[(x >> 8 & 0xFF)] << 8 | k21[(x & 0xFF)]; System.out.println(((x << 5 & 0xFFFF | x >> 11) & 0xFFFF)); return (x << 5 & 0xFFFF | x >> 11) & 0xFFFF; } public static boolean loginAsServiceTechnician(String name, int id, int pin) { long data = ghostdecrypt(id * 10000 + pin, SDKEY); long months = data >> 20 & 0x1FF; char[] calculatedNameChars = new char[4]; for (int i = 3; i >= 0; i--) { calculatedNameChars[i] = ((char)(int)((data & 0x1F) + 65L)); data >>= 5; } String calculatedname = new String(calculatedNameChars); GregorianCalendar calendar = new GregorianCalendar(); long monthsNow = calendar.get(1) * 12 + calendar.get(2) + 1; long validUntilMonth = 23929L + months; if (validUntilMonth <= monthsNow) { System.out.println("Authorization has Expired"); return false; } if (name.equalsIgnoreCase(calculatedname)) { System.out.println("Welcome "+name); return true; } System.out.println("Incorrect PIN"); return false; } } |
Kan iemand mij helpen om deze hindernis over te steken.