2016-09-27 56 views
0

我试图用一些其他替换一个unicode字符串(其长度为8)。字符串开头的地址增加0x10并存储在EDI中。我知道字符串值,但其地址正在改变,所以我不能用地址替换它。我在作弊引擎中使用代码注入。 该代码工作:大会 - cmp不工作

alloc(newmem,4096) 
label(returnhere) 
label(originalcode) 
label(exit) 

newmem: 

repe movsb 
cmp edi,0341E340 
jne originalcode 
mov [edi-10],31 
mov [edi-0E],32 
mov [edi-0C],33 
mov [edi-0A],34 
mov [edi-08],35 
mov [edi-06],36 
mov [edi-04],37 
mov [edi-02],38 

originalcode: 

jmp MSVCR120.memcpy+53 

exit: 
jmp returnhere 

"MSVCR120.dll"+F20C: 
jmp newmem 
nop 
nop 
returnhere: 

但这并不:

alloc(newmem,8192) 
label(returnhere) 
label(originalcode) 
label(exit) 

newmem: 

repe movsb 

cmp [edi-10],41 
jne originalcode 
cmp [edi-0E],42 
jne originalcode 
cmp [edi-0C],43 
jne originalcode 
cmp [edi-0A],44 
jne originalcode 
cmp [edi-08],45 
jne originalcode 
cmp [edi-06],46 
jne originalcode 
cmp [edi-04],47 
jne originalcode 
cmp [edi-02],48 
jne originalcode 

mov [edi-10],31 
mov [edi-0E],32 
mov [edi-0C],33 
mov [edi-0A],34 
mov [edi-08],35 
mov [edi-06],36 
mov [edi-04],37 
mov [edi-02],38 

originalcode: 

jmp MSVCR120.memcpy+53 

exit: 
jmp returnhere 

"MSVCR120.dll"+F20C: 
jmp newmem 
nop 
nop 
returnhere: 

当然这两个代码可以被组装,但第二个不执行任何操作(它无法通过比较部分) 。 我确定我比较的值是好的,因为当edi是0341E340时,我设置了一个断点。更重要的是,当我执行第一个和第二个代码时(一起确保值是正确的),它也不起作用。 作弊引擎将常量视为十六进制值(正是我想要的),它不理解我是否写入,例如0Ch。那么我应该如何比较这些值呢?

+0

我有点惊讶这个没有投诉的组装,它在这里选择什么作为默认的操作数大小?字节?双字?可能不是单词,这可能很奇怪,但你似乎认为 – harold

+0

这两个代码质量差。添加大小修饰符,你希望它们是怎么样的,比如'cmp [edi-10],byte 41'..你也使用'0C',这不是一个数字,'0x0C'或'0Ch',或者任何你的汇编程序支持,但我没有看到没有任何前缀/后缀的默认六进制数字。你为什么不在这里复制一些可以组装的代码? – Ped7g

+0

我编辑了我的问题,并放置了一些可以组装的代码。 – Enri

回答

0

问题在于Cheat Engine将常量视为4字节,而不是1字节。我不得不这样写:

cmp [edi-10],00320031 
jne originalcode 
cmp [edi-0C],00340033 
jne originalcode 
cmp [edi-08],00360035 
jne originalcode 
cmp [edi-04],00380037 
jne originalcode 

现在它的工作。

0

cmp edi,0341E340比较edi中的值(没有内存访问)与什么东西,我猜应该是十六进制常量。

cmp [edi-10],41在地址EDI-10(内容的存储器)与41比较值从该指令格式现在还不清楚,字节或双字值是否被进行比较。

但无论如何,这两者正在做一些完全不同的事情。

比如你做的事:

; preparing test values + memory content for examples 
mov edi,bufferAddress ; pointer to some writeable free memory 
mov [edi],byte 41  ; all values are decimal 
mov [edi+1],byte 1 
; then these will evaluate as "equal" (ZF=1) 
cmp edi,bufferAddress 
cmp [edi],byte 41 
cmp [edi],word 256+41 ; x86 little-endian 
; these will evaluate as "not equal" (ZF=0) 
cmp edi,bufferAddress+1 
cmp [edi],word 41 ; on [edi+1] is "1" instead of 0 

所以这是完全乱了套,为什么你连这两个例子混合在一起。

第二种情况是否有效取决于内存的内容。第一个作品是否取决于edi(可能是某个缓冲区地址)中的值。

+0

是的,0341E340是EDI的内容,它是我的字符串开始的地址。问题是,我可以跟踪地址,但每次运行程序时都会改变,所以我无法对其进行硬编码。 – Enri