How encrypt/decrypt a executable file using XTEA algorithm?

  • Thread starter Thread starter FLASHCODER
  • Start date Start date
F

FLASHCODER

Guest
I'm having a trouble with code below when i decrypt a executable file. The code run without none crash or something like it. The strange is that the file not is decrypted, stays corrupted. What's missing to this works fine? thank you by any suggestion.

// xtea.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <fstream>
#include <stdint.h>
#include <cstring>
#include <cstdlib>
#include <stdlib.h>

using namespace std;

unsigned int key[4] = { 0xBB8,0xFA0,0x1388,0x1B58 };
#define BLOCK_SIZE 8

/*
XTea reference code taken from
XTEA - Wikipedia
*/
void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0 = v[0], v1 = v[1], sum = 0, delta = 0x9E3779B9;
for (i = 0; i < num_rounds; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
}
v[0] = v0; v[1] = v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta * num_rounds;
for (i = 0; i < num_rounds; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0] = v0; v[1] = v1;
}

void crypto(char filepath[], bool cipher) {
fstream dat(filepath, ios::in | ios::out | ios::binary); //Open the file
if (!dat) {
cout << "I can not read from the file you provided. Sorry :\(" << endl;
system("pause");
exit(-1);
}

unsigned size;

dat.seekg(0, ios::end);
size = dat.tellg();
dat.seekg(ios::beg);

dat.clear();

unsigned pos;

int n_blocks = size / BLOCK_SIZE;
if (size % BLOCK_SIZE != 0)
++n_blocks;

for (int i = 0; i < n_blocks; i++) { //for every character in the executable, encipher the character
unsigned char data[BLOCK_SIZE];
pos = dat.tellg();

dat.read((char*)data, BLOCK_SIZE);

if (cipher) encipher(32, (uint32_t*)data, key);
else decipher(32, (uint32_t*)data, key);

dat.seekp(pos);
dat.write((char*)data, BLOCK_SIZE);

memset(data, 0, BLOCK_SIZE);
}
dat.close(); //all the enciphered data was sent back the the executable
}

int main(int argc, char* argv[]) {

if (argc < 2) { //RTFM
fprintf(stderr, "Usage: %s [filepath]\n", argv[0]);
return 1;
}

crypto(argv[1], true); //true > cipher, false > decipher
cout << "Finished Ciphering " << endl;
system("pause"); //press any key to continue
return 0;
}

Continue reading...
 
Back
Top