Assembly 在IDA中反转X86,Ptr上的Xor键到对象

Assembly 在IDA中反转X86,Ptr上的Xor键到对象,assembly,reverse-engineering,ida,Assembly,Reverse Engineering,Ida,我目前在学校使用8051,在家使用x86。现在我正在逆转一个游戏,并试图访问一个地址。问题是地址是xord。通常我很容易找到钥匙。 但是现在我有点困惑,找不到Xor键。 有人能解释一下他们现在在做什么吗?我尝试构建密钥,并得到: ^ 0xCDDEED); 似乎这是错误的代码: .text:0052DCF5 mov ecx, [esi+0D2164h] <--- esi is a pointer to an instance of what they

我目前在学校使用8051,在家使用x86。现在我正在逆转一个游戏,并试图访问一个地址。问题是地址是xord。通常我很容易找到钥匙。 但是现在我有点困惑,找不到Xor键。 有人能解释一下他们现在在做什么吗?我尝试构建密钥,并得到:

^ 0xCDDEED);
似乎这是错误的代码:

.text:0052DCF5                 mov     ecx, [esi+0D2164h] <--- esi is a pointer to an instance of what they call objectmanager
.text:0052DCFB                 mov     [esp+1Ch+var_18], ecx
.text:0052DCFF                 mov     dl, byte ptr [esp+1Ch+var_18+2]
.text:0052DD03                 mov     al, byte ptr [esp+1Ch+var_18+3]
.text:0052DD07                 xor     byte ptr [esp+1Ch+var_18+1], 0DEh
.text:0052DD0C                 xor     cl, 0ECh
.text:0052DD0F                 xor     dl, 0D2h
.text:0052DD12                 xor     al, 0Fh
.text:0052DD14                 xor     cl, 1
.text:0052DD17                 xor     dl, 1Fh
.text:0052DD1A                 not     al
.text:0052DD1C                 mov     byte ptr [esp+1Ch+var_18], cl
.text:0052DD20                 mov     byte ptr [esp+1Ch+var_18+2], dl
.text:0052DD24                 mov     byte ptr [esp+1Ch+var_18+3], al
.text:0052DD28                 cmp     [esp+1Ch+var_18], 0
.text:0052DD2D                 jz      short loc_52DD46
.text:0052DD2F                 push    6EBh
试着这样做:

.text:0052DD1C                 mov     byte ptr [esp+1Ch+var_18], cl <-- Key 3 = .text:0052DD0C                 xor     cl, 0ECh
.text:0052DD20                 mov     byte ptr [esp+1Ch+var_18+2], dl <-- Key 2 = .text:0052DD0F                 xor     dl, 0D2h
.text:0052DD24                 mov     byte ptr [esp+1Ch+var_18+3], al <-- key 1 = .text:0052DD12                 xor     al, 0Fh
.text:01410C95                 mov     eax, dword_1B8F6DC <--- contains ptr to the same objectmanager
.text:01410C9A                 mov     [esp+1Ch+var_C], eax
.text:01410C9E                 xor     byte ptr [esp+1Ch+var_C+2], 35h<-- key 2
.text:01410CA3                 xor     byte ptr [esp+1Ch+var_C+1], 14h<-- key 3
.text:01410CA8                 xor     byte ptr [esp+1Ch+var_C+3], 17h <-- key 1
.text:01410CAD                 mov     cl, al
.text:01410CAF                 xor     cl, 6Ah<-- key 4
.text:01410CB2                 mov     byte ptr [esp+1Ch+var_C], cl
.text:01410CB6                 cmp     [esp+1Ch+var_C], 0
.text:01410CBB                 jnz     short loc_1410CD6

.text:0052DD1C mov byte ptr[esp+1Ch+var_18],cl检查ecx==某个常数似乎是一种非常复杂的方法,因为最后它会将其与零和分支进行比较。(只有当两个输入相同时,XOR才会产生零结果。)我不认为它会被用作指针,除非它不是空的时候会出现

为什么不在代码运行时单步执行此代码,并在
ecx
中记录加载的初始值,在
[esp+1Ch+var_18]
中记录最终值呢。这两个32位值的异或是关键,因为初始值将被抵消,只留下被中间指令翻转的位集。根据定义,这就是XOR键。

有一个整体。不过,这可能也太宽泛了。你能澄清一下你到底想弄明白什么吗?
.text:01410C95                 mov     eax, dword_1B8F6DC <--- contains ptr to the same objectmanager
.text:01410C9A                 mov     [esp+1Ch+var_C], eax
.text:01410C9E                 xor     byte ptr [esp+1Ch+var_C+2], 35h<-- key 2
.text:01410CA3                 xor     byte ptr [esp+1Ch+var_C+1], 14h<-- key 3
.text:01410CA8                 xor     byte ptr [esp+1Ch+var_C+3], 17h <-- key 1
.text:01410CAD                 mov     cl, al
.text:01410CAF                 xor     cl, 6Ah<-- key 4
.text:01410CB2                 mov     byte ptr [esp+1Ch+var_C], cl
.text:01410CB6                 cmp     [esp+1Ch+var_C], 0
.text:01410CBB                 jnz     short loc_1410CD6