关于c++编写的dll的问题
比如说我现在想用c++编写一个dll注入到进程explorer.exe中,每次这个进程启动我的dll也启动了,显示出一个messagebox,有源码的更好,或者说一个思路或主要步骤
比如说我现在想用c++编写一个dll注入到进程explorer.exe中,每次这个进程启动我的dll也启动了,显示出一个messagebox,有源码的更好,或者说一个思路或主要步骤
答案:int EnableDebugPriv(const char* name) //提升进程为DEBUG权限
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
//打开进程令牌环
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
&hToken))
{
printf("OpenProcessToken error\n");
return 1;
}
//获得进程本地唯一ID
if(!LookupPrivilegeValue(NULL,name,&luid))
{
printf("LookupPrivilege error!\n");
}
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
//调整进程权限
if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
printf("AdjustTokenPrivileges error!\n");
return 1;
}
return 0;
}BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId) //注入函数
{
HANDLE hRemoteProcess;
//获得调试权限
if(EnableDebugPriv(SE_DEBUG_NAME))
{
printf("add privilege error");
return FALSE;
}
//打开目标进程
if((hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId))==NULL)
{
printf("OpenProcess error\n");
return FALSE;
}
char *pszLibFileRemote;
//申请存放dll文件名的路径
pszLibFileRemote=(char*)VirtualAllocEx(hRemoteProcess,
NULL, lstrlen(DllFullPath)+1,
MEM_COMMIT, PAGE_READWRITE);
if(pszLibFileRemote==NULL)
{
printf("VirtualAllocEx error\n");
return FALSE;
}
//把dll的完整路径写入到内存,
if(WriteProcessMemory(hRemoteProcess,
pszLibFileRemote,(void *)DllFullPath,lstrlen(DllFullPath)+1,NULL)==0)
{
printf("WriteProcessMemory error\n");
return FALSE;
}
//得到LoadLibraryA函数地址
PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
if(pfnStartAddr==NULL)
{
printf("GetProcAddress error\n");
return FALSE;
}
HANDLE hRemoteThread;
//启动远程线程
if( (hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,
pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
{
printf("CreateRemoteThread error\n");
return FALSE;
}
return TRUE;
}DWORD GetProcessID(char *ProcessName) //获得进程PID
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
//获得系统内所有进程快照
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot error");
return 0;
}
//枚举列表中的第一个进程
BOOL bProcess=Process32First(hProcessSnap,&pe32);
while(bProcess)
{
//比较找到的进程名和我们要查找的进程名,一样则返回进程id
char exefile[128]={0};
char pname[128]={0};
strcpy(exefile,pe32.szExeFile);
strcpy(pname,ProcessName);
if(strcmp(strupr(exefile),strupr(pname))==0)
{
return pe32.th32ProcessID;
}
//继续查找
bProcess=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return 0;
}
VC6.0 测试无误~!
我说一下思路吧
先编写好dll,里面写一个函数显示一个messagebox,然后把这个dll中的函数导出,在C++的初始化函数中调用dll中的函数就可以了
不过我觉得就显示一个messagebox有写成dll的必要吗,直接写在程序中写上messagebox就行了吧
上一个:计算机c与c++有何不同?
下一个:求C++程序流程图的画法规则