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不用考虑的问题,害我研究了一整天。

标签: none

添加新评论