看流星社区

 找回密码
 注册账号
查看: 4556|回复: 0

VC6.0实现DLL劫持式注入.LPK劫持源码

[复制链接]

该用户从未签到

发表于 2013-4-30 08:52:17 | 显示全部楼层 |阅读模式
驱动保护War3.exe防止被任务管理器结束进程
举一反三后,其实可以实现很多类似游戏的xxx驱动保护。当然也可以反掉 xxx驱动保护。

相对来说 在驱动编程中这个是一个最精简的源码了,很多复杂的驱动钩子都是通过这个慢慢修改出来的。
用WINDDK黑色控制台编译通过,同样适合 VC6.0、VS2005 、VS2008等开发工具编译。
不过要用VC6.0等编译的话,需要设置下VC6.0,有点小麻烦。
#include <ntddk.h>
typedef struct _SystemServiceDescriptorTable
{
    PVOID    ServiceTableBase; //SSDT表的基地址
    PULONG    ServiceCounterTableBase; //指向另一个索引表,该表包含了每个服务表项被调用的次数
    ULONG    NumberOfService; //当前系统所支持的服务个数
    ULONG    ParamTableBase; //包含了每个服务所需的参数字节数
}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;
extern PSystemServiceDescriptorTable KeServiceDescriptorTable; //导出函数,DDK的头文件中并未声明

typedef NTSTATUS  (*NTTERNIMATEPROCESS)( IN HANDLE  ProcessHandle,
  IN NTSTATUS  ExitStatus );  //定义一个函数指针
NTTERNIMATEPROCESS pRealNtTerminateAddr;

ULONG RealServiceAddress;  //接受被hook的函数地址
CHAR *TerminateName = "War3.exe";  //这里就是我们的记事本进程名

UCHAR* PsGetProcessImageFileName( IN PEPROCESS Process );  

BOOLEAN IsProtect(CHAR *temp)  //判断正在结束的进程是否是我们要保护的记事本进程
{
  ULONG len = strcmp(TerminateName, temp);
  if(!len)
    return TRUE;
  return FALSE;
}

NTSTATUS MyNtTerminateProcess(IN HANDLE  ProcessHandle, IN NTSTATUS  ExitStatus)//我们自己的NtTerminateProcess
{
  PEPROCESS process;  //接受通过ProcessHandle返回的进程
  NTSTATUS status;  
  CHAR *pName;  //接受进程的进程名

  status = ObReferenceObjectByHandle(ProcessHandle,
    FILE_READ_DATA,
    0,
    KernelMode,
    &process,
    NULL);  //获取进程

  if(!NT_SUCCESS(status))  
    return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);

  pName = (CHAR*)PsGetProcessImageFileName(process);  //获取进程名

  if(IsProtect(pName))  //判断是否是我们要保护的进程,是则返回权限不足,否则调用原函数结束进程
    return STATUS_ACCESS_DENIED;

  return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);

}

NTSTATUS Hook()
{
  ULONG Address;

  Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4;//0x101可以用windbg获得,或者查询debugman论坛里面SSDT表
  RealServiceAddress = *(ULONG*)Address;  
  pRealNtTerminateAddr = (NTTERNIMATEPROCESS)RealServiceAddress;

  //开启SSDT 表为可写
  _asm
  {
    cli;
    mov  eax, cr0;
    and eax, not 10000h;
    mov  cr0, eax;
  }

  *((ULONG*)Address) = (ULONG)MyNtTerminateProcess;  //替换为我们自己的NtTerminateProcess函数
  //设置SSDT表位只读
  _asm
  {
    mov  eax, cr0;
    or  eax, 10000h;
    mov  cr0, eax;
    sti;  
  }

}
VOID UnHook()//把SSDT中的NtTerminateprocess函数还原
{
  ULONG Address;

  Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4;


  __asm
     {
       cli
       mov    eax, cr0;
       and    eax, not 10000h ;
       mov    cr0, eax ;
     }

     *((ULONG*)Address) = (ULONG)RealServiceAddress;

  __asm
     {
       mov    eax, cr0 ;
       or   eax, 10000h ;
       mov    cr0, eax ;
       sti ;
     }
}


VOID Unload(PDRIVER_OBJECT driver)
{
  UNREFERENCED_PARAMETER(driver);
  UnHook();
  DbgPrint(("EXIT..."));

}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING str)
{
  NTSTATUS status;
  UNREFERENCED_PARAMETER(str);
  driver->DriverUnload = Unload;
  status = Hook();
  return STATUS_SUCCESS;
}

http://pan.baidu.com/share/link?shareid=511868&uk=3895950538
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-4 11:49

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表