本帖最后由 alex310110 于 2020-12-16 13:57 编辑
网上随便找了个x86-64二进制反汇编网站 https://defuse.ca/online-x86-assembler.htm#disassembly2,贴进去看了下(多贴了个83 e1 0f ),那个操作把
- 0: 75 30 jne 0x32
- 2: 33 c9 xor ecx,ecx
- 4: b8 01 00 00 00 mov eax,0x1
- 9: 0f a2 cpuid
- b: 8b c8 mov ecx,eax
- d: c1 f9 08 sar ecx,0x8
- 10: 83 e1 0f and ecx,0xf
复制代码
改成了
- 0: eb 30 jmp 0x32
- 2: 33 c9 xor ecx,ecx
- 4: b8 01 00 00 00 mov eax,0x1
- 9: 0f a2 cpuid
- b: 8b c8 mov ecx,eax
- d: c1 f9 08 sar ecx,0x8
- 10: 83 e1 0f and ecx,0xf
复制代码
所以就第一条指令改掉了,相当于文中C/C++代码里的某个cpuid之前的if改成了强制goto(那大概率就是第75行的if了)。0x32大概是跳到当前指令地址+0x32之后的指令?那么就是相当于跳过了cpuid指令的部分,也跳过了上述汇编代码部分,估计就直接84行“return count;”了。jne是在“不等”的情况下跳转;如果“等于”的话,也就是说是strcmp确认是AMD处理器,所以jne指令不起作用,进入上述汇编代码的cpuid测试。
根据维基百科 https://en.wikipedia.org/wiki/CPUID#EAX=1:_Processor_Info_and_Feature_Bits,上述0x2到0x10行汇编也就是取维基百科链接表格中Family ID的部分。
综上我觉得还蛮可信的……这个二进制补丁结果就是,任何处理器一律用逻辑核心数量。至于为什么会有这个源代码这个写法,那么得接着去看git log了……
|