دالة xor التي تطبق على الهيدر والريموت بعد فك التشفير للمعالج ALI3516
C:
#include <stdio.h>
size_t size = 296;
// header.bin ==> 296
// remote.bin ==> 208
#define decode(n) n=((n>>(0x20-c))|(n<<c))
#define encode(n) n=((n<<(0x20-c))|(n>>c))
unsigned char bitshift [16] = {0x18,0x04,0x11,0x08,0x1D,0x0B,0x07,0x15,0x19,0x06,0x1A,0x1C,0x0E,0x1B,0x13,0x0D};
unsigned char * key = "qr0efghi0jkmlnstwv54xyz01abcd67op2012q";
void printHex(unsigned char * buffer) {
int i = 0;
while(i<size) {
printf("%02X%s", buffer[i],((i+1)%16==0)?"\n":" ");
i++;
}
printf("\n");
}
int loadfile(char * filename,unsigned char * buf){
FILE * f = fopen(filename, "rb");
if (!f) {
printf("Failed to open \"%s\"", filename);
return -1;
}
if (fread(buf, size, 1, f) != 1) {
printf("Failed to read %zu bytes\n", size);
return -1;
}
fclose(f);
return 0;
}
int main(int argc, char *argv[]) {
unsigned char buf[size];
unsigned int *n, i;
if( loadfile(argv[1], buf)<0) return -1;
i = 0;
while(i<size) {
unsigned char k = key[(i % 0x26)];
k = ( (k<<6)&0xff ) | ( (k>>2)&0xff );
buf[i] = buf[i] ^ k;
i++;
}
i = 0;
while(i<size/4) {
unsigned char c = bitshift[(i % 0x10)];
n = (unsigned int *)(buf+4*i);
decode(*n); // use encode for the inverse operation
i++;
}
printHex(buf);
}
الدالة decode لفك الترميز والدالة encode للترميز مرة أخرى.