首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组装- cmp不起作用

组装- cmp不起作用
EN

Stack Overflow用户
提问于 2016-09-27 09:32:26
回答 2查看 1.7K关注 0票数 0

我试图用其他方法替换程序集中的unicode字符串(长度为8)。开始的字符串的地址增加了0x10,并存储在EDI中。我知道字符串值,但是它的地址正在改变,所以我不能用地址代替它。我在作弊引擎中使用代码注入。该守则适用于:

代码语言:javascript
运行
复制
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:

但事实并非如此:

代码语言:javascript
运行
复制
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。那么,我应该如何比较这些值呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-27 12:49:36

问题是欺骗引擎将常量处理为4字节,而不是1字节。我不得不这样写:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-09-27 09:58:27

cmp edi,0341E340将edi (no memory access)中的值与一些东西进行了比较,我猜这应该是十六进制常数。

cmp [edi-10],41将地址edi-10 (内存的内容)的值与41进行比较.从这种指令格式来看,不清楚是比较字节还是比较dword值。

但无论如何,这两个人都在做完全不同的事情。

例如,如果您这样做:

代码语言:javascript
运行
复制
; 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39721102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档