#include <stdint.h>
#include <string.h>
#include <stdio.h>
#ifndef _WIN32
#define __stdcall
#endif
int __stdcall ted(uint8_t* input_buf, uint8_t* output_buf, uint8_t arg_8) {
uint8_t permuted_input[10];
permuted_input[0] = input_buf[6]; // var_10
permuted_input[1] = input_buf[9]; // var_F
permuted_input[2] = input_buf[1]; // var_E
permuted_input[3] = input_buf[4]; // var_D
permuted_input[4] = input_buf[8]; // var_C
permuted_input[5] = input_buf[3]; // var_B
permuted_input[6] = input_buf[7]; // var_A
permuted_input[7] = input_buf[0]; // var_9
permuted_input[8] = input_buf[5]; // var_8
permuted_input[9] = input_buf[2]; // var_7
uint8_t var_24[4] = {0, 0, 0, 0};
uint8_t key_string[] = {
0x6F, 0x6D, 0x65, 0x64,
0x4F, 0x4D, 0x45, 0x44,
0x45, 0x44, 0x4F, 0x4D
};
uint8_t var_1D = 0xEA;
for (int i = 0; i < 10; i++) {
uint8_t val = permuted_input[i];
uint16_t product1 = (i + 1) * val;
uint8_t p1_low = (uint8_t)product1;
var_24[0] += p1_low;
var_24[1] -= p1_low;
uint16_t product2 = (i + 0x38) * val;
var_24[2] += (uint8_t)product2;
}
uint8_t al = var_24[0] * permuted_input[0];
uint8_t bl = var_24[1] ^ al;
var_24[2] = ((bl + 1) ^ var_24[2]) & 3;
uint8_t current_dl = var_1D;
for (int i = 0; i < 12; i++) {
uint8_t key_char = key_string[i];
-
// The original assembly does: mov al, [ebp + key_char + var_10]
// This reads outside the 'permuted_input' array.
uint8_t magic_byte = *( (&permuted_input[0]) + key_char );
uint8_t calculated = magic_byte ^ current_dl;
uint8_t add_val = (uint8_t)(i * 5);
calculated += add_val;
output_buf[i] = calculated;
current_dl = calculated + 0x22;
}
uint8_t final_byte = ((arg_8 * 4) & 0x0C) | var_24[2];
output_buf[12] = final_byte;
return 1;
}
int main() {
uint8_t input[] = {0,1,2,3,4,5,6,7,8,9};
uint8_t output[13];
ted(input, output, 0x10);
return 0;
}