ok100fen 发表于 2010-10-24 21:14:39

TA,想要保护进程,只这样行不行?

#include <ntddk.h>
#include "ntimage.h"
#include <windef.h>
#include "LDasm.h"
typedef NTSTATUS (*OBOPENOBJECTBYPOINTER)
(
IN PVOID   Object,
IN ULONG   HandleAttributes,
IN PACCESS_STATE PassedAccessStateOPTIONAL,
IN ACCESS_MASK   DesiredAccessOPTIONAL,
IN POBJECT_TYPE   ObjectTypeOPTIONAL,
IN KPROCESSOR_MODEAccessMode,
OUT PHANDLE    Handle
);
PEPROCESS MyProcess=(PEPROCESS)0x80fefa98;//我们要保护的进程对象 自行修改
OBOPENOBJECTBYPOINTER pObOpenObjectByPointer=NULL;
PVOID pNtOpenProcess=NULL;
ULONG GetFuncAddr(PWCHARfuncname)
{
UNICODE_STRINGuniFuncName;
RtlInitUnicodeString(&uniFuncName,funcname);
return (ULONG)MmGetSystemRoutineAddress(&uniFuncName);
}

void MemOpen()
{
__asm {   
cli
   moveax,cr0
   andeax,not 10000h
   movcr0,eax
}
}
void MemClose()
{
__asm {   
moveax,cr0
   or   eax,10000h
   movcr0,eax
   sti
}
}
// 从StartAddr地址 开始找OldAddr 替换为NewAddr地址 长度是 SIZE
BOOL CallAddrHook(PVOID StartAddr,PVOID OldAddr,PVOID NewAddr,ULONG Size)
{
PUCHAR cPtr, pOpcode;
ULONG Length,Tmp;
for (cPtr=StartAddr;(ULONG)cPtr<(ULONG)StartAddr+Size;cPtr += Length)
{
Length = SizeOfCode(cPtr, &pOpcode);//计算当前指令长度
if (!Length) break;
if (Length ==5 && *cPtr==0xE8)// 当前长度5 且第一字节为E8
{//因为CALL用的是相对偏移所以我们还需要进行计算相对偏移
   if ( (ULONG)OldAddr-(ULONG)cPtr-5 == *(PULONG)(cPtr+1)) //判断当前是否为OldAddr的CALL相对地址
   {
    DbgPrint("ULONG cPtr=%x",(ULONG)cPtr);
    Tmp=(ULONG)NewAddr-(ULONG)cPtr-5;//我们的CALL地址相对偏移
    MemOpen();
    *(PULONG)(cPtr+1)=Tmp;//直接替换为我们的FAKE函数地址   
    MemClose();
    return TRUE;
   }
}
}
return FALSE;
}
//NtOpenProcess
NTSTATUS MyObOpenObjectByPointer_forProcess(IN PVOIDObject,
         IN ULONGHandleAttributes,
         IN PACCESS_STATEPassedAccessStateOPTIONAL,
         IN ACCESS_MASKDesiredAccessOPTIONAL,
         IN POBJECT_TYPEObjectTypeOPTIONAL,
         IN KPROCESSOR_MODEAccessMode,
         OUT PHANDLEHandle)
{
if (Object==MyProcess)
{
return STATUS_ACCESS_DENIED;
}
else
{
return pObOpenObjectByPointer (Object, HandleAttributes,PassedAccessState,DesiredAccess,ObjectType,AccessMode,Handle);
}
}

VOID Unload(IN PDRIVER_OBJECT DriverObject)
{
CallAddrHook(pNtOpenProcess,MyObOpenObjectByPointer_forProcess,pObOpenObjectByPointer,PAGE_SIZE);

}
NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{



//查找地址
    pObOpenObjectByPointer=(OBOPENOBJECTBYPOINTER)GetFuncAddr(L"ObOpenObjectByPointer");//
    DbgPrint("pObOpenObjectByPointer=%x",pObOpenObjectByPointer);
    pNtOpenProcess=(PVOID)GetFuncAddr(L"NtOpenProcess");
                DbgPrint("pNtOpenProcess=%x",pNtOpenProcess);
                CallAddrHook(pNtOpenProcess,pObOpenObjectByPointer,MyObOpenObjectByPointer_forProcess,PAGE_SIZE);
               
   
   
    DriverObject->DriverUnload = Unload;
   
    return STATUS_SUCCESS;
}

ok100fen 发表于 2010-10-24 21:15:24

我看你的代码里,为什么还要加上那个线程函数?

Tesla.Angela 发表于 2010-10-29 10:56:11

如果不加线程函数的话,人家用EnumThread+KillThread就能照样在R3砍掉你的进程。

ok100fen 发表于 2010-10-29 12:39:25

我只是在任务管理器里不能杀死了

现在明白了
页: [1]
查看完整版本: TA,想要保护进程,只这样行不行?