调试之前使用windbg打开notepad观察
00007ffd`23ae0670 cc int 3
0:000> u ntdll!LdrInitializeThunk
ntdll!LdrInitializeThunk:
00007ffd`23a84b10 4053 push rbx
00007ffd`23a84b12 4883ec20 sub rsp,20h
00007ffd`23a84b16 488bd9 mov rbx,rcx
00007ffd`23a84b19 e81a000000 call ntdll!LdrInitializeThunk+0x28 (00007ffd`23a84b38)
00007ffd`23a84b1e b201 mov dl,1
00007ffd`23a84b20 488bcb mov rcx,rbx
00007ffd`23a84b23 e8488a0200 call ntdll!NtContinue (00007ffd`23aad570)
00007ffd`23a84b28 8bc8 mov ecx,eax
为了调试目标进程,可以有多种方法:
1.将windbug放入沙箱,然后再通过windbg启动notepad,为了观察注入的初始化过程,启动后将Loadmodule勾选上
为了方便调试lowlevel,编译的时候打开这一项:
这样在编译目录下可以看到代码和二进制的对应关系文件init.cod和inject.cod
2.使用glfags设置目标进程notepad.exe的调试程序为windbg,将txt放入沙箱,启动,观察
0:000> u ntdll!LdrInitializeThunk
ntdll!LdrInitializeThunk:
00007ffd`23a84b10 b8c00bbc00 mov eax,0BC0BC0h
00007ffd`23a84b15 ffe0 jmp rax
00007ffd`23a84b17 8bd9 mov ebx,ecx
00007ffd`23a84b19 e81a000000 call ntdll!LdrInitializeThunk+0x28 (00007ffd`23a84b38)
00007ffd`23a84b1e b201 mov dl,1
00007ffd`23a84b20 488bcb mov rcx,rbx
00007ffd`23a84b23 e8488a0200 call ntdll!NtContinue (00007ffd`23aad570)
00007ffd`23a84b28 8bc8 mov ecx,eax
其中
0BC0BC0是跳转的地址。
u 0BC0BC0
0:000> u 0BC0BC0
00000000`00bc0bc0 4883ec28 sub rsp,28h
00000000`00bc0bc4 48894c2420 mov qword ptr [rsp+20h],rcx
00000000`00bc0bc9 4889542428 mov qword ptr [rsp+28h],rdx
00000000`00bc0bce 4c89442430 mov qword ptr [rsp+30h],r8
00000000`00bc0bd3 4c894c2438 mov qword ptr [rsp+38h],r9
00000000`00bc0bd8 e800000000 call 00000000`00bc0bdd 这个地方是EntrypointC
00000000`00bc0bdd 59 pop rcx
00000000`00bc0bde 488bd9 mov rbx,rcx
按照该位置加载LowLevel地址,dll长度0x2000,如下加载符号表
.reload lowlevel=00BC0BC0,2000
加载完毕,查找lowlevel所有的符号:
00000000`00bc0bde 488bd9 mov rbx,rcx
0:000> x lowlevel!*
00000000&