-
-
[旧帖] [求助]怎么实现自定义的 NtOpenProcess 里面的CALL 指令 0.00雪花
-
发表于: 2011-2-28 21:00 985
-
我目的是绕过NtOpenProcess 的inline hook
NtOpenProcess hook前:
nt!NtOpenProcess:
805cc440 68c4000000 push 0C4h
805cc445 68c0b44d80 push offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e89107f7ff call nt!wctomb+0x45 (8053cbe0)
805cc44f 33f6 xor esi,esi
NtOpenProcess hook后:
nt!NtOpenProcess:
805cc440 68c4000000 push 0C4h
805cc445 68c0b44d80 push offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e8a13dbf2f call b01c01f0
805cc44f 33f6 xor esi,esi
我的解决方案是自己定义一个函数实现NtOpenProcess 的前15个字节, 即前3条指令,先改写原NtOpenProcess 的前5个字节,跳到自定义的MyNtOpenProcess,然后MyNtOpenProcess实现
前3条指令,然后跳回原NtOpenProcess 的第4条指令(xor esi,esi)那里继续执行
现在的问题是call 指令怎么在自己的MyNtOpenProcess 里实现`现在只会用硬编码实现`求个兼容性好的方法`
关键代码如下:
ULONG GetNtOpenProcessAddress(); //声明GetNtOpenProcessAddress
static ULONG NtOpenProcessAddress=GetNtOpenProcessAddress();
UCHAR Save12Byte[12];
//Save12Byte 是用来保存原NtOpenProcess 前3条指令的2个参数(0C4h和804db4c0)和CALL指令的目地址( 8053cbe0h )
ULONG GetNtOpenProcessAddress()
{
ULONG NtOpenProcessAddress;
UNICODE_STRING NtOpenProcessName;
RtlInitUnicodeString(&NtOpenProcessName,L"NtOpenProcess");
NtOpenProcessAddress=(ULONG)MmGetSystemRoutineAddress(&NtOpenProcessName);
return NtOpenProcessAddress;
}
__declspec(naked) VOID MyNtOpenProcess()
{
_asm
{
lea ebx,Save12Byte //指向Save12Byte
mov eax,[ebx] //取得Save12Byte 前4个字节:c4 00 00 00
push eax //push 000000c4h
mov eax,[ebx+4] //取得Save12Byte 第5到8个字节:c0 b4 4d 80
push eax //push 804db4c0h
mov eax,0x8053cbe0
call eax //call 8053cbe0h
mov eax,NtOpenProcessAddress //原NtOpenProcess函数头地址
add eax,0xF //NtOpenProcessAddress + 0xF 即eax指向xor esi,esi 的地址:805cc44fh
jmp eax //跳到 805cc44fh
}
}
NtOpenProcess hook前:
nt!NtOpenProcess:
805cc440 68c4000000 push 0C4h
805cc445 68c0b44d80 push offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e89107f7ff call nt!wctomb+0x45 (8053cbe0)
805cc44f 33f6 xor esi,esi
NtOpenProcess hook后:
nt!NtOpenProcess:
805cc440 68c4000000 push 0C4h
805cc445 68c0b44d80 push offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e8a13dbf2f call b01c01f0
805cc44f 33f6 xor esi,esi
我的解决方案是自己定义一个函数实现NtOpenProcess 的前15个字节, 即前3条指令,先改写原NtOpenProcess 的前5个字节,跳到自定义的MyNtOpenProcess,然后MyNtOpenProcess实现
前3条指令,然后跳回原NtOpenProcess 的第4条指令(xor esi,esi)那里继续执行
现在的问题是call 指令怎么在自己的MyNtOpenProcess 里实现`现在只会用硬编码实现`求个兼容性好的方法`
关键代码如下:
ULONG GetNtOpenProcessAddress(); //声明GetNtOpenProcessAddress
static ULONG NtOpenProcessAddress=GetNtOpenProcessAddress();
UCHAR Save12Byte[12];
//Save12Byte 是用来保存原NtOpenProcess 前3条指令的2个参数(0C4h和804db4c0)和CALL指令的目地址( 8053cbe0h )
ULONG GetNtOpenProcessAddress()
{
ULONG NtOpenProcessAddress;
UNICODE_STRING NtOpenProcessName;
RtlInitUnicodeString(&NtOpenProcessName,L"NtOpenProcess");
NtOpenProcessAddress=(ULONG)MmGetSystemRoutineAddress(&NtOpenProcessName);
return NtOpenProcessAddress;
}
__declspec(naked) VOID MyNtOpenProcess()
{
_asm
{
lea ebx,Save12Byte //指向Save12Byte
mov eax,[ebx] //取得Save12Byte 前4个字节:c4 00 00 00
push eax //push 000000c4h
mov eax,[ebx+4] //取得Save12Byte 第5到8个字节:c0 b4 4d 80
push eax //push 804db4c0h
mov eax,0x8053cbe0
call eax //call 8053cbe0h
mov eax,NtOpenProcessAddress //原NtOpenProcess函数头地址
add eax,0xF //NtOpenProcessAddress + 0xF 即eax指向xor esi,esi 的地址:805cc44fh
jmp eax //跳到 805cc44fh
}
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: