这几天研究着x64内核APC注入,网上有代码,但都是X86系统的。
x64的没有,有的要么是注入没有反应,要么崩溃的。
论坛里面的那代码我也下载了,x64不行(有人成功,但我的不行,同样的代码难道是我系统有问题?偏移我也矫正了,提高权限也不行)
所以我干脆自己从新写了一套x64内核APC注入代码,不过程序崩溃一直都是0xC0000005。
一定有人说,要地址 not address << 2 啊,那是x64注入32程序的,我直接注入x64一样崩溃,亲自逆向了NtQueueAPCThreadEx,照着做一样崩溃,我了个去,我都想骂人了。
当然,我注入的是ShellCode,注意到崩溃的都是ShellCode的代码段。
崩溃的Shellcode:
BYTE APCShellMxbCode[] = {
0x51, 0x52, 0x41, 0x50, 0x41, 0x51, //push r8 ,push r9 ,push rdx push rcx
0x45, 0x33, 0xC9,
0x45, 0x33, 0xC0,
0x33, 0xD2,
0x33, 0xC9,
0x48, 0xC7, 0xC0, 0xB8, 0x12, 0x54, 0X77,
//这里是mov rax,xxxxxx (MessageBoxA的地址)
0XFF, 0XD0,
//call rax
0x41, 0x59, 0x41, 0x58, 0x5A, 0x59,//pop rcx,pop rdx pop r9 ,pop r8
0xC3};
成功的
Shellcode:
BYTE APCShellMxbCode[] = {
0x51, 0x52, 0x41, 0x50, 0x41, 0x51, 0x50,
// push rax push r8 ,push r9 ,push rdx push rcx
0x45, 0x33, 0xC9,
0x45, 0x33, 0xC0,
0x33, 0xD2,
0x33, 0xC9,
0x48, 0xC7, 0xC0, 0xB8, 0x12, 0x54, 0X77, //这里是mov rax,xxxxxx (MessageBoxA的地址)
0XFF, 0XD0,//call rax
0x58, 0x41, 0x59, 0x41, 0x58, 0x5A, 0x59,
//pop rax, pop rcx,pop rdx pop r9 ,pop r8
0xC3};
C语言代码: MessageBox(null,null,null,mb_ok)
哦,原来你使用了什么寄存器的值,就要保存起来,不然会崩溃,就连 rax 都不能放过。
难道要求怎么严格?
但又说回来,既然APC注入怎么严格,但为什么x86就不要怎么严格?
;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-8-11 15:46
被cheating编辑
,原因: