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的更多相关文章

  1. 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)

    建议先参考我上次写的博文跨进程获取Richedit中Text: 获得QQ聊天输入框中的内容 拿到这个问题,我习惯性地会从VCL内核开始分析.找到TRichEdit声明的单元,分析TRichEdit保存 ...

  2. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  3. linux下dmidecode命令获取硬件信息

    linux下dmidecode命令获取硬件信息 2 A+ 所属分类:Linux 运维工具 dmidecode在 Linux 系统下获取有关硬件方面的信息.dmidecode 遵循 SMBIOS/DMI ...

  4. Delphi的TService 服务路径获取 Dll中获取文件路径

    研究delphi服务的路径,试了好几个方法 ,都没取出来,最后发现,要采用取DLL路径的方法 //一.获取Dll自身路径 //1)方法一: Function GetDllPath(sDllName:s ...

  5. .net环境下跨进程、高频率读写数据

    一.需求背景 1.最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下. 单表最大的也在25万左右,历史数据表因为不涉及所以不用考虑, 难点在于这个规模的热点数据,变化非常频繁. ...

  6. Linux下查看进程和端口信息

    1.根据进程名查看进程信息,以查看tomcat进程名为例,查看所对应的进程id为1095(或者使用: ps -aux | grep tomcat 查看占用内存等信息) ps -ef | grep to ...

  7. Wayland中的跨进程过程调用浅析

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...

  8. 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github

    不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信 ...

  9. 小程序wx.getUserInfo获取用户信息方案介绍

    问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本 API和组件 - -   - -     背景 小程序一个比较重要的能力就是获取用户信息,也就是使用 wx.g ...

随机推荐

  1. 为什么用户主目录下.bash_profile没有自动执行

    请注意 一般登录当前用户后 .bash_profile会自动运行 如果不自动运行请查看是不是切换用户的时候使用的su 用户名而不是su - 用户名 添加中间这个 - 后 会除了切换用户外还会加载该用户 ...

  2. leetcode first bad version python

    # The isBadVersion API is already defined for you. # @param version, an integer # @return a bool # d ...

  3. Yaf-Plus 我们只谈框架这件事

    预热下,也算对自己的督促. Comming soon!

  4. 【转】MUD教程--巫师入门教程2

    简单的人物原则上只要有 set_name<名字> . combat_exp <经验>就行了,当然我们总得稍微多添一点了.inherit NPC;void create(){ s ...

  5. 搞了一个独立博客,请各位光临pingworld.cn

    嘿嘿,每次在一个大网站上建立自己的博客后总是没有动力持续更新下去,回想其原因很大是因为没有一个自己的地盘,懒得维护!还有一个原因就是自己也没有什么干货值得跟大家分享. 随着工作的时日见长,有了各种各样 ...

  6. Delphi通过IE窗口句柄获取网页接口(IWebBrowser2) good

    主要用到的是MSAA(Microsoft Active Accessibility) 函数:ObjectFromLResult,该函数在动态链接库 oleacc.dll 中定义. uses SHDoc ...

  7. perl 解json数组

    <pre name="code" class="cpp">http://11.36.10.82:4000/api/bus?bus=307&f ...

  8. 奇怪的问题:android:focusable和android:clickable造成ListView的点击不了

    今天花了我很长时间,才解决一个很奇怪的问题,就是在ListView的点击反应不了的问题…… 在ListView中,如果其中一个元素设置为android:focusable="true&quo ...

  9. [LeetCode][Python]ZigZag Conversion

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/zigzag- ...

  10. HTML加载顺序总结测试

    首先,页面加载顺序:解析HTML结构.加载外部脚本和样式表文件.解析并执行脚本代码.构造HTML DOM模型.加载图片等外部文件.页面加载完毕. 也就是:html → head → title → # ...