QQ极品飞车9隐藏车辆开G后怎么隐藏进程

在Delphi中隐藏程序进程的方法
在Delphi中隐藏程序进程方法[1]
主要需要解决两个问题,即隐藏窗口和设定热键。
一. 隐藏窗口
通过API函数GETACTIVEWINDOW获取当前窗口;函数ShowWindow(HWND,nCmdShow)的参数nCmdShow取SW_HIDE时将之隐藏,取SW_SHOW时将之显示。例如:showwindow(getactivewindow,sw_hide)。隐藏好窗体后,须记住窗体句柄以便恢复。
二. 键盘监控
为了实现键盘监控须用到钩子。
以下是程序的源文件:
一、创建一个动态链接库
unit HKH //链接库中的Unit文件
&& Windows, Messages,
&& hNextHookHide: HH
&& HideSaveExit: P
&& hbefore:
function KeyboardHookHandler(iCode: IwParam: WPARAM;
&& lParam: LPARAM): LRESULT;
function EnableHideHook: BOOL;
function DisableHideHook: BOOL;
procedure HideHookE
implementation
function KeyboardHookHandler(iCode: IwParam: WPARAM;
&& lParam: LPARAM): LRESULT;
const _KeyPressMask = $;
&& Result := 0;
&& If iCode & 0
Result := CallNextHookEx(hNextHookHide, iCode, wParam,
&& //侦测 Ctrl + Alt + F12
&& if ((lParam and _KeyPressMask)
= 0)&& //按下时生效
(GetKeyState(vk_Control) & 0)
(getkeystate(vk_menu)&0)
&&& and (wParam
= vk_F12) then
Result := 1;
//文件不存在则创建
if not fileexists('c:\test.txt') then
assignfile(f,'c:\test.txt');
&& rewrite(f);
&& writeln(f,0);
&& closefile(f);
assignfile(f,'c:\test.txt');
&& reset(f);
&& readln(f,temp);
&& hbefore:=strtoint(temp);
temp:=inttostr(hbefore);
rewrite(f);
writeln(f,temp);
closefile(f);
ShowWindow(hbefore, SW_HIDE);
//end if FileExists(....)
&& else begin
showwindow(hbefore,SW_SHOW);
rewrite(f);
writeln(f,0);
closefile(f);
&&//end if
Ctrl+Alt+F12按键
function EnableHideHook: BOOL;
&& Result := F
&& if hNextHookHide
&& 0 then E
&& // 挂上 WH_KEYBOARD 这型的 HOOK,
同时, 传回值必须保留下
&& // 来, 免得 HOOK 呼叫链结断掉
&& hNextHookHide :=
SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,HInstance,0);
&& Result := hNextHookHide
function DisableHideHook: BOOL;
&& if hNextHookHide
UnhookWindowshookEx(hNextHookHide); // 解除 Keyboard Hook
hNextHookHide:=0;
procedure HideHookE
&& // 如果忘了解除 HOOK,
自动代理解除的动作
&& if hNextHookHide
&& 0 then DisableHideH
&& ExitProc :=
library HKPH //动态链接库工程文件
&& HKHide in HKHide.
&& EnableHideHook,
&& DisableHideH
&& hNextHookHide := 0;
&& hbefore:=0;
&& HideSaveExit :=
&& ExitProc :=
@HideHookE
//文件制作好后先Build All编译成HKPHide.dll。
二、新建一个测试工程TestPrj
unit Unit1;//这是测试工程的窗体单元
&& Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs, StdC
&& TForm1 = class(TForm)
Button1: TB
Button2: TB
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
&& private
{ Private declarations }
{ Public declarations }
&& Form1: TForm1;
implementation
{$R *.DFM}
function EnableHideHook: BOOL; external 'HKPHide.DLL';
function DisableHideHook: BOOL; external 'HKPHide.DLL';
procedure TForm1.Button1Click(Sender: TObject);
&& if EnableHideHook then
&& ShowMessage('HotKey
Testing...');
procedure TForm1.Button2Click(Sender: TObject);
&& if DisableHideHook then
&& ShowMessage('HotKey
Testing..., DONE!);
DELPHI中隐藏程序进程,纯DELPHI代码方式,我在XP下通过测试。
下面是隐藏进程的unit&& HideProcess
unit HideP
function MyHideProcess: B
implementation
&& Windows, SysUtils, Variants,
Classes, AclAPI, accC
&& NTSTATUS = LongI
&& //NT_SUCCESS(Status)
((NTSTATUS)(Status) &= 0)
&& STATUS_INFO_LENGTH_MISMATCH =
NTSTATUS($C0000004);
&& STATUS_ACCESS_DENIED =
NTSTATUS($C0000022);
&& OBJ_INHERIT = $;
&& OBJ_PERMANENT =
&& OBJ_EXCLUSIVE =
&& OBJ_CASE_INSENSITIVE =
&& OBJ_OPENIF = $;
&& OBJ_OPENLINK =
&& OBJ_KERNEL_HANDLE =
&& OBJ_VALID_ATTRIBUTES =
&& PIO_STATUS_BLOCK =
^IO_STATUS_BLOCK;
&& IO_STATUS_BLOCK = record
Status: NTSTATUS;
FObject: DWORD;
&& PUNICODE_STRING =
^UNICODE_STRING;
&& UNICODE_STRING = record
MaximumLength: W
Buffer: PWideC
&& POBJECT_ATTRIBUTES =
^OBJECT_ATTRIBUTES;
&& OBJECT_ATTRIBUTES =
Length: DWORD;
RootDirectory: P
ObjectName: PUNICODE_STRING;
Attributes: DWORD;
SecurityDescriptor: P
SecurityQualityOfService: P
&& TZwOpenSection =
function(SectionHandle: PH
DesiredAccess: ACCESS_MASK;
ObjectAttributes: POBJECT_ATTRIBUTES): NTSTATUS;
&& TRTLINITUNICODESTRING =
procedure(DestinationString: PUNICODE_STRING;
SourceString: PWideChar);
&& RtlInitUnicodeString:
TRTLINITUNICODESTRING =
&& ZwOpenSection: TZwOpenSection
&& g_hNtDLL: THandle = 0;
&& g_pMapPhysicalMemory: Pointer
&& g_hMPM: THandle = 0;
&& g_hMPM2: THandle = 0;
&& g_osvi: OSVERSIONINFO;
&& b_hide: Boolean =
//---------------------------------------------------------------------------
function InitNTDLL: B
&& g_hNtDLL :=
LoadLibrary('ntdll.dll');
&& if 0 = g_hNtDLL then
&& RtlInitUnicodeString :=
GetProcAddress(g_hNtDLL, 'RtlInitUnicodeString');
&& ZwOpenSection :=
GetProcAddress(g_hNtDLL, 'ZwOpenSection');
&& Result := T
//---------------------------------------------------------------------------
procedure CloseNTDLL;
&& g_hNtDLL) then
FreeLibrary(g_hNtDLL);
&& g_hNtDLL := 0;
//---------------------------------------------------------------------------
procedure SetPhyscialMemorySectionCanBeWrited(hSection:
&& pDacl: PACL;
PPSECURITY_DESCRIPTOR;
&& pNewDacl: PACL;
&& dwRes: DWORD;
&& ea: EXPLICIT_ACCESS;
&& pDacl :=
&& pNewDacl :=
&& dwRes :=
GetSecurityInfo(hSection, SE_KERNEL_OBJECT,
DACL_SECURITY_INFORMATION, nil, nil, pDacl, nil, pSD);
&& if ERROR_SUCCESS
&& dwRes then
if Assigned(pSD) then
&& LocalFree(Hlocal(pSD^));
if Assigned(pNewDacl) then
LocalFree(HLocal(pNewDacl));
&& ZeroMemory(@ea,
sizeof(EXPLICIT_ACCESS));
&& ea.grfAccessPermissions :=
SECTION_MAP_WRITE;
&& ea.grfAccessMode :=
GRANT_ACCESS;
&& ea.grfInheritance :=
NO_INHERITANCE;
&& ea.Trustee.TrusteeForm :=
TRUSTEE_IS_NAME;
&& ea.Trustee.TrusteeType :=
TRUSTEE_IS_USER;
&& ea.Trustee.ptstrName :=
'CURRENT_USER';
&& dwRes := SetEntriesInAcl(1,
@ea, pDacl, pNewDacl);
&& if ERROR_SUCCESS
&& dwRes then
if Assigned(pSD) then
&& LocalFree(Hlocal(pSD^));
if Assigned(pNewDacl) then
LocalFree(HLocal(pNewDacl));
&& dwRes := SetSecurityInfo
&& (hSection, SE_KERNEL_OBJECT,
DACL_SECURITY_INFORMATION, nil, nil, pNewDacl, nil);
&& if ERROR_SUCCESS
&& dwRes then
if Assigned(pSD) then
&& LocalFree(Hlocal(pSD^));
if Assigned(pNewDacl) then
LocalFree(HLocal(pNewDacl));
//---------------------------------------------------------------------------
function OpenPhysicalMemory: TH
&& status: NTSTATUS;
&& physmemString:
UNICODE_STRING;
&& attributes:
OBJECT_ATTRIBUTES;
&& PhyDirectory: DWORD;
&& g_osvi.dwOSVersionInfoSize :=
sizeof(OSVERSIONINFO);
&& GetVersionEx(g_osvi);
&& g_osvi.dwMajorVersion) then
Result := 0;
&& case g_osvi.dwMinorVersion
0: PhyDirectory := $30000;
1: PhyDirectory := $39000;
&& Result := 0;
RtlInitUnicodeString(@physmemString,
'\Device\PhysicalMemory');
&& attributes.Length :=
SizeOf(OBJECT_ATTRIBUTES);
&& attributes.RootDirectory :=
&& attributes.ObjectName :=
&& attributes.Attributes :=
&& attributes.SecurityDescriptor
attributes.SecurityQualityOfService :=
&& status :=
ZwOpenSection(@g_hMPM, SECTION_MAP_READ or SECTION_MAP_WRITE,
@attributes);
&& if (status =
STATUS_ACCESS_DENIED) then
ZwOpenSection(@g_hMPM, READ_CONTROL or WRITE_DAC,
@attributes);
SetPhyscialMemorySectionCanBeWrited(g_hMPM);
CloseHandle(g_hMPM);
status := ZwOpenSection(@g_hMPM, SECTION_MAP_READ or
SECTION_MAP_WRITE, @attributes);
&& if not (LongInt(status)
&= 0) then
Result := 0;
&& g_pMapPhysicalMemory :=
MapViewOfFile(g_hMPM,
FILE_MAP_READ or FILE_MAP_WRITE, 0, PhyDirectory, $1000);
&& if (g_pMapPhysicalMemory =
Result := 0;
&& Result := g_hMPM;
//---------------------------------------------------------------------------
function LinearToPhys(BaseAddress: PULONG; addr: Pointer):
&& VAddr, PGDE, PTE, PAddr, tmp:
&& VAddr := DWORD(addr);
//&& PGDE := BaseAddress[VAddr
&& PGDE :=
PULONG(DWORD(BaseAddress) + (VAddr shr 22) * SizeOf(ULONG))^; //
Modify by dot.
&& if 0 = (PGDE and 1) then
&& tmp := PGDE and
&& tmp) then
PAddr := (PGDE and $FFC00000) + (VAddr and $003FFFFF);
PGDE := DWORD(MapViewOfFile(g_hMPM, 4, 0, PGDE and $FFFFF000,
// PTE := (PDWORD(PGDE))[(VAddr and $003FF000) shr 12];
PTE := PDWORD(PGDE + ((VAddr and $003FF000) shr 12) *
SizeOf(DWord))^; // Modify by dot.
if (0 = (PTE and 1)) then
&& Result :=
PAddr := (PTE and $FFFFF000) + (VAddr and $00000FFF);
UnmapViewOfFile(Pointer(PGDE));
&& Result :=
Pointer(PAddr);
//---------------------------------------------------------------------------
function GetData(addr: Pointer): DWORD;
&& phys, ret: DWORD;
&& tmp: PDWORD;
&& phys :=
ULONG(LinearToPhys(g_pMapPhysicalMemory, Pointer(addr)));
PDWORD(MapViewOfFile(g_hMPM, FILE_MAP_READ or FILE_MAP_WRITE,
phys and $FFFFF000, $1000));
&& if (nil = tmp) then
Result := 0;
//&& ret := tmp[(phys and $FFF)
&& ret := PDWORD(DWORD(tmp) +
((phys and $FFF) shr 2) * SizeOf(DWord))^; // Modify by dot.
&& UnmapViewOfFile(tmp);
&& Result :=
//---------------------------------------------------------------------------
function SetData(addr: P data: DWORD): B
&& phys: DWORD;
&& tmp: PDWORD;
&& phys :=
ULONG(LinearToPhys(g_pMapPhysicalMemory, Pointer(addr)));
PDWORD(MapViewOfFile(g_hMPM, FILE_MAP_WRITE, 0, phys and $FFFFF000,
&& if (nil = tmp) then
//&& tmp[(phys and $FFF) shr 2]
&& PDWORD(DWORD(tmp) + ((phys and
$FFF) shr 2) * SizeOf(DWord))^ := // Modify by dot.
&& UnmapViewOfFile(tmp);
&& Result := TRUE;
//---------------------------------------------------------------------------
{long __stdcall exeception(struct _EXCEPTION_POINTERS *tmp)
ExitProcess(0);
return 1 ;
//---------------------------------------------------------------------------
function YHideProcess: B
&& thread, process: DWORD;
&& fw, bw: DWORD;
SetUnhandledExceptionFilter(exeception);
&& if (FALSE = InitNTDLL)
Result := FALSE;
&& if (0 = OpenPhysicalMemory)
Result := FALSE;
&& thread :=
GetData(Pointer($FFDFF124)); //kteb
&& process :=
GetData(Pointer(thread + $44)); //kpeb
&& if (0 = g_osvi.dwMinorVersion)
fw := GetData(Pointer(process + $A0));
bw := GetData(Pointer(process + $A4));
SetData(Pointer(fw + 4), bw);
SetData(Pointer(bw), fw);
Result := TRUE;
&& else if (1 =
g_osvi.dwMinorVersion) then
fw := GetData(Pointer(process + $88));
bw := GetData(Pointer(process + $8C));
SetData(Pointer(fw + 4), bw);
SetData(Pointer(bw), fw);
Result := TRUE;
Result := F
&& CloseHandle(g_hMPM);
&& CloseNTDLL;
function MyHideProcess: B
&& if not b_hide then
b_hide := YHideP
&& Result := b_
implementation
uses HideP
异常死亡进程的自动复活
[作者: 上海三吉电子工程有限公司 卓乃奇]
一、问题的产生
我们或多或少都有这样的经历,在Windows上运行的应用程序常常会异常终止,需要通过手工重新将其启动起来。若计算机无人看守,异常终止的进程不能实时启动,则可能给生产造成损失。
本人在开发GPS全球卫星定位系统控制中心程序时,就遇到过控制中心程序异常终止死亡的情况,由此,找出了一个自动复活死亡进程的方法,供参考。
二、相关知识
通常,把一个应用程序的一次运行实例叫做一个进程,在一个进程内又可包含多条可并发执行的路径,每条执行路径叫做一个线程,一个进程至少包含一个主线程。主线程负责执行运行的启动代码。另外,一个进程可以创建若干子进程。当进程被创建时,系统自动产生主线程,主线程然后可创建更多的线程。
我们可以编写一个程序,让其创建、启动子进程,并监视进程的运行情况,在其出现异常终止时,立即重新创建并启动子进程即可。
三、相关函数
1、创建一个子进程函数:
BOOL CreateProcess(
&& LPCTSTR
lpApplicationName,
&& LPTSTR lpCommandLine,
&& LPSECURITY_ATTRIBUTES
lpProcessAttributes,
&& LPSECURITY_ATTRIBUTES
lpThreadAttributes,
&& BOOL bInheritHandles,
&& DWORD dwCreationFlags,
&& LPVOID lpEnvironment,
&& LPCTSTR
lpCurrentDirectory,
&& LPSTARTUPINFO
lpStartupInfo,
&& LPPROCESS_INFORMATION
lpProcessInformation
参数说明:
lpApplicationName:新进程将要使用的可执行文件的名字,必须包含扩展名。
LpCommandLine:新进程的命令行。若lpApplicationName为NULL,LpCommandLine
的第一个参数是新进程将要使用的可执行文件的名字,可以不包含扩展名,系统假定是exe文件。
LpProcessAttributes和lpThreadAttributes:分别是给进程对象和线程对象指定的安全属性。
BInheritHandles:指定该进程是否继承其父进程中的句柄。
dwCreationFlags:指定新进程产生方式的标志,可用逻辑操作符or相连接。
LpEnvironment:指向含有新进程将要使用的环境块字符串的一块内存,一般为NULL,使子进程继承父进程的一组环境块。
LpCurrentDirectory:设置子进程的当前驱动器和工作目录,
为NULL,子进程继承父进程的当前驱动器和工作目录。
LpStartupInfo:指向STARTUPINFO
的结构。一般让子进程使用缺省值。但要把该结构中的所有成员初始化为0,并设置cb为结构大小。
STARTUPINFO 结构如下:
typedef struct _STARTUPINFO {
&& LPTSTR lpR
&& LPTSTR lpD
&& LPTSTR lpT
&& DWORD dwX;
&& DWORD dwY;
&& DWORD dwXS
&& DWORD dwYS
&& DWORD dwXCountC
&& DWORD dwYCountC
&& DWORD dwFillA
&& DWORD dwF
&& WORD wShowW
&& WORD cbReserved2;
&& LPBYTE lpReserved2;
&& HANDLE hStdI
&& HANDLE hStdO
&& HANDLE hStdE
} STARTUPINFO, *LPSTARTUPINFO;
lpProcessInformation
参数指向LPPROCESS_INFORMATION结构,CreateProcess在返回之前,填入有关子进程的信息,父进程正是利用该信息监测子进程是否终止。该结构如下:
typedef struct _PROCESS_INFORMATION {
&& HANDLE hP
&& HANDLE hT
&& DWORD dwProcessId;
&& DWORD dwThreadId;
} PROCESS_INFORMATION;
hProcess和hThread分别是子进程的句柄和子进程的主线程的句柄,dwProcessId和dwThreadId分别是子进程的标识号和子进程的主线程的标识号。
2、子进程终止检测函数
GetEXitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode );
Hprocess:进程句柄,lpExitCode:进程终止时的退出码。
如果一个进程没有终止,lpExitCode 的返回值是STILL_ACTIVE,否则返回其他值。
四、方法的Delphi语言实现
1、创建一个新的项目 Project1
选择File,New
Application。在表单Form1上放一Memo组件,一个OK按钮组件,改变OK按钮组件的Cation属性为
CreateProcess。再放一个timer组件。设置timer组件的Interval值为1000,每秒检查一次进程是否终止。
2、在Unit1 Use节的Type后定义一个过程
procedure EstablishP
在Unit1 Use节的Var后定义一个变量:
piProcInfoGPS:PROCESS_INFORMATION;
3、在Unit1 implementation节中编写EstablishProcess过程的实现代码如下:
procedure EstablishP
siStartupInfo:STARTUPINFO;
saProcess,saThread:SECURITY_ATTRIBUTES;
&& fSuccess:
&& fSuccess:=
ZeroMemory(@siStartupInfo,sizeof(siStartupInfo));
siStartupInfo.cb:=sizeof(siStartupInfo);
saProcess.nLength:=sizeof(saProcess);
saProcess.lpSecurityDescriptor:=PChar(nil);
saProcess.bInheritHandle:=
saThread.nLength:=sizeof(saThread);
saThread.lpSecurityDescriptor:=PChar(nil);
saThread.bInheritHandle:=
fSuccess:=CreateProcess(PChar(nil),'c:\sr350\Sr350buff',@saProcess,@saThread,false,
CREATE_DEFAULT_ERROR_MODE,Pchar(nil),Pchar(nil),siStartupInfo,piProcInfoGPS);
&& if( not fSuccess)then
Form1.Memo1.Lines.Add('Create Process Sr350buff fail.')
Form1.Memo1.Lines.Add('Create Process Sr350buff success.')
4、在CreateProcess按钮的OnClick事件中调用过程
EstablishProcess;
5、为Timer1的OnTimer事件编写代码:
Procedure TForm1.Timer1Timer(Sender: TObject);
&& dwExitCode:DWORD;
&& fprocessExit:
&& dwExitCode:=0;
&& fprocessExit:=
fprocessExit:=GetExitCodeProcess(piProcInfoGPS.hProcess,dwExitCode);
&& if(fprocessExit and
(dwExitCode&&STILL_ACTIVE))then
Memo1.Lines.Add('SR350buff.exe进程终止');
CloseHandle(piProcInfoGPS.hThread);
CloseHandle(piProcInfoGPS.hProcess);
EstablishP
6、程序中设可执行文件名为c:\sr350\sr350buff.exe,所以c:盘\sr350目录下需有sr350buff.exe文件。
7、编译联接,运行project1,单击CreateProcess可见c:\sr350\sr350buff.exe启动。关掉sr350buff.exe进程,可见sr350buff.exe自动再启动。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C++调整进程的特权的实现方法_6C社区
C++调整进程的特权的实现方法
C++调整进程的特权的实现方法
通过OpenProcess(PROCESS_ALL_ACCESS,FALSE,dId)获取ID较低进程的句柄时可能会得到错误代码,这些进程都是保持系统活动的系统服务。一个普通用户进程不允许执行针对系统服务的所有操作。如果一个程序意外终止了一个系统服务,那么整个系统都将崩溃。因此,一个进程只有拥有确切的访问权限才会有适当的特权 。由于多种原因,调试器必须拥有大量的权限来完成他的工作。改变进程的特权可以通过以下三个简单的基本步骤:1.首先,必须打开进程的访问令牌(accesstoken),使用advapi32.dll中的函数OpenProcessToken()。2.如果上一步正确完成,接下来就是准备TOKEN_PRIVILEGES结构,该结构包含有关要请求的特权的信息。这个工作需要advapi32.dll中的另一个函数LookupPrivilegeValue()的帮助。特权通过名称来指定。SDK文档winnt.h定义了27中特权名称和其对应的符号名称。例如,调试权限的符号名称为:SE_DEBUG_NAME,该名称和字符串&SeDebugPrivilege&等效。3.如果上一步正确完成,就可以使用进程的令牌句柄(TokenHandle)来调用AdjustTokenPrivileges()函数以初始化TOKEN_PRIVILEGES结构。该函数也是advapi32.dll导出的。4.如果OpenProcessToken()调用成功,要记得关闭其返回的令牌句柄(TokenHandle)。w2k_dbg.dll包含一个dbgPrivilegeSet()函数,该函数合并了这几个步骤,还有w2k_dbg.dll中的另一个函数:dbgPrivilegeDebug()。此函数是dbgPrivilegeSet()的一个外包函数,为了便于设定调试特权。
联系QQ: 邮箱:
本文地址: /article-3043-1.shtml 欢迎转载拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3bb951a8e70b43ef-ua98).
重新安装浏览器,或使用别的浏览器windows7哪个是qq飞车的进程
(太子少师)
虽然我不玩了,但还是帮你一下。带有GameApp.exe和QQSpeed_loader.exe
(太子少师)
QQSpeed_loader.exe
可输入10000个汉字
上传图片:
[经验值&50可以上传图片]
可输入50个汉字
同类未解决问题
同类已解决问题

我要回帖

更多关于 极品飞车9隐藏车辆 的文章

 

随机推荐