from binascii import hexlify
def crypto(string): #SOUL123412341234
buffer = hex(int(string[4:12]))
array = [0x57, 0x1F, 0x06, 0x2C, 0x34, 0x0B, 0x58, 0x2F, 0x11, 0x0B, 0x29, 0x5E, 0x05, 0xFF, 0x04, 0x1D]
esi = 0xD1E7
var4 = 0
for byte in xrange(len(string)):
if byte < 12:
eax = int(hexlify(string[byte]), 16)
eax = (eax & 0x7F) & 0xFFFFFFFF
edx = eax
eax = (eax << byte) & 0xFFFFFFFF
edx = (edx * esi) & 0xFFFFFFFF
esi = (esi ^ edx) & 0xFFFFFFFF
edx = array[byte]
esi = (esi + eax) & 0xFFFFFFFF
eax = esi
var4 = edx
if eax > 0: edx = 0x00
else: edx = 0xFFFFFFFF
edx = eax % 0x64
var4 = (var4 + edx) & 0xFFFFFFFF
eax = (eax / 0x64) & 0xFFFFFFFF
esi = (esi - var4) & 0xFFFFFFFF
else: break
esi = esi & 0x7FFFFFFF
if buffer < 0x0CE4:
eax = esi
if eax > 0: edx = 0x00
else: edx = 0xFFFFFFFF
var4 = eax % 0xFF2F
eax = eax / 0xFF2F
esi = var4
esi = esi & 0xFFFF
#EBP+C and EDI are both pointers to variables, unknown to me atm
#if EBP+C == 0:
#[EBP+C] = EDI
return hex(int(esi))
print crypto("SOUL123412341234")