汇编 - cmp不起作用

时间:2016-09-27 09:32:27

标签: assembly compare

我正在尝试用其他方法替换程序集中的unicode字符串(其长度为8)。字符串开头的地址增加了0x10并存储在EDI中。我知道字符串值,但它的地址正在改变,所以我不能用地址替换它。我在Cheat Engine中使用Code Injection。 该代码有效:

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。那么我应该如何比较这些值?

2 个答案:

答案 0 :(得分: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中的值(可能是某个缓冲区地址)。

答案 1 :(得分: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

现在可行。