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博客上,然后发现还需要审核。。算了,还是发到这里吧,这里还是我自己说了算的,虽然速度慢点。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
我只是想问下,哪里找这个文件,
我卸载了IP-GUARD这个监控软件就解决了这个问题,具体卸载方法可以参考我的博客 https://blog.davidz.cn/inspur-ip-guard-uninstallation/ 也可以自行百度。
任何使用mhook库的软件都有可能出现,不止是你说的这个软件,想排查也很容易。
不过文中是我自己写的一个插件输出的,源码都在自己手里,改源码就行了。
顺便一提,mhook最新版已经解决了这个问题,世面上已有的软件可能并不会那么快更新到最新版。