搜索PspTerminateThreadByPointer地址,用得是sysnap的方法,程序有点小瑕疵,使用用了很多硬编码.在winxp sp测试成功. 


代码:
/*
  MyKiller.C
  Author: <Dayed>
  Last Updated: 2007-07-06

  This framework is generated by EasySYS 0.3.0 Modify
  This template file is copying from QuickSYS 0.3.0 written by Chunhua Liu
  //=============================================
  Modified by PLK_XiaoWei[0GiNr]
  http://www.0GiNr.com
  //=============================================
*/
#include "ntddk.h"
#include <windef.h>
#include <stdlib.h>
#include "MyKiller.h"    
#include "dbghelp.h"
#include "dayed.h"
#include "hookiat.h"

//===========================================
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString);
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
VOID DriverUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);

typedef NTSTATUS (*PSPTERMINATETHREADBYPOINTER)( PETHREAD, NTSTATUS);
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId (IN ULONG ProcessId,OUT PEPROCESS *Process);
//==========================================




PEPROCESS  eProcess;
ULONG      processID;
PSPTERMINATETHREADBYPOINTER MyPspTerminateThreadByPointer ;



//==========================================
PVOID GetUndocumentFunctionAdress()
{
  ULONG size,index;
  PULONG buf;
  ULONG i;
  PSYSTEM_MODULE_INFORMATION module;
  PVOID driverAddress=0;
  ULONG ntosknlBase;
  ULONG ntosknlEndAddr;
  ULONG curAddr;
  NTSTATUS status;
  PVOID retAddr;
  ULONG code1_sp2=0x8b55ff8b,code2_sp2=0x0cec83ec,code3_sp2=0xfff84d83,code4_sp2=0x7d8b5756;
  
  ZwQuerySystemInformation(SystemModuleInformation,&size, 0, &size);
  if(NULL==(buf = (PULONG)ExAllocatePool(PagedPool, size)))
  {
    DbgPrint("failed alloc memory failed \n");
    return 0;
  }
  status=ZwQuerySystemInformation(SystemModuleInformation,buf, size , 0);
  if(!NT_SUCCESS( status ))
  {
    DbgPrint("failed query\n");
    return 0;
  }
  module = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
  ntosknlEndAddr=(ULONG)module->Base+(ULONG)module->Size;
  ntosknlBase=(ULONG)module->Base;
  curAddr=ntosknlBase;
  ExFreePool(buf);
  for (i=curAddr;i<=ntosknlEndAddr;i++)
  {
    if ((*((ULONG *)i)==code1_sp2)&&(*((ULONG *)(i+4))==code2_sp2)&&(*((ULONG *)(i+8))==code3_sp2)&&(*((ULONG*)(i+12))==code4_sp2)) 
    {
      retAddr=(PVOID*)i;
      DbgPrint("MyPspTerminateThreadByPointer  adress is:%x\n",retAddr); 
      return retAddr;
    }
  }
  DbgPrint("Can't Find MyPspTerminateThreadByPointer  Address:%x\n"); 
  return 0;
}






//载自ReactOS-0.3.4-REL-src
PETHREAD
NTAPI
GetNextProcessThread(IN PEPROCESS Process,
           IN PETHREAD Thread OPTIONAL)
{
    PETHREAD FoundThread = NULL;
    PLIST_ENTRY ListHead, Entry;
    PAGED_CODE();
    
    if (Thread)
    {
    //  Entry = Thread->ThreadListEntry.Flink;;//   +0x22c ThreadListEntry  : _LIST_ENTRY
    Entry = (PLIST_ENTRY)((ULONG)(Thread)+0x22c);
    Entry=Entry->Flink;
    }
    else
    {
        Entry = (PLIST_ENTRY)((ULONG)(Process)+0x190);//+0x190 ThreadListHead   : _LIST_ENTRY
        Entry = Entry->Flink; 
    }
  // ListHead = &Process->ThreadListHead;
  ListHead = (PLIST_ENTRY)((ULONG)Process + 0x190);
    while (ListHead != Entry)
    {
    //   FoundThread = CONTAINING_RECORD(Entry, ETHREAD, ThreadListEntry);
    FoundThread = (PETHREAD)((ULONG)Entry - 0x22c);
    //    if (ObReferenceObjectSafe(FoundThread)) break;
    if (ObReferenceObject(FoundThread)) break;
        FoundThread = NULL;
        Entry = Entry->Flink;
    }
    if (Thread) ObDereferenceObject(Thread);
    return FoundThread;
}






NTSTATUS TerminateProcess( PEPROCESS Process )
{
  NTSTATUS          Status;
  PETHREAD          Thread;
  
  Status = STATUS_SUCCESS;
  __try
  {
    for (Thread = GetNextProcessThread( Process, NULL );
    Thread != NULL;
    Thread = GetNextProcessThread( Process, Thread ))
    {
      Status = STATUS_SUCCESS;
      Status = (*MyPspTerminateThreadByPointer)( Thread, 0);
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    Status = GetExceptionCode();
  }
  return Status;
}


//==========================================


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
  NTSTATUS status = STATUS_SUCCESS;
  UNICODE_STRING ustrLinkName;
  UNICODE_STRING ustrDevName;    
  PDEVICE_OBJECT pDevObj;
  
  dprintf("[MyKiller] DriverEntry: %S\n",pRegistryString->Buffer);

    // Create dispatch points for device control, create, close.
  pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
  pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
  pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  pDriverObj->DriverUnload = DriverUnload;
  //

  RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
  
  status = IoCreateDevice(pDriverObj, 
        0,
        &ustrDevName, 
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &pDevObj);

  dprintf("[MyKiller] Device Name %S",ustrDevName.Buffer);

  if(!NT_SUCCESS(status))
  {
    dprintf("[MyKiller] IoCreateDevice = 0x%x\n", status);
    return status;
  }

  
  RtlInitUnicodeString(&ustrLinkName, LINK_NAME);

  status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
  if(!NT_SUCCESS(status))
  {
    dprintf("[MyKiller] IoCreateSymbolicLink = 0x%x\n", status);
    IoDeleteDevice(pDevObj);  
    return status;
  }
  
  dprintf("[MyKiller] SymbolicLink:%S",ustrLinkName.Buffer);

  //获取PspTerminateThreadByPointer地址
  MyPspTerminateThreadByPointer  =GetUndocumentFunctionAdress();

  return STATUS_SUCCESS;
}









VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{  
  UNICODE_STRING strLink;
  RtlInitUnicodeString(&strLink, LINK_NAME);
  //
    // Delete the symbolic link
    //
  IoDeleteSymbolicLink(&strLink);
  //
    // Delete the device object
    //
  IoDeleteDevice(pDriverObj->DeviceObject);
  dprintf("[MyKiller] Unloaded\n");
}









NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
  pIrp->IoStatus.Status = STATUS_SUCCESS;
  pIrp->IoStatus.Information = 0;
  dprintf("[MyKiller] IRP_MJ_CREATE\n");
  IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  return STATUS_SUCCESS;
}








NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
  pIrp->IoStatus.Status = STATUS_SUCCESS;
  pIrp->IoStatus.Information = 0;
  dprintf("[MyKiller] IRP_MJ_CLOSE\n");
  IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  return STATUS_SUCCESS;
}








NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
  NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
  PIO_STACK_LOCATION pIrpStack;
  ULONG uIoControlCode;
  PVOID pIoBuffer;
  ULONG uInSize;
  ULONG uOutSize;

  pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
  uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
  uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
  uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

  switch(uIoControlCode)
  {
  case IOCTL_Killer:
    {
      dprintf("Call IOCTL_Killer");

      __try
      {
        memcpy(&processID,pIoBuffer,sizeof(processID));
        status=PsLookupProcessByProcessId(processID,&eProcess);
        if(NT_SUCCESS(status))
        {
          ObDereferenceObject(eProcess);
        }
        status=TerminateProcess(eProcess);
        if(NT_SUCCESS(status))
        {
          dprintf("TerminateProcess Ok!\n");
        }
      }
      __except(EXCEPTION_EXECUTE_HANDLER)
      {
        ;
      }
      
    //  status = STATUS_SUCCESS;
        break;
    }
  }

  if(status == STATUS_SUCCESS)
    pIrp->IoStatus.Information = uOutSize;
  else
    pIrp->IoStatus.Information = 0;

  pIrp->IoStatus.Status = status;
  IoCompleteRequest(pIrp, IO_NO_INCREMENT);

  return status;
}

我也参考了很多人的思路,再次感谢,希望能对其他人有所帮助
上传的附件 KillEXE-ByPspTerminateThreadByPointer.rar [解压密码:pediy]