奇怪的问题,0x8b450883取char为0xcc,取int为0x830845cc

BeanJoy 2013-01-20 04:21:33

上图,注意看570-576行,代码如下:

DWORD dwProtect = 0;
VirtualProtect(GetRoutineAddress(ReThread), 32, PAGE_EXECUTE_READ | PAGE_NOCACHE, &dwProtect);
memcpy(szOpCodes+30, (LPBYTE)GetRoutineAddress(ReThread)+30, 1);
szOpCodes[1] = *((LPBYTE)GetRoutineAddress(ReThread)+30);
LPBYTE ppp = (LPBYTE)GetRoutineAddress(ReThread);
ppp = ppp + 30;
szOpCodes[2] = *ppp;
char c = (char)*ppp;
BYTE byte = (BYTE)*ppp;
BYTE byte1 = 0x8b450883;
int nnn = *ppp;
int *pp = (int*)ppp;
int nn = *pp;
VirtualProtect(GetRoutineAddress(ReThread), 32, dwProtect, &dwProtect);

自动把8b改成了cc,很奇怪,理解不了。用NtWriteVirtualMemory写时,写错了8b,注入后直接飞掉,我以为这个方法不行。后来发现是这么个问题,会自动把8b改成cc。直接使用memcpy也不行,就这个8b错误,其他都正确。右上角汇编窗口红框处是开始出现问题的地方。谁能来解释一下哪里的问题?
操作系统:XP SP3
编译器:VS2008
...全文
478 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyuyanxinshou 2013-06-13
  • 打赏
  • 举报
回复
大小端格式啊,大小端
jimette 2013-01-21
  • 打赏
  • 举报
回复
只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 6 楼 sha_jinhao 的回复:
,那“err,hr”是上次调用API的结果 你上个传参都是错误的 怎么就能保证以后是对的 前面错误 后面可以正确?
只要我不调用Windows api,“err,hr”可以一直保持,甚至到程序结束。 如果我只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,这如何影响我用int nn = *pp;的结果? 我关注的是一个汇编指令mov cl,byte ptr [eax]结果为什么不正确,而不是一个函数! 难道我调试时Windows还会把这个mov指令给裁成几个指令,这几个指令的执行还受LastError的影响,而只给我们显示一个mov,而且也是一步执行?
jimette 2013-01-21
  • 打赏
  • 举报
回复
,那“err,hr”是上次调用API的结果 你上个传参都是错误的 怎么就能保证以后是对的 前面错误 后面可以正确?
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
看我10楼分析,没初始始化是值是0xcc,应该就是为了引起中断,由此判断访问是否合法。
引用 11 楼 lostying 的回复:
你是否正好在ReThread+30这个地方设了一个断点,调试器运行时改成了0xcc,断时又恢复成正常数值,你赋值时正好是0xcc.
10楼忘了把你引上,这儿重新引一下。
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
0xcc倒是像没初始化的指针,但看我5楼回复,在调用这个指令前,我能保证eax指向的内容是正确的。 结帖,问题也不用验证了!中断汇编码int 3,opcode正好为0xcc。虽然这个函数在运行的这个进程内不用执行,但我可能还是加了断点。 看来这个地址的值确实被改成了0xcc,但VS调试显示时还是按原来的显示,所以按地址取值时,取出来的是0xcc,出不是原来的值。
无言猪 2013-01-21
  • 打赏
  • 举报
回复
你是否正好在ReThread+30这个地方设了一个断点,调试器运行时改成了0xcc,断时又恢复成正常数值,你赋值时正好是0xcc.
schlafenhamster 2013-01-21
  • 打赏
  • 举报
回复
“执行mov cl,byte ptr [eax]后,cl为0xcc,” 【eax】中 eax 像是 没初始化 的 指针 (0xCCCC)
BeanJoy 2013-01-21
  • 打赏
  • 举报
回复
引用 8 楼 sha_jinhao 的回复:
只是调用ShowWindows(NULL,SW_SHOW)系统返回“err,hr”错误,
我举例说明并不是LastError随时都有用。
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
引用 2 楼 sha_jinhao 的回复:
lz 提示参数不正确 问题都没解决!
哥哥,那“err,hr”是上次调用API的结果,并不是后面赋值操作的结果。 我不会患这么低级的错误,而且LastError大多数只在调用Windows API失败的情况下才有用,极少情况下调用成功也需查询LastError。
jimette 2013-01-20
  • 打赏
  • 举报
回复
lz 提示参数不正确 问题都没解决!
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
还忘了说,ppp指向的地方是代码区域,我以为可能和此区域的属性有关,就用VirtualProtect更改了属性,结果还是一样,8b还是成了cc。
BeanJoy 2013-01-20
  • 打赏
  • 举报
回复
引用 4 楼 stjay 的回复:
可能是调试器改的,是不是在函数ReThread里下了断点?
没有,原程序中ReThread并不运行,只是编译,然后会被拷贝到另一进程的地址空间中,拷贝过程中出现问题。 调试器改这个也没意义啊,ReThread处的0x8b正常,我是将0x8b处的值赋给另一个其他变量时,其他变量变成了0xcc。 单步运行汇编,eax指向8b 45 08 83,执行mov cl,byte ptr [eax]后,cl为0xcc,我就想不通,这么个mov指令到底如何执行的,能将8b改成cc?
stjay 2013-01-20
  • 打赏
  • 举报
回复
可能是调试器改的,是不是在函数ReThread里下了断点?

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧