x64编译器下HOOK时OutputDebugString崩溃原因
x64 inlinehook调用OutputDebugString一直崩溃, x64dbg跟踪发现崩溃在:
<ntdll.RtlCaptureContext>
| 48:9C | pushfq
| 8C49 38 | mov word ptr ds:[rcx+38],cs
| 8C59 3A | mov word ptr ds:[rcx+3A],ds
| 8C41 3C | mov word ptr ds:[rcx+3C],es
| 8C51 42 | mov word ptr ds:[rcx+42],ss
| 8C61 3E | mov word ptr ds:[rcx+3E],fs
| 8C69 40 | mov word ptr ds:[rcx+40],gs
| 48:8941 78 | mov qword ptr ds:[rcx+78],rax
| 48:8989 80000000 | mov qword ptr ds:[rcx+80],rcx
| 48:8991 88000000 | mov qword ptr ds:[rcx+88],rdx
| 48:8999 90000000 | mov qword ptr ds:[rcx+90],rbx
| 48:8D4424 10 | lea rax,qword ptr ss:[rsp+10]
| 48:8981 98000000 | mov qword ptr ds:[rcx+98],rax
| 48:89A9 A0000000 | mov qword ptr ds:[rcx+A0],rbp
| 48:89B1 A8000000 | mov qword ptr ds:[rcx+A8],rsi
| 48:89B9 B0000000 | mov qword ptr ds:[rcx+B0],rdi
| 4C:8981 B8000000 | mov qword ptr ds:[rcx+B8],r8
| 4C:8989 C0000000 | mov qword ptr ds:[rcx+C0],r9
| 4C:8991 C8000000 | mov qword ptr ds:[rcx+C8],r10
| 4C:8999 D0000000 | mov qword ptr ds:[rcx+D0],r11
| 4C:89A1 D8000000 | mov qword ptr ds:[rcx+D8],r12
| 4C:89A9 E0000000 | mov qword ptr ds:[rcx+E0],r13
| 4C:89B1 E8000000 | mov qword ptr ds:[rcx+E8],r14
| 4C:89B9 F0000000 | mov qword ptr ds:[rcx+F0],r15
| 0FAE81 00010000 | fxsave ds:[rcx+100] <<崩溃行
查资料得:
对xmm操作是需要16byte对齐, 当rcx没有16对齐时就会报错,也就是 fxsave操作地址必须16位对齐,而rcx是通过sub rsp得到,所以调用OutputDebugString时,RSP必须为0x10的倍数地址。
所以通过自己sub rsp 8x(可为8倍数), 再调用OutputDebugString,结尾add rsp 8x调整堆栈平衡解决。
头大,x64存在一些x86不用考虑的问题,害我研究了一整天。