社区
Windows SDK/API
帖子详情
我想做一个全局钩子,但是只知道目的程序的可执行文件名,路径都不知道,有没有办法?
nightfallrove
2003-05-13 09:40:14
假如我要HOOK一个程序,但是不知道对方的进程号,也不知道对方是否已经运行
只知道其可执行文件名,,该怎么办?
如何才能在它启动后即得到其进程号并HOOK它?
哪位有实例呢?
谢谢谢谢..............
...全文
76
3
打赏
收藏
我想做一个全局钩子,但是只知道目的程序的可执行文件名,路径都不知道,有没有办法?
假如我要HOOK一个程序,但是不知道对方的进程号,也不知道对方是否已经运行 只知道其可执行文件名,,该怎么办? 如何才能在它启动后即得到其进程号并HOOK它? 哪位有实例呢? 谢谢谢谢..............
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
HUANG_JH
2003-05-14
打赏
举报
回复
private:
//----------------列举 Process 函数-------------------------------
HANDLE THListProcess( MinData *cListProcess )
{
HANDLE hSnapShot=NULL;
HANDLE hResult = NULL;
PROCESSENTRY32 processInfo;
char* pstrExeName;
char* pReturn ="\r\n" ;
bool bFirst = true;
::ZeroMemory(&processInfo, sizeof(PROCESSENTRY32));
processInfo.dwSize = sizeof(PROCESSENTRY32);
hSnapShot = FCreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if(hSnapShot == INVALID_HANDLE_VALUE)
return NULL;
//列举出所有的process名称
while((bFirst ? FProcess32First(hSnapShot,
&processInfo) : FProcess32Next(hSnapShot,
&processInfo)))
{
bFirst = false;
pstrExeName = strrchr(processInfo.szExeFile,'\\');
if(!pstrExeName)
pstrExeName = processInfo.szExeFile;
else
pstrExeName++;
if (cListProcess->nSize < 4000 )
{
memcpy(cListProcess->szData + cListProcess->nSize , pstrExeName , StrLen(pstrExeName) );
cListProcess->nSize += StrLen(pstrExeName);
memcpy(cListProcess->szData + cListProcess->nSize , pReturn , StrLen(pReturn) );
cListProcess->nSize += StrLen(pReturn);
}
}
if(hSnapShot)
CloseHandle(hSnapShot);
return hResult;
}
HANDLE NTListProcess( MinData *cListProcess )
{
HANDLE hHeap = FGetProcessHeap();
NTSTATUS Status;
ULONG cbBuffer = 0x8000;
PVOID pBuffer = NULL;
HANDLE hResult = NULL;
char* pReturn ="\r\n" ;
do
{
pBuffer = HeapAlloc(hHeap, 0, cbBuffer);
if (pBuffer == NULL)
return NULL;
//return SetLastError(ERROR_NOT_ENOUGH_MEMORY), NULL;
Status = FQuerySysInfo(
SystemProcessesAndThreadsInformation,
pBuffer, cbBuffer, NULL);
if (Status == STATUS_INFO_LENGTH_MISMATCH)
{
HeapFree(hHeap, 0, pBuffer);
cbBuffer *= 2;
}
else if (!NT_SUCCESS(Status))
{
HeapFree(hHeap, 0, pBuffer);
return NULL;
//return SetLastError(Status), NULL;
}
}
while (Status == STATUS_INFO_LENGTH_MISMATCH);
PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES)pBuffer;
for (;;)
{
PCWSTR pszProcessName = pProcesses->ProcessName.Buffer;
if (pszProcessName == NULL)
pszProcessName = L"Idle";
CHAR szProcessName[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, pszProcessName,-1,szProcessName, MAX_PATH, NULL, NULL);
if (cListProcess->nSize < 4000 )
{
memcpy(cListProcess->szData + cListProcess->nSize , szProcessName , StrLen(szProcessName) );
cListProcess->nSize += StrLen(szProcessName);
memcpy(cListProcess->szData + cListProcess->nSize , pReturn , StrLen(pReturn) );
cListProcess->nSize += StrLen(pReturn);
}
if (pProcesses->NextEntryDelta == 0)
break;
//查找下一个 process structure 的地址
pProcesses = (PSYSTEM_PROCESSES)(
((LPBYTE)pProcesses)
+ pProcesses->NextEntryDelta);
}
HeapFree(hHeap, 0, pBuffer);
return hResult;
}
//----------------查找Process 函数-------------------------------
HANDLE FindProcess(IN const char* pstrProcessName, OUT DWORD& dwId)
{
if(!m_hKernelLib)
return NULL;
// 使用 toolhelpapi
if(FCreateToolhelp32Snapshot && FProcess32First && FProcess32Next)
return THFindProcess(pstrProcessName, dwId);
// 使用 NT api
if(FQuerySysInfo && FHeapAlloc && FGetProcessHeap && FHeapFree)
return NTFindProcess(pstrProcessName, dwId);
return NULL;
}
HANDLE THFindProcess(IN const char* pstrProcessName,OUT DWORD& dwId)
{
HANDLE hSnapShot=NULL;
HANDLE hResult = NULL;
PROCESSENTRY32 processInfo;
char* pstrExeName;
bool bFirst = true;
::ZeroMemory(&processInfo, sizeof(PROCESSENTRY32));
processInfo.dwSize = sizeof(PROCESSENTRY32);
hSnapShot = FCreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if(hSnapShot == INVALID_HANDLE_VALUE)
return NULL;
//列举出所有的process名称
while((bFirst ? FProcess32First(hSnapShot,
&processInfo) : FProcess32Next(hSnapShot,
&processInfo)))
{
bFirst = false;
pstrExeName = strrchr(processInfo.szExeFile,'\\');
if(!pstrExeName)
pstrExeName = processInfo.szExeFile;
else
pstrExeName++;
//将列举出的process名称与输入的process名称比较
if(stricmp(pstrExeName, pstrProcessName) == 0)
{
//找到需要kill 的 process,取回其 HANDLE
hResult=OpenProcess(
SYNCHRONIZE|PROCESS_TERMINATE, TRUE,
processInfo.th32ProcessID);
dwId = processInfo.th32ProcessID;
break;
}
}
if(hSnapShot)
CloseHandle(hSnapShot);
return hResult;
}
HANDLE NTFindProcess(IN const char* pstrProcessName,OUT DWORD& dwId)
{
HANDLE hHeap = FGetProcessHeap();
NTSTATUS Status;
ULONG cbBuffer = 0x8000;
PVOID pBuffer = NULL;
HANDLE hResult = NULL;
do
{
pBuffer = HeapAlloc(hHeap, 0, cbBuffer);
if (pBuffer == NULL)
return NULL;
//return SetLastError(ERROR_NOT_ENOUGH_MEMORY), NULL;
Status = FQuerySysInfo(
SystemProcessesAndThreadsInformation,
pBuffer, cbBuffer, NULL);
if (Status == STATUS_INFO_LENGTH_MISMATCH)
{
HeapFree(hHeap, 0, pBuffer);
cbBuffer *= 2;
}
else if (!NT_SUCCESS(Status))
{
HeapFree(hHeap, 0, pBuffer);
return NULL;
//return SetLastError(Status), NULL;
}
}
while (Status == STATUS_INFO_LENGTH_MISMATCH);
PSYSTEM_PROCESSES pProcesses = (PSYSTEM_PROCESSES)pBuffer;
for (;;)
{
PCWSTR pszProcessName = pProcesses->ProcessName.Buffer;
if (pszProcessName == NULL)
pszProcessName = L"Idle";
CHAR szProcessName[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, pszProcessName,-1,szProcessName, MAX_PATH, NULL, NULL);
if(stricmp(szProcessName, pstrProcessName) == 0) //找到需要kill 的 process
{
hResult=OpenProcess(
SYNCHRONIZE|PROCESS_TERMINATE, TRUE,
pProcesses->ProcessId);
dwId = pProcesses->ProcessId;
break;
}
if (pProcesses->NextEntryDelta == 0)
break;
//查找下一个 process structure 的地址
pProcesses = (PSYSTEM_PROCESSES)(
((LPBYTE)pProcesses)
+ pProcesses->NextEntryDelta);
}
HeapFree(hHeap, 0, pBuffer);
return hResult;
}
// CALLBACK函数 用来kill process
static BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam )
{
DWORD dwID ;
GetWindowThreadProcessId(hwnd, &dwID) ;
if(dwID == (DWORD)lParam)
{
PostMessage(hwnd, WM_CLOSE, 0, 0) ;
}
return TRUE ;
}
HMODULE m_hNTLib;
HMODULE m_hKernelLib;
// ToolHelp related functions
PFCreateToolhelp32Snapshot FCreateToolhelp32Snapshot;
PFProcess32First FProcess32First;
PFProcess32Next FProcess32Next;
// native NT api functions
PFZwQuerySystemInformation FQuerySysInfo;
PFGetProcessHeap FGetProcessHeap;
PFHeapAlloc FHeapAlloc;
PFHeapFree FHeapFree;
};
HUANG_JH
2003-05-14
打赏
举报
回复
参考
/*
kill进程的类
作者:HUANG_JH
修改日期 :2003/3/20
说明:
kill掉指定文件名的进程
98, ME, NT4,2k, and XP均可使用
使用:
KillProcess 函数
输入某个进程的名称如 KillProcess("QQ2000b.exe"); 即可
ListProcess 函数
列出系统中所有进程的名称,所有名称以xxx.exe \r\n xxx.exe \r\n 字符串形式
存放在 MinData.szData
定义
#include "KillProcess.hpp"
CKillProcessHelper *pKillProcess;
pKillProcess = new CKillProcessHelper;
1.
pKillProcess->KillProcess("QQ2000b.exe");
2.
MinData cListProcess;
pKillProcess->ListProcess ( &cListProcess );
Memo1->Lines->Add(cListProcess.szData );
delete pKillProcess ;
pKillProcess = NULL;
*/
#include <tlhelp32.h>
//
// Some definitions from NTDDK and other sources
//
typedef LONG NTSTATUS;
typedef LONG KPRIORITY;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define SystemProcessesAndThreadsInformation 5
typedef struct _CLIENT_ID {
DWORD UniqueProcess;
DWORD UniqueThread;
} CLIENT_ID;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
typedef struct _VM_COUNTERS {
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
LONG State;
LONG WaitReason;
} SYSTEM_THREADS, * PSYSTEM_THREADS;
// Note that the size of the SYSTEM_PROCESSES structure is
// different on NT 4 and Win2K, but we don't care about it,
// since we don't access neither IoCounters member nor
//Threads array
typedef struct _SYSTEM_PROCESSES {
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
#if _WIN32_WINNT >= 0x500
IO_COUNTERS IoCounters;
#endif
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, * PSYSTEM_PROCESSES;
typedef struct _tagMinData
{
char szData[ 4096 ]; // 数据包缓冲区
int nSize ; // 数据包长度
// 数据初始化
_tagMinData()
{
memset( szData, 0, 4096 );
nSize = 0;
}
} MinData, *LPMinData;
class CKillProcessHelper
{
private:
//Functions loaded from Kernel32
typedef HANDLE (WINAPI *PFCreateToolhelp32Snapshot)(
DWORD dwFlags,
DWORD th32ProcessID
);
typedef BOOL (WINAPI *PFProcess32First)(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
typedef BOOL (WINAPI *PFProcess32Next)(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
// Native NT API Definitions
typedef NTSTATUS (WINAPI * PFZwQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);
typedef HANDLE (WINAPI* PFGetProcessHeap)(VOID);
typedef LPVOID (WINAPI* PFHeapAlloc)(HANDLE,DWORD,SIZE_T);
typedef BOOL (WINAPI* PFHeapFree)(HANDLE,DWORD,LPVOID);
public:
CKillProcessHelper() : FCreateToolhelp32Snapshot(NULL),
FProcess32First(NULL), FProcess32Next(NULL),
m_hKernelLib(NULL),
m_hNTLib(NULL)
{
m_hKernelLib = ::LoadLibraryA("Kernel32");
if (m_hKernelLib)
{
// 加载 ToolHelp functions
FCreateToolhelp32Snapshot =
(PFCreateToolhelp32Snapshot)
::GetProcAddress(m_hKernelLib,"CreateToolhelp32Snapshot");
FProcess32First = (PFProcess32First)
::GetProcAddress(m_hKernelLib,"Process32First");
FProcess32Next = (PFProcess32Next)
::GetProcAddress(m_hKernelLib,"Process32Next");
}
if(!FCreateToolhelp32Snapshot ||
!FProcess32First || !FProcess32Next)
{
// 无法查找到 ToolHelp functions
//说明当前为 NT4. 调用 ntdll.dll
if(!m_hKernelLib)
return;
m_hNTLib = ::LoadLibraryA("ntdll.dll");
if(m_hNTLib)
{
FQuerySysInfo =
(PFZwQuerySystemInformation)
::GetProcAddress(m_hNTLib,"ZwQuerySystemInformation");
// 加载 对应的functions
FGetProcessHeap = (PFGetProcessHeap)
::GetProcAddress(m_hKernelLib,"GetProcessHeap");
FHeapAlloc = (PFHeapAlloc)
::GetProcAddress(m_hKernelLib,"HeapAlloc");
FHeapFree = (PFHeapFree)
::GetProcAddress(m_hKernelLib,"HeapFree");
}
}
}
~CKillProcessHelper()
{
if(m_hKernelLib)
FreeLibrary(m_hKernelLib);
if(m_hNTLib)
FreeLibrary(m_hNTLib);
}
bool KillProcess(IN const char* pstrProcessName)
{
DWORD dwId;
HANDLE hProcess = FindProcess(pstrProcessName,dwId);
BOOL bResult;
if(!hProcess)
return false;
// 回掉TerminateAppEnum() 发送 WM_CLOSE 到对应PID的进程
// PID是由输入的process名查找的来的
::EnumWindows((WNDENUMPROC) CKillProcessHelper::TerminateAppEnum,(LPARAM) dwId);
//等待 process结束
if(WaitForSingleObject(hProcess, 5000) != WAIT_OBJECT_0)
bResult = TerminateProcess(hProcess,0);
else
bResult = TRUE;
CloseHandle(hProcess);
return bResult == TRUE;
}
HANDLE ListProcess( MinData *cListProcess )
{
if(!m_hKernelLib)
return NULL;
// 使用 toolhelpapi
if(FCreateToolhelp32Snapshot && FProcess32First && FProcess32Next)
return THListProcess(cListProcess);
// 使用 NT api
if(FQuerySysInfo && FHeapAlloc && FGetProcessHeap && FHeapFree)
return NTListProcess( cListProcess );
return NULL;
}
nightfallrove
2003-05-14
打赏
举报
回复
呵呵,你除了想当版主还想当什么??
我全力支持....
谢了,,
FPGA图像处理算法教程
下载代码方式:https://pan.quark.cn/s/28492da20c79 依据所提供的文件资料,本资源将系统地探讨FPGA(即现场可编程门阵列)的核心概念、其在视频图像技术领域的入门及进阶知识要点,以及图像处理算法的实现方法。此外,还将对VIPBoardBig这一特定FPGA开发板的详细资料和使用途径进行深入剖析。 FPGA的入门与进阶学习主要涉及以下核心内容: 1. FPGA的基础概念:FPGA是一种能够通过编程进行配置的集成电路,主要
目的
是达成硬件逻辑的可重构特性。该类芯片由大量的可配置逻辑模块(CLB)、输入输出模块(IOB)以及可编程互连资源共同构成。 2. FPGA开发板与相关套件:FPGA开发板是一种用于FPGA芯片学习和测试的硬件平台,通常配备有基础的外设设备,例如LED指示灯、按键开关、LCD显示屏、串口通信接口等。套件则通常包含硬件板卡、技术文档、相关资源,以及可能的软件工具和示例代码集。VIPBoardBig即为本教程选用的FPGA开发板,拥有特定的硬件配置和功能特性。 3. FPGA的开发流程:FPGA开发一般涉及硬件描述语言(HDL)的设计与仿真阶段,常用语言为Verilog或VHDL。随后,借助综合工具将设计蓝图转化为FPGA内部的逻辑网络,最终通过编程设备将配置文件传输至FPGA芯片中,从而实现设计的预期功能。 4. 外设开发与设计工作:涵盖LED显示控制、键盘驱动、LCD显示驱动、UART串口设计等基础外设的开发任务。这部分知识将引导学习者掌握如何在FPGA平台上管理和运用这些基础外设。 5. VGA驱动显示与字符显示测试:VGA(Video Graphics Array)是一种视频传输接口标准,能够支持640x480...
SmartGit 版本控制
SmartGit 版本控制
GEO营销基于大模型采信逻辑的七步内容矩阵构建:企业知识库落地与AI流量获取系统方法论
内容概要:本文系统阐述了企业在搭建官方知识库后如何通过“7步锚定法”实现GEO(生成式引擎优化)的落地,重点在于从知识库走向内容矩阵的战略升级。文章指出知识库仅为起点,真正的核心是让大模型“信任并推荐”企业内容。为此提出“
一个
主战场+多个品牌布局”的策略,强调需根据行业特性选择高商业流量的大模型(如豆包、文心一言、通义千问等),而非工具性模型(如ChatGPT、Claude)。通过业务场景画像、大模型流量测绘、采信逻辑拆解、内容架构设计、语义关键词埋点、信源建设与效果迭代七步法,构建高质量、高可信度的内容体系,并警惕“全模型覆盖、内容堆砌、一套内容通用、忽视第三方平台”四大误区。最终指出GEO本质是一场认知战,比拼的是对大模型逻辑与客户需求的理解深度及长期主义投入。; 适合人群:已完成官方知识库搭建、希望提升AI引用率与获客效率的企业市场负责人、品牌运营、数字营销从业者及SEO/GEO优化相关人员。; 使用场景及目标:①指导企业科学选择主攻大模型并制定差异化内容策略;②构建符合大模型采信逻辑的高质量内容矩阵;③避免常见GEO落地误区,提升AI搜索下的品牌曝光与转化效果;④建立可持续优化的数据反馈闭环。; 阅读建议:建议结合自身行业特征与客户决策
路径
,逐步实践“7步法”,优先聚焦单一主战场打透,注重内容质量与第三方权威信源建设,坚持3-6个月持续投入以观察真实效果。
国央企创新负责人如何借助科创数智大脑实现产业链协同创新?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
国央企创新负责人如何通过科创数智大脑支持企业数字化转型?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
Windows SDK/API
1,222
社区成员
8,135
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章