64位命令行程序输出“ANOMALY: use of REX.w is meaningless (default operand size is 64)”的问题

写了个小dll来干点“坏事”,使用了mhook这个库,2.4最新版的,注入到别的什么进程中,hook个什么API,来干扰下什么操作。。

然后发现,注入到64位程序时,总会在命令行中输出:

ANOMALY: use of REX.w is meaningless (default operand size is 64)

当然是先百度啦!然后肯定是没有找到啊(Google也没有,不然我还写这个干什么)。

去源码里搜这段内容,发现是disasm_x86.c文件中的X86_GetInstruction函数输出的,这个函数有个Flag参数用于控制是否输出。

C语言代码看的头大,不想看,于是就想直接禁止掉这个输出,根据经验,肯定有个什么全局Flag可以控制的。再根据经验,这个Flag应该是个#define在某个文件的顶部。

好吧,根据这个思路去找,把所有文件找一遍,没有找到,这不按常理出牌啊!

于是继续搜调用这个函数的代码,还是没找到,因为它把这个函数地址保存在了一个struct中,然后几个struct嵌套,在里面来回跳,噢晕了。。


是的,上面全是废话,找这么久让我抱怨一下嘛。

这个Flag,最终是在mhook.cpp中指定的,在DisassembleAndSkip函数中,2.4版本是在第572行,这一行原本为:

DWORD dwFlags = DISASM_DECODE | DISASM_DISASSEMBLE | DISASM_ALIGNOUTPUT;

把它改为:

DWORD dwFlags = DISASM_DECODE | DISASM_DISASSEMBLE | DISASM_ALIGNOUTPUT | DISASM_SUPPRESSERRORS;

就不会输出了,其实可以做下判断,如果是DEBUG版本就输出,RELEASE就禁止掉。

PS.这个文我先发到了csdn博客上,然后发现还需要审核。。算了,还是发到这里吧,这里还是我自己说了算的,虽然速度慢点。

3 条回复

  1. jerry说道:

    我只是想问下,哪里找这个文件,

  2. DavidZ说道:

    我卸载了IP-GUARD这个监控软件就解决了这个问题,具体卸载方法可以参考我的博客 https://blog.davidz.cn/inspur-ip-guard-uninstallation/ 也可以自行百度。

    • 二叉白403说道:

      任何使用mhook库的软件都有可能出现,不止是你说的这个软件,想排查也很容易。
      不过文中是我自己写的一个插件输出的,源码都在自己手里,改源码就行了。
      顺便一提,mhook最新版已经解决了这个问题,世面上已有的软件可能并不会那么快更新到最新版。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

扫码去手机上看