我正在修补位于 VS2019 16.2.3 链接器 "C:\Program Files (x86(\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\bin\Hostx86\x86\link.exe",以便像往常一样使用 WinDbg:10.0.17763.132 X86 摆脱富签名。
首先找到唯一的调用链接!图片::CbBuildProdid块内部链接!图片::构建图片:
ModLoad: 00130000 00297000 link.exe
0:000> # call*link!IMAGE::CbBuildProdidBlock link!IMAGE::BuildImage
link!IMAGE::BuildImage+0xeac:
00176e28 e896830000 call link!IMAGE::CbBuildProdidBlock (0017f1c3)
然后:
0:000> u 00176e28
link!IMAGE::BuildImage+0xeac:
00176e28 e896830000 call link!IMAGE::CbBuildProdidBlock (0017f1c3)
00176e2d 8b8f90020000 mov ecx,dword ptr [edi+290h]
00176e33 8b1518d42500 mov edx,dword ptr [link!CbHdr (0025d418)]
00176e39 03c8 add ecx,eax
00176e3b 898528faffff mov dword ptr [ebp-5D8h],eax
00176e41 8d8500faffff lea eax,[ebp-600h]
00176e47 898f94020000 mov dword ptr [edi+294h],ecx
00176e4d 8bcf mov ecx,edi
因此,将add ecx,eax
更改为nop
nop
就可以了。
不小心我发现上面的行add ecx,eax
是
00176e33 8b1518d42500 mov edx,dword ptr [link!CbHdr (0025d418)]
其文件偏移量为 00176e33 - 00130000 - (1000 - 400( = 46233。
但是,在记事本++ + HexEditor和VSCode + hexdump中,它显示8B 15 18 D45200而不是8B 15 18 D42500
00046230: 02 00 00 8B 15 18 D4 52 00 03 C8 89 85 28 FA FF
我尝试将文件复制到其他任何地方,或多次启动 WinDbg 以确保不是由数据错误引起的,结果仍然相同。
为什么 WinDbg 在 00176e33 处显示"8b1518d42500"而不是"8B 15 18 D45200",我是否必须彻底了解英特尔 X86 操作码和指令参考才能解决此问题?
windbg
是否显示应用了运行时重定位修正后的反汇编? 它是 32 位代码,因此不能使用 RIP 相对寻址。
这可以解释指令中绝对地址的一些高位与磁盘上的文件不同。
0x25
字节是该mov edx, [disp32]
指令中[link!CbHdr (0025d418)]
寻址模式的小端 disp32 编码的第二高字节。