飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8548|回复: 8

[驱动源码] 驱动DLL注入源码

[复制链接]
  • TA的每日心情
    慵懒
    2020-9-27 20:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2012-4-6 17:52:02 | 显示全部楼层 |阅读模式
    源码发布概况
    编程语言: VC/VC++
    详细描述: VC/VC++ 驱动DLL注入源码
    网址: http://bbs.chinapyg.com
    本帖最后由 爱民 于 2012-4-7 11:29 编辑

    您可以在此找到代码。注:你需要编写NtProcDrv NTDDK被安装在您的计算机上。运行编译样品,地方tunew20。在任意的文件夹,dll的时候,在路径被指定变量(窗口/ system32的例子)。然后就跑HookDemo.exe。 开始后,所有进程创建程序被截取。按“输入”键和钩将被卸掉。注:你应该有一个管理员权限的合理运行的应用程序。
    如果它很管用来验证后尝试启动任何应用HookDemo已经跑了。你应该看看消息框”开始之前的过程。“在启动过程和“在结束。“权利之前的过程将会结束。
    1. #include <ntddk.h>
    2. #include "Undocumented.h"
    3. #include "NTProcDrv.h"
    4. #include "DrvUtils.h"



    5. PDEVICE_OBJECT g_pDeviceObject = NULL;

    6. //
    7. // The main entry point of the driver module
    8. //
    9. NTSTATUS __stdcall DriverEntry(
    10.         IN PDRIVER_OBJECT DriverObject,
    11.         IN PUNICODE_STRING RegistryPath
    12.         )
    13. {
    14.     NTSTATUS        ntStatus;
    15.     UNICODE_STRING  uszDriverString;
    16.     UNICODE_STRING  uszDeviceString;

    17.     PDEVICE_OBJECT    pDeviceObject;
    18.     PDEVICE_EXTENSION extension;
    19.    
    20.         DBGPRINT(("In DriverEntry\n"));
    21.         
    22.         // Point uszDriverString at the driver name
    23.     RtlInitUnicodeString(&uszDriverString, uszDriverName);

    24.     // Create and initialize device object
    25.     ntStatus = IoCreateDevice(
    26.                 DriverObject,
    27.         sizeof(DEVICE_EXTENSION),
    28.         &uszDriverString,
    29.         FILE_DEVICE_UNKNOWN,
    30.         0,
    31.         FALSE,
    32.         &pDeviceObject
    33.                 );
    34.     if(ntStatus != STATUS_SUCCESS)
    35.         return ntStatus;
    36.    
    37.         // Assign extension variable
    38.     extension = pDeviceObject->DeviceExtension;
    39.         RtlZeroMemory(&extension->AddrInfo,sizeof(CAddrInfo));
    40.    
    41.         // Point uszDeviceString at the device name
    42.     RtlInitUnicodeString(&uszDeviceString, uszDeviceName);
    43.    
    44.         // Create symbolic link to the user-visible name
    45.     ntStatus = IoCreateSymbolicLink(&uszDeviceString, &uszDriverString);

    46.     if(ntStatus != STATUS_SUCCESS)
    47.     {
    48.         // Delete device object if not successful
    49.         IoDeleteDevice(pDeviceObject);
    50.         return ntStatus;
    51.     }

    52.     // Assign global pointer to the device object for use by the callback functions
    53.     g_pDeviceObject = pDeviceObject;

    54.     // Load structure to point to IRP handlers
    55.     DriverObject->DriverUnload                         = UnloadDriver;
    56.     DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreateClose;
    57.     DriverObject->MajorFunction[IRP_MJ_CLOSE]          = DispatchCreateClose;
    58.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;


    59.         if (InitializeMemoryPool()==STATUS_SUCCESS)
    60.         {
    61.                 DBGPRINT(("Memory for Pool successfully initialized\n"));
    62.         }
    63.         else
    64.         {
    65.                 DBGPRINT(("Memory Pool Initialization failed\n"));
    66.         }

    67.     // Return success
    68.     return ntStatus;
    69. }

    70. //
    71. // Create and close routine
    72. //
    73. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    74. {
    75.     Irp->iOStatus.Status = STATUS_SUCCESS;
    76.     Irp->IoStatus.Information=0;

    77.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    78.     return STATUS_SUCCESS;
    79. }


    80. NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    81. {
    82.     NTSTATUS              ntStatus = STATUS_UNSUCCESSFUL;
    83.     PIO_STACK_LOCATION    irpStack  = IoGetCurrentIrpStackLocation(Irp);
    84.     PDEVICE_EXTENSION     extension = DeviceObject->DeviceExtension;
    85.     PAddrInfo        pAddrInfo;
    86.         
    87.         //
    88.     // These IOCTL handlers get the current data out of the device
    89.     // extension structure.  
    90.         //
    91.     switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
    92.     {
    93.         case IOCTL_NTPROCDRV_SET_ADDRNFO:
    94.                         if (irpStack->Parameters.DeviceIoControl.InputBufferLength>= sizeof(CAddrInfo))
    95.                         {
    96.                                 DBGPRINT(("receiving IOCTL_NTPROCDRV_SET_ADDRNFO ok!\n"));

    97.                                 pAddrInfo = Irp->AssociatedIrp.SystemBuffer;

    98.                                 if (pAddrInfo->isInitialized)
    99.                                 {

    100.                                         extension->AddrInfo.SSTIndexNtCreateProcess = pAddrInfo->SSTIndexNtCreateProcess;
    101.                                         extension->AddrInfo.SSTIndexNtCreateThread = pAddrInfo->SSTIndexNtCreateThread;
    102.                                         extension->AddrInfo.SSTIndexNtTerminateProcess = pAddrInfo->SSTIndexNtTerminateProcess;
    103.                                         extension->AddrInfo.pfnLoadLibrary = pAddrInfo->pfnLoadLibrary;
    104.                                         extension->AddrInfo.SSTIndexNtCreateProcessEx = pAddrInfo->SSTIndexNtCreateProcessEx;
    105.                                         extension->AddrInfo.isInitialized = TRUE;

    106.                                         DBGPRINT(("Trying to hook srvices\n"));
    107.                                         HookServices(&extension->AddrInfo, extension->isHookedState);
    108.                                         extension->isHookedState = TRUE;
    109.                                 }
    110.                                 else
    111.                                 {
    112.                                         DBGPRINT(("Trying to unhook srvices\n"));
    113.                                         UnHookServices(&extension->AddrInfo,extension->isHookedState);
    114.                                         extension->isHookedState = FALSE;
    115.                                         RtlZeroMemory(&extension->AddrInfo,sizeof(CAddrInfo));
    116.                                 }

    117.                                 ntStatus = STATUS_SUCCESS;

    118.                         }
    119.             break;
    120.         default:
    121.             break;
    122.     }

    123.     Irp->IoStatus.Status = ntStatus;
    124.    
    125.     Irp->IoStatus.Information = 0;

    126.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    127.     return ntStatus;
    128. }


    129. //
    130. // Driver unload routine
    131. //
    132. void UnloadDriver(IN PDRIVER_OBJECT DriverObject)
    133. {
    134.     UNICODE_STRING  uszDeviceString;
    135.         PDEVICE_EXTENSION extension = DriverObject->DeviceObject->DeviceExtension;

    136.         UnHookServices(&extension->AddrInfo,extension->isHookedState);

    137.         UnitializeMemoryPool();


    138.     IoDeleteDevice(DriverObject->DeviceObject);

    139.     RtlInitUnicodeString(&uszDeviceString, uszDeviceName);
    140.     IoDeleteSymbolicLink(&uszDeviceString);
    141. }


    142. NTSTATUS NewNtCreateProcess(
    143.     OUT PHANDLE ProcessHandle,
    144.     IN ACCESS_MASK DesiredAccess,
    145.     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    146.     IN HANDLE ParentProcess,
    147.     IN BOOLEAN InheritObjectTable,
    148.     IN HANDLE SectionHandle OPTIONAL,
    149.     IN HANDLE DebugPort OPTIONAL,
    150.     IN HANDLE ExceptionPort OPTIONAL
    151.     )
    152. {
    153.         NTSTATUS ResultStatus;

    154.         DBGPRINT(("In NtCreateProcess\n"));

    155.         
    156.         ResultStatus = OldNtCreateProcess(
    157.             ProcessHandle,
    158.             DesiredAccess,
    159.                 ObjectAttributes,
    160.                 ParentProcess,
    161.                 InheritObjectTable,
    162.                 SectionHandle,
    163.                 DebugPort ,
    164.                 ExceptionPort);

    165.         

    166.         if (ResultStatus==STATUS_SUCCESS)
    167.         {

    168.                 DBGPRINT(("Kernel successfully create NtCreateProcess.\n----->ProcessHandle = 0x%x\n",*ProcessHandle));
    169.             
    170.                 if (SetNewProcessInfo(*ProcessHandle)==STATUS_SUCCESS)
    171.                 {
    172.                         DBGPRINT(("Successfully added process handle to Queue\n"));
    173.                 }
    174.                 else
    175.                 {
    176.                         DBGPRINT(("Unable to add process handle to Queue\n"));
    177.                 }
    178.         }

    179.         return ResultStatus;

    180. }

    181. NTSTATUS NewNtCreateProcessEx(
    182.     OUT PHANDLE ProcessHandle,
    183.     IN ACCESS_MASK DesiredAccess,
    184.     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    185.     IN HANDLE ParentProcess,
    186.     IN BOOLEAN InheritObjectTable,
    187.     IN HANDLE SectionHandle OPTIONAL,
    188.     IN HANDLE DebugPort OPTIONAL,
    189.     IN HANDLE ExceptionPort OPTIONAL,
    190.     IN HANDLE Unknown )
    191. {
    192.         NTSTATUS ResultStatus;

    193.         DBGPRINT(("In NtCreateProcessEx\n"));
    194.         
    195.         ResultStatus = OldNtCreateProcessEx(
    196.             ProcessHandle,
    197.             DesiredAccess,
    198.                 ObjectAttributes,
    199.                 ParentProcess,
    200.                 InheritObjectTable,
    201.                 SectionHandle,
    202.                 DebugPort ,
    203.                 ExceptionPort,
    204.                 Unknown);

    205.         

    206.         if (ResultStatus==STATUS_SUCCESS)
    207.         {

    208.                 DBGPRINT(("Kernel successfully create NtCreateProcessEx.\n----->ProcessHandle = 0x%x\n",*ProcessHandle));
    209.             
    210.                 if (SetNewProcessInfo(*ProcessHandle)==STATUS_SUCCESS)
    211.                 {
    212.                         DBGPRINT(("Successfully added process handle to Queue\n"));
    213.                 }
    214.                 else
    215.                 {
    216.                         DBGPRINT(("Unable to add process handle to Queue\n"));
    217.                 }
    218.         }

    219.         return ResultStatus;
    220. }


    221. NTSTATUS NewNtCreateThread(
    222.     OUT PHANDLE ThreadHandle,
    223.     IN ACCESS_MASK DesiredAccess,
    224.     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    225.     IN HANDLE ProcessHandle,
    226.     OUT PCLIENT_ID ClientId,
    227.     IN PCONTEXT ThreadContext,
    228.     IN PINITIAL_TEB InitialTeb,
    229.     IN BOOLEAN CreateSuspended)
    230. {
    231.         NTSTATUS ResultStatus;

    232. #pragma message("must verify user mode parameters before using")

    233.         if (
    234.                 ThreadContext &&
    235.                 CreateSuspended &&
    236.                 ProcessHandle &&
    237.                 ProcessHandle!=(void *)0xffffffff &&
    238.                 FindLockProcessInQueue(ProcessHandle)
    239.                 )
    240.         {

    241.                 //kernel creates thread
    242.                 //trying to get PEPROCESS

    243.                 NTSTATUS ObjectStatus;
    244.                 PEPROCESS pProcess;
    245.                 POBJECT_TYPE PsProcessType;

    246.                 DBGPRINT(("Kernel trying to CreateThread(from User Mode) for ProcessHandle = 0x%X\n",ProcessHandle));

    247.                 PsProcessType = NULL;
    248.                 ObjectStatus = ObReferenceObjectByHandle(
    249.                         ProcessHandle,
    250.                         PROCESS_ALL_ACCESS,
    251.                         PsProcessType,
    252.                         UserMode,
    253.                         (PVOID *)&pProcess,
    254.                         NULL);
    255.                 if (ObjectStatus!=STATUS_SUCCESS)
    256.                 {
    257.                         DBGPRINT(("Fail to RefernceObject. Stopping Injecting Technique.\n"));
    258.                 }
    259.                 else
    260.                 {
    261.                         NTSTATUS AllocStatus;
    262.                         UCHAR * BaseAddr;
    263.                         SIZE_T RegionSize;
    264.                         ULONG Win32StartAddr;
    265.                         ULONG LoadLibraryAddr;

    266.                         RegionSize = 100;
    267.                         BaseAddr = NULL;
    268.                         PsProcessType = NULL;

    269.                         LoadLibraryAddr = (ULONG)((PDEVICE_EXTENSION)g_pDeviceObject->DeviceExtension)->AddrInfo.pfnLoadLibrary;
    270.                         DBGPRINT(("Address of LoadLibraryW = 0x%08X\n",LoadLibraryAddr));


    271.                         if (ThreadContext)
    272.                         {
    273.                                 //remembering value of ThreadContext->Eax
    274.                                 //it contains process staring address in user mode

    275.                                 Win32StartAddr = ThreadContext->Eax;
    276.                                 
    277.                                 if (!Win32StartAddr)
    278.                                 {
    279.                                         DBGPRINT(("--------------Win32StartAddr not set--------------------\n"));
    280.                                 }
    281.                                 else
    282.                                 {

    283.                                         //"jumping" to context of new process
    284.                                         KeDetachProcess();
    285.                                         KeAttachProcess((void *)pProcess);

    286.                                         //allocating memory with PAGE_EXECUTE_READWRITE access rights

    287.                                         AllocStatus = ZwAllocateVirtualMemory(
    288.                                                 NtCurrentProcess(),
    289.                                                 &BaseAddr,
    290.                                                 0,
    291.                                                 &RegionSize,
    292.                                                 MEM_COMMIT        ,
    293.                                                 PAGE_EXECUTE_READWRITE);
    294.                                         if (AllocStatus!=STATUS_SUCCESS)
    295.                                         {
    296.                                                 DBGPRINT(("---------------Fail to Allocate memory! AllocStatus = 0x%x\n",AllocStatus));
    297.                                         }
    298.                                         else
    299.                                         {
    300.                                                 ULONG Offset = 0;
    301.                                                 ULONG OffsetStrAddr = 0;

    302.                                                 DBGPRINT(("---------------Memory allocation OK! BaseAddr = 0x%x\n",BaseAddr));

    303.                                                 BaseAddr[Offset] = 0x68; //push
    304.                                                 ++Offset;
    305.                                                 OffsetStrAddr = Offset;
    306.                                                 Offset += 4; //reserving 4 byte for string address. will be filled late

    307.                                                 BaseAddr[Offset] = 0xbb; //mov ebx,LoadLibraryAddr
    308.                                                 ++Offset;

    309.                                                 *(ULONG *)(BaseAddr+Offset) = LoadLibraryAddr;
    310.                                                 Offset += 4;

    311.                                                 BaseAddr[Offset] = 0xff; //call ebx
    312.                                                 ++Offset;
    313.                                                 BaseAddr[Offset] = 0xd3;
    314.                                                 ++Offset;

    315.                                                 BaseAddr[Offset] = 0xb8;                                                 //mov eax,Win32StartAddr
    316.                                                 ++Offset;
    317.                                                 *(ULONG *)(BaseAddr+Offset) = Win32StartAddr;
    318.                                                 Offset += 4;

    319.                                                 BaseAddr[Offset] = 0x50; //push eax
    320.                                                 ++Offset;

    321.                                                 BaseAddr[Offset] = 0xc3; //ret
    322.                                                 ++Offset;

    323.                                                 *(ULONG *)(BaseAddr+OffsetStrAddr) = (ULONG)(BaseAddr + Offset); // parameter for LoadLibraryW

    324.                                                 //forming string with DLL name - tunew20.dll

    325.                                                 BaseAddr[Offset] = 't';
    326.                                                 ++Offset;
    327.                                                 BaseAddr[Offset] = 0x0;
    328.                                                 ++Offset;
    329.                                                 BaseAddr[Offset] = 'u';
    330.                                                 ++Offset;
    331.                                                 BaseAddr[Offset] = 0x0;
    332.                                                 ++Offset;
    333.                                                 BaseAddr[Offset] = 'n';
    334.                                                 ++Offset;
    335.                                                 BaseAddr[Offset] = 0x0;
    336.                                                 ++Offset;
    337.                                                 BaseAddr[Offset] = 'e';
    338.                                                 ++Offset;
    339.                                                 BaseAddr[Offset] = 0x0;
    340.                                                 ++Offset;
    341.                                                 BaseAddr[Offset] = 'w';
    342.                                                 ++Offset;
    343.                                                 BaseAddr[Offset] = 0x0;
    344.                                                 ++Offset;
    345.                                                 BaseAddr[Offset] = '2';
    346.                                                 ++Offset;
    347.                                                 BaseAddr[Offset] = 0x0;
    348.                                                 ++Offset;
    349.                                                 BaseAddr[Offset] = '0';
    350.                                                 ++Offset;
    351.                                                 BaseAddr[Offset] = 0x0;
    352.                                                 ++Offset;
    353.                                                 BaseAddr[Offset] = '.';
    354.                                                 ++Offset;
    355.                                                 BaseAddr[Offset] = 0x0;
    356.                                                 ++Offset;
    357.                                                 BaseAddr[Offset] = 'd';
    358.                                                 ++Offset;
    359.                                                 BaseAddr[Offset] = 0x0;
    360.                                                 ++Offset;
    361.                                                 BaseAddr[Offset] = 'l';
    362.                                                 ++Offset;
    363.                                                 BaseAddr[Offset] = 0x0;
    364.                                                 ++Offset;
    365.                                                 BaseAddr[Offset] = 'l';
    366.                                                 ++Offset;
    367.                                                 BaseAddr[Offset] = 0x0;
    368.                                                 ++Offset;
    369.                                                 BaseAddr[Offset] = 0x0;
    370.                                                 ++Offset;
    371.                                                 BaseAddr[Offset] = 0x0;
    372.                                                 ++Offset;


    373.                                                 DBGPRINT(("---------------Old EAX Value = 0x%08x\n",Win32StartAddr));
    374.                                                 Win32StartAddr = (ULONG)BaseAddr;
    375.                                                 


    376.                                         }
    377.                                         //"jumping" back to previos contex.

    378.                                         KeDetachProcess();

    379.                                         //setting process start address to allocated memory
    380.                                         ThreadContext->Eax = Win32StartAddr;
    381.                                 }
    382.                         
    383.                         }

    384.                         ObDereferenceObject(pProcess);
    385.                         
    386.                 }

    387.                 UnlockProcessQueue();

    388.                 RemoveProcessFromQueue(ProcessHandle);
    389.         
    390.         }

    391.         ResultStatus = OldNtCreateThread(
    392.                 ThreadHandle,
    393.                 DesiredAccess,
    394.                 ObjectAttributes,
    395.                 ProcessHandle,
    396.                 ClientId,
    397.                 ThreadContext,
    398.                 InitialTeb,
    399.                 CreateSuspended);

    400.         if (ResultStatus == STATUS_SUCCESS && CreateSuspended)
    401.         {
    402.                 DBGPRINT(("Kernel sucessfully create new thread.\n----->ThreadHandle = 0x%xh for ProcessHandle = 0x%x\n",*ThreadHandle,ProcessHandle));
    403.         }

    404.         return ResultStatus;
    405. }



    406. NTSTATUS NewNtTerminateProcess(
    407.     IN HANDLE ProcessHandle OPTIONAL,
    408.     IN NTSTATUS ExitStatus)
    409. {
    410.         NTSTATUS ResultStatus;

    411. #pragma message("must verify user mode parameters before use")
    412.         
    413.         DBGPRINT(("Called NtTerminateProcess\n"));

    414.         if(ProcessHandle && ProcessHandle!=(void *)0xffffffff)
    415.         {
    416.                 RemoveProcessFromQueue(ProcessHandle);
    417.         }

    418.         ResultStatus = OldNtTerminateProcess(ProcessHandle,ExitStatus);
    419.         if (ResultStatus == STATUS_SUCCESS)
    420.         {
    421.                 DBGPRINT(("Kernel sucessfully terminate Process.\n----->ProcessHandle = 0x%xh\n",ProcessHandle));
    422.         }


    423.         return ResultStatus;
    424. }


    425. NTSTATUS HookServices(PAddrInfo        pAddrInfo, BOOLEAN isHookedState)
    426. {

    427.         if (pAddrInfo && pAddrInfo->isInitialized)
    428.         {
    429.                 BOOLEAN isNeedHookEx = FALSE;
    430.                 if (pAddrInfo->SSTIndexNtCreateProcessEx)
    431.                 {
    432.                         isNeedHookEx = TRUE;
    433.                 }

    434.                 DBGPRINT(("Setting hook on SSTIndexNtCreateProcess = 0x%08X\n",pAddrInfo->SSTIndexNtCreateProcess));
    435.                 DBGPRINT(("Setting hook on SSTIndexNtCreateThread = 0x%08X\n",pAddrInfo->SSTIndexNtCreateThread));
    436.                 DBGPRINT(("Setting hook on SSTIndexNtTerminateProcess = 0x%08X\n",pAddrInfo->SSTIndexNtTerminateProcess));
    437.                 DBGPRINT(("Setting hook on pfnLoadLibrary = 0x%08X\n",pAddrInfo->pfnLoadLibrary));
    438.                 if (isNeedHookEx)
    439.                         DBGPRINT(("Setting hook on SSTIndexNtCreateProcessEx = 0x%08X\n",pAddrInfo->SSTIndexNtCreateProcessEx));

    440.         
    441.                 OldNtCreateProcess = (NTCREATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcess]);
    442.                 OldNtCreateThread = (NTCREATETHREAD)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateThread]);
    443.                 OldNtTerminateProcess = (NTTERMINATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtTerminateProcess]);
    444.                 if (isNeedHookEx)
    445.                         OldNtCreateProcessEx = (NTCREATEPROCESSEX)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcessEx]);

    446.                 _asm cli

    447.                 (NTCREATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcess]) = NewNtCreateProcess;
    448.                 (NTCREATETHREAD)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateThread]) = NewNtCreateThread;
    449.                 (NTTERMINATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtTerminateProcess]) = NewNtTerminateProcess;

    450.                 if (isNeedHookEx)
    451.                         (NTCREATEPROCESSEX)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcessEx]) = NewNtCreateProcessEx;

    452.                 _asm sti
    453.         }

    454.         return STATUS_SUCCESS;

    455. }

    456. void UnHookServices(PAddrInfo pAddrInfo, BOOLEAN isHookedState)
    457. {

    458.         if (pAddrInfo && pAddrInfo->isInitialized && isHookedState)
    459.         {
    460.                 DBGPRINT(("Unhook service functions\n"));
    461.                 DBGPRINT(("SSTIndexNtCreateProcess = 0x%08X\n",pAddrInfo->SSTIndexNtCreateProcess));
    462.                 DBGPRINT(("SSTIndexNtCreateThread = 0x%08X\n",pAddrInfo->SSTIndexNtCreateThread));
    463.                 DBGPRINT(("SSTIndexNtTerminateProcess = 0x%08X\n",pAddrInfo->SSTIndexNtTerminateProcess));
    464.                 DBGPRINT(("pfnLoadLibrary = 0x%08X\n",pAddrInfo->pfnLoadLibrary));

    465.                 _asm cli

    466.                 (NTCREATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcess])=OldNtCreateProcess;
    467.                 (NTCREATETHREAD)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateThread])=OldNtCreateThread;
    468.                 (NTTERMINATEPROCESS)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtTerminateProcess])=OldNtTerminateProcess;
    469.                 if (pAddrInfo->SSTIndexNtCreateProcessEx)
    470.                         (NTCREATEPROCESSEX)(KeServiceDescriptorTable[0].Base[pAddrInfo->SSTIndexNtCreateProcessEx])=OldNtCreateProcessEx;

    471.                 _asm sti
    472.         }

    473.         return;

    474. }
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2012-4-6 18:16:31 | 显示全部楼层
    这个中文翻译有点蛋疼。。。。
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2020-9-27 20:02
  • 签到天数: 7 天

    [LV.3]偶尔看看II

     楼主| 发表于 2012-4-6 20:29:19 | 显示全部楼层
    英文...翻译是这样
    表达不出很好的内涵
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-7-17 08:58
  • 签到天数: 178 天

    [LV.7]常住居民III

    发表于 2012-4-9 17:51:44 | 显示全部楼层
    翻译的有点看不懂。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-12-28 17:58
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2012-4-21 09:50:56 | 显示全部楼层
    确实很蛋疼……何止是蛋疼,简直就是蛋疼……我是小白,完全看不懂……
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2025-1-1 12:45
  • 签到天数: 1591 天

    [LV.Master]伴坛终老

    发表于 2012-4-25 10:55:08 | 显示全部楼层
    驱动 不是初学者的菜
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-6-20 18:31
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    发表于 2012-4-27 19:11:18 | 显示全部楼层
    明显是翻译的,貌似还是用工具翻译的,不太顺溜...
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2018-7-10 14:33
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-5-31 07:09:26 | 显示全部楼层
    不知道它是如何注入dll的?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2017-1-25 16:58:33 | 显示全部楼层
    看一下学习学习
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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