@@ -21,7 +21,7 @@ void substitute(char* input, char* output, int multiply_by)
21
21
output [0x18 ] = 0 ;
22
22
}
23
23
24
- int the_crazy_math_part (unsigned int val1 , unsigned int val2 , int carry )
24
+ int the_crazy_math_part (unsigned int val1 , unsigned int val2 , int carry , int start_at )
25
25
{
26
26
int c = carry ;
27
27
@@ -32,7 +32,7 @@ int the_crazy_math_part(unsigned int val1, unsigned int val2, int carry)
32
32
33
33
// yes this is just the asm implemented in C, dont @ me
34
34
35
- for (int i = 0 ; i < 4 ; i ++ )
35
+ for (int i = start_at ; i < 0x20 ; i ++ )
36
36
{
37
37
// adcs r3,r1,r3,lsl 1h
38
38
r3 = (r1 + (r3 << 1 )) + c ; //same as r3 = (r3+(r1 * 2)) + c;
@@ -62,94 +62,89 @@ char* find_pattern(char* enc, char* input)
62
62
int i ;
63
63
int ii ;
64
64
char * iii ;
65
- char c ;
66
65
67
- c = * enc ;
68
66
i = 0 ;
69
- while ( 1 ) {
70
- if ( c == '\0' ) {
71
- return ( char * ) 0x0 ;
72
- }
67
+ if (! * enc )
68
+ return 0 ;
69
+ while ( 1 )
70
+ {
73
71
ii = 0 ;
74
- iii = enc + i ;
75
- while (c = input [ii ], c != '\0' && (* iii == c )) {
76
- iii = iii + 1 ;
77
- ii = ii + 1 ;
72
+ iii = & enc [i ];
73
+ while (input [ii ] && * iii == input [ii ])
74
+ {
75
+ ++ iii ;
76
+ ++ ii ;
78
77
}
79
- if (c == '\0' ) break ;
80
- i = i + 1 ;
81
- c = enc [i ];
78
+ if (!input [ii ])
79
+ break ;
80
+ if (!enc [++ i ])
81
+ return 0 ;
82
82
}
83
- return enc + i ;
83
+ return & enc [ i ] ;
84
84
}
85
85
86
86
87
- int find_multiplier (char * system_in , unsigned int maccasId )
87
+ int find_multiplier (char * system_in )
88
88
{
89
- unsigned int total_iterations ;
90
- int i = 0 ;
89
+ int total_iterations = 0 ;
91
90
int ii = 0 ;
92
-
93
- total_iterations = 0 ;
94
- unsigned int c = maccasId & 0xffff00ff ;
95
- int system_in_len = strlen (system_in );
91
+ int next_var = 0 ;
92
+
93
+ char * system_in_base_ptr = system_in ;
96
94
char * hex_values_ptr = hex_values ;
97
- if ( 0 < system_in_len ) {
98
- do {
99
- system_in ++ ;
100
- c = c & 0xffffff00 | ( unsigned int ) * system_in ;
101
- byte * next_ptr = next_ptr = find_pattern ( hex_values_ptr , ( char * ) & c );
102
- byte * this_char = next_ptr + - ( int ) hex_values_ptr ;
103
- if ( next_ptr == ( byte * ) 0x0 ) {
104
- this_char = ( byte * ) 0x0 ;
105
- }
106
- i = i + 1 ;
107
- total_iterations = ( unsigned int )( this_char + total_iterations ) ;
108
- } while ( i < system_in_len ) ;
95
+ for ( int i = 0 ; i < strlen ( system_in_base_ptr ); i ++ )
96
+ {
97
+ char c = * system_in ++ ;
98
+ char characters [ 2 ] ;
99
+ memset ( characters , 0 , 2 );
100
+ characters [ 0 ] = c ;
101
+
102
+ char * a2b = find_pattern ( hex_values_ptr , characters ) ;
103
+ next_var = a2b - ( uintptr_t ) hex_values_ptr ;
104
+ if (! a2b )
105
+ next_var = 0 ;
106
+ total_iterations += next_var ;
109
107
}
110
-
111
108
// step 2
112
109
113
- int ret ;
114
110
unsigned int offset = 7 ;
115
111
116
112
if (offset <= total_iterations )
117
113
{
118
114
int c = 0 ;
119
- i = 0x1c ;
115
+ int start_at = 0x1c ;
120
116
unsigned int r3 = total_iterations >> 4 ;
121
117
if (offset <= r3 >> 0xC )
122
118
{
123
- i -= 0x10 ;
124
- r3 << = 0x10 ;
119
+ start_at -= 0x10 ;
120
+ r3 >> = 0x10 ;
125
121
}
126
122
if (offset <= r3 >> 0x10 )
127
123
{
128
- i -= 0x8 ;
129
- r3 << = 0x8 ;
124
+ start_at -= 0x8 ;
125
+ r3 >> = 0x8 ;
130
126
}
131
127
if (offset <= r3 )
132
128
{
133
- i -= 0x4 ;
134
- r3 << = 0x4 ;
129
+ start_at -= 0x4 ;
130
+ r3 >> = 0x4 ;
135
131
}
136
132
137
- unsigned int r0 = total_iterations << (i & 0xFF );
133
+ unsigned int r0 = total_iterations << (start_at & 0xFF );
138
134
139
- i = i + i * 2 ;
140
135
141
136
c = ((long long int )r0 * 2 ) > 0xFFFFFFFF ;
142
137
r0 = r0 * 2 ;
143
138
144
139
printf ("Starting Carry: %x\n" , c );
145
140
146
141
147
- return the_crazy_math_part (r0 , r3 , c );
142
+ return the_crazy_math_part (r0 , r3 , c , start_at );
148
143
}
149
144
return 0 ;
150
145
}
151
146
152
- unsigned int hex_to_bytes (char * input , int iterator , int multiplier )
147
+ unsigned int hex_to_bytes (char * input , int iterator )
153
148
{
154
149
byte * iteration ;
155
150
byte * final_char ;
@@ -228,15 +223,15 @@ int main()
228
223
229
224
snprintf (formatted , 64 , "%s%s%s" , mac_address , maccas_id , mannager_id );
230
225
printf ("Formatted Data: %s\n" , formatted );
231
- int multiplier = find_multiplier (formatted , ( unsigned int ) maccas_id );
226
+ int multiplier = find_multiplier (formatted );
232
227
printf ("Multiplier: %x\n" , multiplier );
233
228
substitute (formatted , encoded , multiplier );
234
229
printf ("Encoded Data: %s\n" , encoded );
235
230
unsigned short password_values [6 ];
236
231
memset (password_values , 0x00 , 6 * 2 );
237
232
238
233
do {
239
- int chr = hex_to_bytes (encoded , iterator , multiplier );
234
+ int chr = hex_to_bytes (encoded , iterator );
240
235
i = ii + 1 ;
241
236
password_values [ii ] = (unsigned short )chr ;
242
237
iterator = iterator + 4 ;
0 commit comments