我尝试解析加密的& 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
感谢。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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)
答案 2 :(得分:0)
汇编函数采用加密字符串和解密密钥。使用一些固定的数学运算和密钥,解密字符串。我发现了一个Delphi示例,它做的相同,但更简单;
http://www.delphifaq.com/faq/delphi/strings/f95.shtml
您可以将ekini的Python代码转换为Delphi,以便在您的Delphi应用程序中删除asm代码,如果这是您想要的。