2012-06-15 2 views
1

Я пытаюсь разобрать зашифрованный файл & RQ, но я действительно не могу понять код asm. Он встроен в функцию Delphi.Что делает этот код? Delphi asm

Может ли кто-нибудь помочь мне понять это?

procedure decritt(var s:string; key:integer); 
asm 
mov ecx, key 
mov dl, cl 
shr ecx, 20 
mov dh, cl 

mov esi, s 
mov esi, [esi] 
or esi, esi // nil string 
jz @OUT 

// now esi points to the first character of the string 

mov ah, 10111000b 

mov ecx, length(s) 
or ecx, ecx 
jz @OUT 
@IN: 
mov al, [esi] 
xor al, ah 
rol al, 3 
xor al, dh 
sub al, dl 

mov [esi], al 
inc esi 
ror ah, 3 
dec ecx 
jnz @IN 
@OUT: 
end; // decritt 

Спасибо.

ответ

2

Этот C++ код будет эквивалентен:

void encrypt(std::string s, int key) { 

    const char dl = key; 
    const char dh = key >> 20; 
    char ah = 0xB8; 

    for (int i=0; i<s.length(); ++i) { 
     char c = s[i]; 
     c ^= ah; 
     c = (c<<3)|(c>>5); // rotate a char three bits left 
     c ^= dh; 
     c -= dl; 
     s[i] = c; 
     ah = (ah>>3)|(ah<<5); 
    } 
} 
+0

Он выглядит правильно, но не работает. Не знаю, почему. Ключ 300109517, результирующая строка должна быть «hello world», зашифрованная строка «\ xdd \ x92 \ x06 \ xb8 \ xcf \ x0f \ x65 \ x81 \ x9c \ xf3 \ x07" – ekini

+0

Вы можете выполнить он с отладчиком для итерации или два и смотреть rgisters al, ах. Посмотрите, соответствуют ли их значения значениям одинаковых именованных переменных в моей программе на C. – hirschhornsalz

1

YAY, наконец, я получил это работает. Вот результирующий код python:

def decrypt(self, string, key): 
    decrypted = [] 

    dl = key & 0xffff 
    dh = key >> 20 
    ah = 0xb8 

    for i in xrange(0, len(string)): 
     c = ord(string[i]) 
     c ^= ah & 0xff 
     c = ((c<<3)|(c>>5)) & 0xff 
     c ^= dh & 0xff 
     c = (c - dl) & 0xff 

     decrypted.append(chr(c & 0xff)) 
     ah = ((ah>>3)|(ah<<5)) & 0xff 

    return "".join(decrypted) 
0

Функция сборки принимает зашифрованную строку и ключ дешифрования. Используя некоторые фиксированные математические операции с ключом, он расшифровывает строку. Я нашел пример Delphi, который делает то же самое, но проще;

http://www.delphifaq.com/faq/delphi/strings/f95.shtml

Вы можете преобразовать код Python ekini на Delphi, чтобы избавиться от кода ассемблерный в приложении Delphi, если это то, что вы хотите.