在IDA中反转X86,在Ptr上反转Xor Keys

时间:2016-06-19 09:45:05

标签: assembly reverse-engineering ida

我目前正在学校和家中使用8051,我正在使用x86。现在我正在扭转游戏并尝试访问地址。问题是地址是xord。 Normaly我可以轻松找到钥匙。 但现在我有点困惑,无法找到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: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: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

但我也失败了。 通常我习惯这样的xoring:

.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

所以我会到达:XOR Key = 0x1735146A

有人可以用奇怪的xoring帮助我第一个吗?

1 个答案:

答案 0 :(得分:0)

检查ecx ==某些常量似乎是一种超级复杂的方法,因为最后它将它与零和分支进行比较。 (当两个输入相同时,XOR只产生零结果。)我没有看到它被用作指针,除非它在以后出现,如果它不是NULL。

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