delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess
unit APIUnit;
{
GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 }
interface
USES
Winapi.Windows,System.SysUtils;
type
USHORT = Word;
UNICODE_STRING = packed Record
Length : USHORT;
MaximumLength: USHORT;
Buffer : PWideString;
end;
RTL_USER_PROCESS_PARAMETERS = packed record
Reserved1 : array[..] of Byte;
Reserved2 : array[..] of Pointer;
ImagePathName: UNICODE_STRING;
CommandLine : UNICODE_STRING;
end;
PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS; _PEB_LDR_DATA = record
Length: ULONG;
Initialized: BOOLEAN;
SsHandle: pointer;//PVOID;
InLoadOrderModuleList: LIST_ENTRY;
InMemoryOrderModuleList: LIST_ENTRY;
InInitializationOrderModuleList: LIST_ENTRY;
end {_PEB_LDR_DATA};
PEB_LDR_DATA = _PEB_LDR_DATA;
PPEB_LDR_DATA = ^_PEB_LDR_DATA; _LDR_MODULE = record
InLoadOrderModuleList: LIST_ENTRY;
InMemoryOrderModuleList: LIST_ENTRY;
InInitializationOrderModuleList: LIST_ENTRY;
BaseAddress: pointer;
EntryPoint: pointer;
SizeOfImage: ULONG;
FullDllName: UNICODE_STRING;
BaseDllName: UNICODE_STRING;
Flags: ULONG;
LoadCount: SmallInt;
TlsIndex: SmallInt;
HashTableEntry: LIST_ENTRY;
TimeDateStamp: ULONG;
end {_LDR_MODULE};
LDR_MODULE = _LDR_MODULE;
PLDR_MODULE = ^_LDR_MODULE; _PEB_FREE_BLOCK = record
Next:Pointer;
Size:ULONG;
end;
PPEB_FREE_BLOCK = ^_PEB_FREE_BLOCK; PEB = packed record
InheritedAddressSpace:Boolean;// 00h
ReadImageFileExecOptions:Boolean; // 01h
BeingDebugged:Boolean; //02H
Spare:Boolean;
Mutant:THandle;
ImageBaseAddress:Pointer;
LoaderData:Pointer; //0C
ProcessParameters:Pointer;
SubSystemData:Pointer;
ProcessHeap:Pointer;
FastPebLock:Pointer;
FastPebLockRoutine:PPointer;
FastPebUnlockRoutine:PPointer;
EnvironmentUpdateCount:ULONG;
KernelCallbackTable:^Pointer;
EventLogSection:Pointer;
EventLog:Pointer;
FreeList:PPEB_FREE_BLOCK;
TlsExpansionCounter:ULONG;
TlsBitmap:Pointer;
TlsBitmapBits:array [..$] of ULONG;
ReadOnlySharedMemoryBase:Pointer;
ReadOnlySharedMemoryHeap:Pointer;
ReadOnlyStaticServerData:^Pointer;
AnsiCodePageData:Pointer;
OemCodePageData:Pointer;
UnicodeCaseTableData:Pointer;
NumberOfProcessors:ULONG;
NtGlobalFlag:ULONG;
Spare2:array [..$] of Byte;
CriticalSectionTimeout:LARGE_INTEGER;
HeapSegmentReserve:ULONG;
HeapSegmentCommit:ULONG;
HeapDeCommitTotalFreeThreshold:ULONG;
HeapDeCommitFreeBlockThreshold:Ulong;
NumberOfHeaps:ULONG;
MaximumNumberOfHeaps:ULONG;
ProcessHeaps:PPointer;
GdiSharedHandleTable:Pointer;
ProcessStarterHelper:Pointer;
GdiDCAttributeList:Pointer;
LoaderLock:Pointer;
OSMajorVersion:ULONG;
OSMinorVersion:ULONG;
OSBuildNumber:ULONG;
OSPlatformId:ULONG;
ImageSubSystem:ULONG;
ImageSubSystemMajorVersion:ULONG;
ImageSubSystemMinorVersion:ULONG;
GdiHandleBuffer:array [..$] of ULONG;
PostProcessInitRoutine:ULONG;
TlsExpansionBitmap:ULONG;
TlsExpansionBitmapBits: array [..$] of Byte;
SessionId:ULONG;
end;
PPEB = ^PEB; PROCESS_BASIC_INFORMATION = packed record
ExitStatus : DWORD;
PebBaseAddress: PPEB;
AffinityMask : DWORD;
BasePriority : DWORD;
uUniqueProcessId: ULong;
uInheritedFromUniqueProcessId: ULong;
end;
TProcessBasicInformation = PROCESS_BASIC_INFORMATION; function NtQueryInformationProcess(
ProcessHandle: THandle; {进程句柄}
ProcessInformationClass: Byte; {信息类型}
ProcessInformation: Pointer; {缓冲指针}
ProcessInformationLength: ULONG; {以字节为单位的缓冲大小}
ReturnLength: PULONG {写入缓冲的字节数}
): DWORD; stdcall; external 'ntdll.dll';
function GetProcessModuleHandle(dwProcessID:DWORD;DllName:PChar):DWORD;
implementation
function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean):Boolean;
var
TP: TOKEN_PRIVILEGES;
Dummy: Cardinal;
begin
try
TP.PrivilegeCount := ;
LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[].Luid);
if bEnable then
TP.Privileges[].Attributes := SE_PRIVILEGE_ENABLED
else TP.Privileges[].Attributes := ;
AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
except
end;
Result :=True;
end;
function EnableDebugPrivilege: Boolean;
var
hToken: THandle;
begin
Result := False;
try
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
EnablePrivilege(hToken, 'SeDebugPrivilege', True);
CloseHandle(hToken);
Result :=True;
except
end;
end;
function GetProcessModuleHandle(dwProcessID:DWORD;DllName:PChar):DWORD;
var
hProcess:DWORD;
PBI:TProcessBasicInformation;
r,ret:DWORD;
readByte: SIZE_T;
PEBType:PPEB;
PLD :PPEB_LDR_DATA;
PME :PLDR_MODULE;
PEBDLLName:PChar;
const
Size:DWORD = ;
begin
Result := ;
GetMem(PEBType,SizeOf(PEB));
ZeroMemory(PEBType,SizeOf(PEB));
GetMem(PLD,SizeOf(PEB_LDR_DATA));
ZeroMemory(PLD,SizeOf(PEB_LDR_DATA));
GetMem(PME,SizeOf(LDR_MODULE));
ZeroMemory(PME,SizeOf(LDR_MODULE));
GetMem(PEBDLLName,Size);
try
//提升进程权限
if not EnableDebugPrivilege then
begin
OutputDebugStringW('Do not have Debug privilege'); //无法提升调试权限
end;
//如果PID为0则获取自身的伪句柄,如果不是则获取指定PID的句柄
if dwProcessID <> then
//打开进程,需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,dwProcessID)
else
hProcess := GetCurrentProcess;
//调用NtQueryInformationProcess获取结构信息
ret := NtQueryInformationProcess(hProcess,,@PBI,SizeOf(PBI),@r);
//正常情况下ret是0,如果不是则认为错误
if ret = then
begin
//获取PEB结构
ReadProcessMemory(hProcess,PBI.PebBaseAddress,PEBType,SizeOf(PEB),readByte);
//获取PLD结构
ReadProcessMemory(hProcess,PEBType.LoaderData,PLD,SizeOf(PEB_LDR_DATA),readByte);
//获取第一个PME
ReadProcessMemory(hProcess,PLD.InLoadOrderModuleList.Flink,PME,SizeOf(LDR_MODULE),readByte);
//循环
while True do
begin
//清零缓冲区
ZeroMemory(PEBDLLName,Size);
//读取buff到内存中,获取当前结构的DLL名
if not ReadProcessMemory(hProcess,PME.BaseDllName.Buffer,PEBDLLName,PME.BaseDllName.Length,readByte) then Break;
//对比DLL名称,不区分大小写
if LowerCase(AnsiString(PEBDLLName)) = LowerCase(AnsiString(DllName)) then
begin
//调试信息
OutputDebugStringW(PEBDLLName);
//返回DLL的句柄
Result := dword(pme.BaseAddress);
//退出循环
Break;
end;
//调试信息
OutputDebugStringW(PEBDLLName);
//如果下一个结构为开始的结构,则认为链表已经枚举完了
if PME.InLoadOrderModuleList.Flink = PLD.InLoadOrderModuleList.Flink then Break;
//读取下一个结构
if not ReadProcessMemory(hProcess,PME.InLoadOrderModuleList.Flink,PME,SizeOf(LDR_MODULE),readByte) then Break;
end;
end
else
begin
//返回错误信息
OutputDebugStringW('Error!NtQueryInformationProcess Error!');
end;
finally
//释放使用的内存
FreeMem(PEBDLLName,Size);
FreeMem(PME,SizeOf(LDR_MODULE));
FreeMem(PLD,SizeOf(PEB_LDR_DATA));
FreeMem(PEBType,SizeOf(PEB));
end;
end;
end.
delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess的更多相关文章
- 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)
建议先参考我上次写的博文跨进程获取Richedit中Text: 获得QQ聊天输入框中的内容 拿到这个问题,我习惯性地会从VCL内核开始分析.找到TRichEdit声明的单元,分析TRichEdit保存 ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- linux下dmidecode命令获取硬件信息
linux下dmidecode命令获取硬件信息 2 A+ 所属分类:Linux 运维工具 dmidecode在 Linux 系统下获取有关硬件方面的信息.dmidecode 遵循 SMBIOS/DMI ...
- Delphi的TService 服务路径获取 Dll中获取文件路径
研究delphi服务的路径,试了好几个方法 ,都没取出来,最后发现,要采用取DLL路径的方法 //一.获取Dll自身路径 //1)方法一: Function GetDllPath(sDllName:s ...
- .net环境下跨进程、高频率读写数据
一.需求背景 1.最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下. 单表最大的也在25万左右,历史数据表因为不涉及所以不用考虑, 难点在于这个规模的热点数据,变化非常频繁. ...
- Linux下查看进程和端口信息
1.根据进程名查看进程信息,以查看tomcat进程名为例,查看所对应的进程id为1095(或者使用: ps -aux | grep tomcat 查看占用内存等信息) ps -ef | grep to ...
- Wayland中的跨进程过程调用浅析
原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github
不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信 ...
- 小程序wx.getUserInfo获取用户信息方案介绍
问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本 API和组件 - - - - 背景 小程序一个比较重要的能力就是获取用户信息,也就是使用 wx.g ...
随机推荐
- Android Handler Leak
转自:Android中使用Handler引发的内存泄露 在Activity中,经常会用到自定义的Handler来处理主线程收到的Message,但是ADT20以后,直接定义的如下定义的内部会有提示说这 ...
- Fedora 20忘记root密码
1.忘记root密码的情况下.用sudo账户$sudo su就行了. 2.直接sudo passwd root就重置了roor密码了.
- Ubuntu密码忘记了怎么办(转载)
版本:Ubuntu 11.10 思路是进入root中,然后使用passwd修改自己的密码. 假设用户名:quietheart 经过网上查询,如果安装系统之后没有设root密码,那么,Ubuntu 11 ...
- myeclipse序列号
Subscriber:huazai Subscription Code:uLR8ZC-855550-61565856301609203 Subscriber:feifei ...
- C语言学习——C和Java语言不同点
Java中有boolean数据类型,”真“为true,”假“为false.而且在if()括号里只能放boolean类型的值. C的基本数据类型和Java的基本一致,但C多了指针类型.指针是C语言的重点 ...
- PHP设计模式之单例模式(数据库访问)
1.什么是单例模式? 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2.单例模式的 ...
- 转:IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- PHP fopen和fwrite函数实现创建html页面
思路 用fopen函数和fread函数得到模板,然后用str_replace函数替换模板标签为变量,最后用fwrite函数输出新的HTML页面 index.html模板页面 <!DOCTYPE ...
- hdu 4635 Strongly connected 强连通
题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...
- 贴片方式COB COF COG
英文简称: COB英文全称: Chip On Board中文全称: 通过邦定将IC裸片固定于印刷线路板上 英文简称: COF 英文全称: Chip On FPC 中文全称: 将IC固定于柔性线路板上 ...