1

我尝试解析加密的 &RQ 历史,但我真的无法理解 asm 代码。它嵌入到 Delphi 函数中。

有人可以帮助我理解这一点吗?

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

谢谢。

4

3 回答 3

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);
    }
}
于 2012-06-15T12:44:24.997 回答
1

是的,我终于让它工作了。这是生成的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)
于 2012-06-19T15:36:53.867 回答
0

汇编函数采用加密字符串和解密密钥。对密钥使用一些固定的数学运算,解密字符串。我找到了一个 Delphi 例子,它做同样的事情,但更简单;

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

如果您想要的话,您可以将 ekini 的 Python 代码转换为 Delphi 以摆脱 Delphi 应用程序中的 asm 代码。

于 2012-06-24T15:15:15.100 回答