关键代码要有,欢迎讨论方案。
不要叫我查资料,看核心编程。该看的看了,实现地实现了,只是想优化提高
不要叫我查资料,看核心编程。该看的看了,实现地实现了,只是想优化提高
解决方案 »
- 新手学习MFC,求推荐一本经典书
- static控件ID相同
- [难]HTML转XML遇到了问题,是IE的问题?
- 机器当前使用的网卡信息保存在注册表哪里?是不是不同的机器可能不一样?
- Spin控件动态建立和与Edit关联 及与CodeProject上的MFCGridCtr的综合运用 在线等!!!
- 怎样使能够在主界面加入控件
- 修改文件图标问题
- 请问一个网络通信的小问题
- 请问vc中类似这样的一些代码(应该是叫宏吧)怎样才能看的懂?
- 在一个group box里还有其他控件,我想在用MoveWindow()移动GROUP BOX的时候,同时移动其他控件,怎么做?
- 菜鸟问题一个返回CHAR *的函数,怎样释放内存
- MDI文档子窗口有没有Init这个函数的???
//exe部分:
#include <windows.h>
#include "psapi.h"DWORD ProcessToPID( char *); //将进程名转换为PID的函数int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char lpDllFullPathName[MAX_PATH];
WCHAR pszLibFileName[MAX_PATH]={0};
HANDLE hRemoteThread, hRemoteProcess;
DWORD dwRemoteProcessId;
PWSTR pszLibFileRemote=NULL; GetCurrentDirectory(MAX_PATH, lpDllFullPathName);
strcat(lpDllFullPathName, "\\InjectDLL.dll"); //取得dll文件的全路径
MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS,
lpDllFullPathName, strlen(lpDllFullPathName),
pszLibFileName, MAX_PATH); //将DLL文件全路径的ANSI码转换成UNICODE码
dwRemoteProcessId = ProcessToPID("notepad.exe");
hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许创建线程
PROCESS_VM_OPERATION | //允许VM操作
PROCESS_VM_WRITE, //允许VM写
FALSE, dwRemoteProcessId );
//计算DLL路径名需要的内存空间
int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,
MEM_COMMIT, PAGE_READWRITE);
//将DLL的路径名复制到远程进程的内存空间
WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
//计算LoadLibraryW的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); //启动远程线程,通过远程线程调用用户的DLL文件
hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL);
//等待远程线程退出
WaitForSingleObject(hRemoteThread, INFINITE);
//清场处理
if (pszLibFileRemote != NULL)
VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);
if (hRemoteThread != NULL) CloseHandle(hRemoteThread );
if (hRemoteProcess!= NULL) CloseHandle(hRemoteProcess);
return 0;
}DWORD ProcessToPID(char *InputProcessName)
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
HANDLE hProcess;
HMODULE hMod;
char szProcessName[MAX_PATH] = "UnknownProcess"; // 计算目前有多少进程, aProcesses[]用来存放有效的进程PIDs
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return 0;
cProcesses = cbNeeded / sizeof(DWORD);
// 按有效的PID遍历所有的进程
for ( i = 0; i < cProcesses; i++ )
{
// 打开特定PID的进程
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, aProcesses[i]);
// 取得特定PID的进程名
if ( hProcess )
{
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
//将取得的进程名与输入的进程名比较,如相同则返回进程PID
if(!_strcmpi(szProcessName, InputProcessName))
{
CloseHandle( hProcess );
return aProcesses[i];
}
}
}
}
//没有找到相应的进程名,返回0
CloseHandle( hProcess );
return 0;
}//DLL部分就不用了吧?随你自己写了。