- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现ring0 dll注入(inject)器驱动程序并通过APC注入(inject)来实现。该代码在 win XP 上完美运行。在win7上,它不断使目标进程崩溃。
这是代码:
NTSTATUS InjectDll( IN ULONG ulProcessId, HANDLE hEvent, IN TCHAR * pszDllPath )
{
NTSTATUS ntStatus;
HANDLE hProcess = NULL;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
PKEVENT pevtWait;
PKPROCESS pPcb = NULL;
PVOID pArg = NULL;
ULONG ulSize = 0;
KAPC_STATE ApcState;
PKAPC pApc;
PVOID pTcb;
PVOID pfnLoadLibrary;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
LARGE_INTEGER nTimeout;
nTimeout.QuadPart = (LONGLONG) -300000000;
do
{
InitializeObjectAttributes(
&ObjectAttributes,
NULL,
0,
NULL,
NULL)
ClientId.UniqueProcess = (HANDLE)ulProcessId;
ClientId.UniqueThread = 0;
ntStatus = ZwOpenProcess(
&hProcess,
PROCESS_ALL_ACCESS,
&ObjectAttributes,
&ClientId
);
if ( NT_ERROR(ntStatus) )
{
DbgPrint("Open process %d failed - error 0x%X\r\n", ulProcessId, ntStatus);
break;
}
ulSize = MAX_FILENAME_LEN * sizeof(WCHAR);
ntStatus = ZwAllocateVirtualMemory(
hProcess,
&pArg,
0,
&ulSize,
MEM_RESERVE|MEM_COMMIT,
PAGE_READWRITE);
if ( NT_ERROR(ntStatus) )
{
DbgPrint("ZwAllocateVirtualMemory failed - error 0x%X\r\n", ntStatus);
// thus, make it leak in target process space!
break;
}
ntStatus = ObReferenceObjectByHandle(
hProcess,
PROCESS_ALL_ACCESS,
0,//should be PsProcessType,
PreviousMode,
(PVOID*)&pPcb,
NULL);
if ( NT_ERROR(ntStatus) )
{
DbgPrint("ObReferenceObjectByHandle 0x%X failed - error 0x%X\r\n", hProcess, ntStatus);
break;
}
//enter target process space
KeStackAttachProcess(pPcb,&ApcState);
pfnLoadLibrary = GetLoadLibraryAddress(pPcb);
if (!pfnLoadLibrary)
{
DbgPrint("Failed to get address of LoadLibrary\r\n");
// leave target process space
KeUnstackDetachProcess(&ApcState);
break;
}
else
{
DbgPrint("Get address of LoadLibrary : 0x%X\r\n", pfnLoadLibrary);
}
RtlCopyMemory( pArg, pszDllPath, MAX_FILENAME_LEN * sizeof(TCHAR));
// leave target process space
KeUnstackDetachProcess(&ApcState);
// get target thread
pTcb = GetThreadByProcess(pPcb);
if (!pTcb)
{
DbgPrint("Get thread failed!\r\n");
ntStatus = STATUS_UNSUCCESSFUL;
break;
}
// start inject
pApc = (PKAPC)ExAllocatePoolWithTag(NonPagedPool,sizeof(KAPC),POOL_TAG);
if (!pApc)
{
DbgPrint("Failed to allocate memory for the APC structure\r\n");
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
break;
}
KeInitializeApc(
pApc,
(PETHREAD)pTcb,
OriginalApcEnvironment,
&ApcKernelRoutine,
NULL,
(PKNORMAL_ROUTINE)pfnLoadLibrary,
UserMode,
pArg);
if (!KeInsertQueueApc(pApc,NULL,NULL,0))
{
DbgPrint("Failed to insert APC\r\n");
ntStatus = STATUS_UNSUCCESSFUL;
ExFreePool(pApc);
break;
}
} while (0);
if ( pPcb )
{
ObDereferenceObject(pPcb);
}
if ( hProcess)
{
ZwClose(hProcess);
}
DbgPrint("InjectDll end - status = 0x%X\r\n", ntStatus);
return ntStatus;
}
injectDll 由 DeviceIoControl 服务例程调用。
DRIVER_DISPATCH InjectorDeviceControl;
NTSTATUS NTAPI InjectorDeviceControl(
IN PDEVICE_OBJECT pDeviceObject,
PIRP pIrp)
{
PIO_STACK_LOCATION pStack;
PINJECT_DLL_PARAM pParam;
NTSTATUS ntStatus;
DbgPrint("call InjectorDeviceControl...\r\n");
/* Get the stack location and parameters */
pStack = IoGetCurrentIrpStackLocation(pIrp);
pParam = (PINJECT_DLL_PARAM)pIrp->AssociatedIrp.SystemBuffer;
if (pStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_INJECTDLL)
{
/* Unsupported command */
ntStatus = STATUS_NOT_IMPLEMENTED;
}
else
{
/* Validate the input buffer length */
if (pStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(INJECT_DLL_PARAM))
{
/* Invalid buffer */
ntStatus = STATUS_INVALID_PARAMETER;
}
else
{
/* Inject dll */
ntStatus = InjectDll(pParam->ulProcessId, pParam->hEvent, pParam->DllName);
}
}
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return ntStatus;
}
这是目标进程的崩溃堆栈跟踪。
FAULTING_IP:
ntdll!RtlActivateActivationContextUnsafeFast+9c
7770f59a 8933 mov dword ptr [ebx],esi
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7770f59a (ntdll!RtlActivateActivationContextUnsafeFast+0x0000009c)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000001
Parameter[1]: 00000000
Attempt to write to address 00000000
DEFAULT_BUCKET_ID: NULL_POINTER_WRITE
PROCESS_NAME: QQProtect.exe
ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx
EXCEPTION_PARAMETER1: 00000001
EXCEPTION_PARAMETER2: 00000000
WRITE_ADDRESS: 00000000
FOLLOWUP_IP:
ntdll!RtlActivateActivationContextUnsafeFast+9c
7770f59a 8933 mov dword ptr [ebx],esi
NTGLOBALFLAG: 0
FAULTING_THREAD: 00000300
PRIMARY_PROBLEM_CLASS: NULL_POINTER_WRITE
BUGCHECK_STR: APPLICATION_FAULT_NULL_POINTER_WRITE
LAST_CONTROL_TRANSFER: from 77740baa to 7770f59a
STACK_TEXT:
021df8a0 77740baa 75655a2c 00000000 02790000 ntdll!RtlActivateActivationContextUnsafeFast+0x9c
021df91c 77740461 002b5cd0 021dfab8 756559bc ntdll!LdrpProcessStaticImports+0x1b8
021dfa8c 7774232c 021dfaec 021dfab8 00000000 ntdll!LdrpLoadDll+0x314
021dfac0 759088ee 0026f074 021dfb00 021dfaec ntdll!LdrLoadDll+0x92
021dfaf8 75dc3c12 00000000 00000000 00000001 KERNELBASE!LoadLibraryExW+0x15a
021dfb0c 77726f7d 02790000 00000000 00000000 kernel32!LoadLibraryW+0x11
021dff88 75dc3c45 00000000 021dffd4 777437f5 ntdll!KiUserApcDispatcher+0x25
021dff94 777437f5 00295fe8 75655ce4 00000000 kernel32!BaseThreadInitThunk+0xe
021dffd4 777437c8 7770fd0f 00295fe8 00000000 ntdll!__RtlUserThreadStart+0x70
021dffec 00000000 7770fd0f 00295fe8 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: ~1s; .ecxr ; kb
SYMBOL_STACK_INDEX: 0
SYMBOL_NAME: ntdll!RtlActivateActivationContextUnsafeFast+9c
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: ntdll
IMAGE_NAME: ntdll.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 4ce7b96e
FAILURE_BUCKET_ID: NULL_POINTER_WRITE_c0000005_ntdll.dll!RtlActivateActivationContextUnsafeFast
BUCKET_ID: APPLICATION_FAULT_NULL_POINTER_WRITE_ntdll!RtlActivateActivationContextUnsafeFast+9c
WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/QQProtect_exe/3_0_1_3629/50a06369/ntdll_dll/6_1_7601_17514/4ce7b96e/c0000005/0002f59a.htm?Retriage=1
Followup: MachineOwner
有什么想法吗?
最佳答案
我一直在研究 apc
的一些 dll-injetion
并遇到了完全相同的问题。
经过一些逆向工程后,我找到了发生这种情况的原因。
这是由于当前线程的 TEB
没有 ActivationContextStackPointer
成员导致的:
ntdll!_TEB
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : (null)
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle : (null)
+0x02c ThreadLocalStoragePointer : (null)
+0x030 ProcessEnvironmentBlock : 0x7ffd8000 _PEB
+0x034 LastErrorValue : 0
+0x038 CountOfOwnedCriticalSections : 0
+0x03c CsrClientThread : (null)
+0x040 Win32ThreadInfo : (null)
+0x044 User32Reserved : [26] 0
+0x0ac UserReserved : [5] 0
+0x0c0 WOW32Reserved : (null)
+0x0c4 CurrentLocale : 0x804
+0x0c8 FpSoftwareStatusRegister : 0
+0x0cc SystemReserved1 : [54] (null)
+0x1a4 ExceptionCode : 0n0
+0x1a8 ActivationContextStackPointer : (null) <---it's null
RtlActivateActivationContextUnsafeFast
函数尝试在 ActivationContext
列表中插入一个节点,但 ActivationContextStackPointer
为 null
,因此会引发 ACCESS_VIOLATION
。
mov dword ptr [ebx],esi //ebx = teb->ActivationContextStackPointer which is 000000000 esi = node
ActivationContext
与 DLL
的 list 有点相关。
您可以在 Microsoft help 中获取更多相关信息。 .
使用 list 文件加载 dll
时,会调用 RtlActivateActivationContextUnsafeFast
。
在这种情况下,我通过禁用 dll
list 文件的生成解决了该问题:
linker - > (
/MANIFEST:NO
)
或者你可以尝试通过让目标线程调用ActivateActCtx
函数来强制系统为目标线程分配一个ActivationContextStack
(我不确定是否可以)可能吗?)。
希望这对您有帮助。
关于crash - win7上ring0 APC DLL注入(inject)崩溃目标进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440192/
我是 Arduino 世界的新手。编写了以下代码 - 使用 DHT22 传感器。 12 小时后,当温度低于所需温度时,我的温室的加热器没有打开。 关闭电源并重新打开后,一切恢复正常。我知道这段代码很乱
我正在使用 CENTOS6 和 REDHAWK2.0 (RH2.0)。基于“VirtualBox 5.0.16 for Windows host”和“VirtualBox 5.0.17 r106140
在无渲染模式下使用 VMR-9 时如何解决 SelectAtPosition() 崩溃? 最佳答案 使用无渲染模式时的 SelectAtPosition() 崩溃问题可以通过在自定义分配器中实现 IV
这是我从 logcat 复制的错误。我不知道为什么在应用设置屏幕中清除数据后应用程序崩溃。 02-20 17:22:29.980 839-1094/? I/InputReader: Apps
我收到了来自 Apple 的应用提交反馈: Thank you for your resubmission. We were unable to review your app as it crash
我有一个 iPad 应用程序。使用 Fabric 收集崩溃信息。最近出现了一些像 webthread EXC_BREAKPOINT 这样的崩溃。跟踪堆栈上没有我的代码。所以我不知道为什么会发生崩溃。
我有一个在 ubuntu(EC2 实例,t2.small)上运行的简单 python web-scraper,到目前为止它只打印出一个 url 列表: from bs4 import Beautifu
注意:我的问题之前已关闭,我尝试了此处提到的解决方案 - unknown error: session deleted because of page crash from unknown error
我正在尝试从一个场景过渡到另一个场景,但是当我调用 presentScene 时发生崩溃!场景未存储在类中或被引用,它们直接加载到 presentScene 调用中。 Xcode 崩溃截图: 我的简单
我有点困惑,我的应用程序几乎没有崩溃,崩溃日志也有以下信息。 崩溃:com.twitter.crashlytics.ios.exception 这是否意味着它是 Fabric 库的崩溃还是有效的崩溃?
我尝试在我的 ubuntu 16.04 远程服务器上使用 selenium webdriver 和 python 3.5.2 连接到网页 from pyvirtualdisplay import Di
我正在使用使用 Python 和 Selenium 的 InstaPy。我按 Cron 启动脚本,有时它会崩溃。所以它真的很不规则,有时它会很好地贯穿始终。我也已经在 GitHub Repo 上发帖,
最近我换了电脑,从那以后我无法使用 selenium 启动 chrome。我也尝试过 Firefox,但浏览器实例无法启动。 from selenium import webdriver d = we
我正在使用 InstaPy,它使用 Python 和 Selenium。我按照 Cron 启动脚本,但有时它会崩溃。所以它确实不规则,有时它贯穿得很好。我已经在 GitHub Repo 上发布了,但没
我正在使用 InstaPy,它使用 Python 和 Selenium。我按照 Cron 启动脚本,但有时它会崩溃。所以它确实不规则,有时它贯穿得很好。我已经在 GitHub Repo 上发布了,但没
我正在使用使用 Python 和 Selenium 的 InstaPy。我按 Cron 启动脚本,有时它会崩溃。所以它真的很不规则,有时它会很好地贯穿始终。我也已经在 GitHub Repo 上发帖,
我正在尝试使用rook在kubernetes集群上配置ceph,我已经运行了以下命令: kubectl apply -f common.yaml kubectl apply -f operator.y
我有一个屏幕A,在执行了一些POST API任务后,我启用了一个按钮,然后单击按钮导航到屏幕B。当Reaction Native应用程序冻结并崩溃时,崩溃会随机发生。从其他屏幕导航到屏幕B也不是问题,
我想知道操作系统是否可能导致崩溃,例如我是否有代码,它是否有可能在Windows环境下崩溃而在Linux上却没有崩溃?还是这不可能? 最佳答案 最简单的示例是代码,您的意图是使其与平台兼容,但是您的代
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!