能力值:
( LV13,RANK:400 )
|
-
-
2 楼
NTSTATUS __declspec(naked) NewNtOpenProcess_stub(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
_asm
{
mov edi, edi
push ebp
mov ebp, esp
mov eax, RealNtOpenProcess
add eax, 5
jmp eax
}
}
NTSTATUS NewNtDeviceIoControlFile(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
if(ClientId != NULL)
{
HANDLE pid = ClientId->UniqueProcess;
KdPrint(("pid : %d\n", pid));
if(g_TargetPid == pid) //找到被保护的进程PID
{
// 输出进程名,这里硬编码的话兼容性很差的,换个系统可能就挂了
PEPROCESS EP = PsGetCurrentProcess();
KdPrint(("ACESS Process Name : %s\n",(PTSTR)((ULONG)EP+0x174)));
// 处理返回值
// 你的主要错误就在这里吧,传入的是应用层的Handle的地址,要赋值的话需要解引用
*ProcessHandle = NULL;
NTSTATUS status = STATUS_ACCESS_DENIED; //拒绝访问
return status;
}
}
return NewNtOpenProcess_stub(
ProcessHandle,
DesiredAccess,
ObjectAttributes,
ClientId);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢,解决了
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢已解决,我是照的那个人的教程做的,为什么他的代码就没事呢
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
那个人的原代码是这样的,但是可以照常实现
// 自定义的NtOpenProcess函数 ZwOpenProcess
#pragma PAGECODE
extern "C" NTSTATUS __declspec(naked) __stdcall MyNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId )
{
NTSTATUS rc;
HANDLE PID;
//KdPrint(("++++++++++++Entry MyNtOpenProcess int ++++++++++++++\n"));
//rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );
if( (ClientId != NULL) )
{
PID = ClientId->UniqueProcess;
KdPrint(( "------------------------- PID=%d--------------\n",(int*)PID ));
// 如果是被保护的PID,则拒绝访问,并将句柄设置为空
if(PID == MyPID)
{
KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
//调试输出 类似C语言的 Printf
ProcessHandle = NULL; //这个是关键
rc = STATUS_ACCESS_DENIED; //这个返回值
//PsLookupProcessByProcessId((ULONG)PID,&EP);
EP=PsGetCurrentProcess();
KdPrint((" ACESS Process Name --:%s-- \n",(PTSTR)((ULONG)EP+0x174)));
__asm
{
retn 0x10
}
}
}
__asm
{ int 3
push 0C4h
mov eax,RealNtOpenProcess //
add eax,5
jmp eax
}
//return rc;
}
|
能力值:
( LV13,RANK:260 )
|
-
-
6 楼
ClientId 这是一个指针... 一定要判断 mmUserAddressRegion ,probeForRead等.....大哥....小心蓝.....
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
什么情况
???
|
能力值:
( LV13,RANK:260 )
|
-
-
8 楼
.text:B1AB4ADF loc_B1AB4ADF: ; CODE XREF: sub_B1AB4A8C+3Dj
.text:B1AB4ADF push 4
.text:B1AB4AE1 pop edi
.text:B1AB4AE2 push edi ; Alignment
.text:B1AB4AE3 push edi ; Length
.text:B1AB4AE4 push eax ; Address
.text:B1AB4AE5 call ds:ProbeForWrite
.text:B1AB4AEB mov ecx, ds:MmUserProbeAddress
.text:B1AB4AF1 mov eax, [ebp+Address]
.text:B1AB4AF4 cmp eax, [ecx]
.text:B1AB4AF6 jnb short near ptr byte_B1AB4ACB
.text:B1AB4AF8 push edi ; Alignment
.text:B1AB4AF9 push 18h ; Length
.text:B1AB4AFB push eax ; Address
.text:B1AB4AFC mov esi, ds:ProbeForRead
.text:B1AB4B02 call esi ; ProbeForRead
.text:B1AB4B04 mov eax, [ebp+arg_C]
.text:B1AB4B07 test eax, eax
.text:B1AB4B09 jnz short loc_B1AB4B2B
.text:B1AB4B0B mov [ebp+ms_exc.disabled], 0FFFFFFFEh
某驱动 ,看看就知道鸟.... hook 得稳定哈
|
能力值:
( LV13,RANK:400 )
|
-
-
9 楼
擦 不好意思啊。。贴错一个函数名。。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
不就个名字,把跳转单独写在一个函数,有什么好
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
看LZ是2007年注册的。。。
这已经是驱动保护的入门级别了啊
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
就是刚开始学驱动,只是注册的早
|
能力值:
( LV9,RANK:380 )
|
-
-
13 楼
extern "C" NTSTATUS __declspec(naked) _stdcall NewNtOpenProcess(
PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId)
{
奇葩的函数声明。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
extern "C" 声明为C函数
__declspec(naked) 生成纯汇编
_stdcall 调用自身平衡栈
,
不知道有什么新见解?
|
能力值:
( LV4,RANK:40 )
|
-
-
15 楼
个人有地方不懂,如果是开头就跳的话,那么返回指针有无修改应该都一样,因为根本没去执行真的NTOP
测试结果成功保护了进程,奇怪的是
_asm
{
popad
mov esp,ebp
pop ebp
mov eax,result //这行要放在leave之上,不然返回值会变成其他的,显示"句柄无效"
retn 0x10 //这里执行完后,该进程还是可以被正常打开,郁闷!!!
}
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
好贴必定必定必定
|
|
|