我试图用其他方法替换程序集中的unicode字符串(长度为8)。开始的字符串的地址增加了0x10,并存储在EDI中。我知道字符串值,但是它的地址正在改变,所以我不能用地址代替它。我在作弊引擎中使用代码注入。该守则适用于:
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。那么,我应该如何比较这些值呢?
发布于 2016-09-27 12:49:36
问题是欺骗引擎将常量处理为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
现在起作用了。
发布于 2016-09-27 09:58:27
cmp edi,0341E340
将edi (no memory access)中的值与一些东西进行了比较,我猜这应该是十六进制常数。
cmp [edi-10],41
将地址edi-10 (内存的内容)的值与41进行比较.从这种指令格式来看,不清楚是比较字节还是比较dword值。
但无论如何,这两个人都在做完全不同的事情。
例如,如果您这样做:
; 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
中的值(可能是某个缓冲区地址)。
https://stackoverflow.com/questions/39721102
复制相似问题