我来看看 发表于 2013-7-12 15:15:28

问个C++内存相关问题

初学者,望大神们不吝赐教
比如如下一个C++定义修改内存的的宏代码
patch(0x406B53,"\x90\x8B\x09");
patch(0x2A0930,"\xD2");
如上代码中,前面应该是偏移量,后面的我猜猜是把0变1或者1变0的过程,但是具体如“\XD2”看不懂。为什么要加引号,以及XD2是代表高位还是低位?百度查了半天找不到相关内容
如有错误请指正
有的哪个大神来详细告诉下{:soso_e183:}

青春染指悲伤ヽ 发表于 2013-7-12 18:01:47

vc不懂易语言我可以教你

mar1321 发表于 2013-7-12 18:38:54

我只拿成品 其他不懂

ffpwserver 发表于 2013-7-12 19:13:12

\x后面跟的是字节码
汇编指令在内存中都是以字节码形式存在
比如汇编的nop指令,对应字节码为\x90
那么\x90\x8B\x09即为将该处的汇编指令替换为
nop
mov ecx,
当然有时候还要结合该处上下文来看
有个工具叫Asm2MachineCode就是用于汇编指令和机器码转换的

qghostl 发表于 2013-7-13 09:41:40

比如如下一个C++定义修改内存的的宏代码
patch(0x406B53,"\x90\x8B\x09");
patch(0x2A0930,"\xD2"); 其实玩儿过OD就很容易理解了。

0x406B53,"\x90\x8B\x09"

前面的是内存地址,之后\x90\x8B\x09的是二进制代码


估计这个内存地址是个关键跳转。00424FFB   /75 08             jnz short CCMClien.00425005
00424FFD   |6A 10             push 0x10
00424FFF|. |E8 B2000000       call CCMClien.004250B6
00425004|. |59                pop ecx
00424FFB      90                nop    ;此处nop掉后,跳转就无效了
00424FFC      90                nop
00424FFD      6A 10             push 0x10
00424FFF|.E8 B2000000       call CCMClien.004250B6
00425004|.59                pop ecx
00425005|>33F6            xor esi,esi

htpidk 发表于 2013-7-13 12:15:10

0X表示16进制,后面的数字是机器码,看看汇编怎么转换机器码的资料就很容易理解了

wow 发表于 2013-7-13 14:29:01

你就理解成0x90形势就行了:P

夜尽天明 发表于 2013-7-13 19:08:55

加引号是因为patch函数第二个要求的是字符串的参数,因为要用字符串填充内存。

蛋疼的蛋 发表于 2013-10-30 14:36:34

:o小白来看看
页: [1]
查看完整版本: 问个C++内存相关问题