两个困扰了很久的问题,有点难度!请高手们,进来看看
第一个问题是,远程创展进程.其实我已经是按照网上的内容原原本本地抄下去的,编绎的时候无错,运行的时候,用getlastError也没有发现错误,
可是那个钩子就是不出作用!!!
void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH]="unknown";
AnsiString tmep = "";
//取得进程的句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false, processID );
//取得进程名称
if ( hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName));
}
//回显进程名称和ID
AnsiString s;
s.sprintf("\n%-20s%-20d", szProcessName, processID);
Form1->Memo1->Lines->Add(s);
tmep = AnsiString(szProcessName);
if(tmep=="Explorer.exe" )
{
DWORD byte_write;
PWSTR pszLibFileRemote=NULL;
int iReturnCode;
HANDLE hRemoteThread;
char lpDllFullPathName[100];
WCHAR pszLibFileName[100]={0};
Files\\Borland\\CBuilder5\\Projects\\试试\\消息\\另类的键盘钩子\\Project1.dll";
iReturnCode = GetCurrentDirectory(100, lpDllFullPathName);
strcat(lpDllFullPathName, "\\Project1.dll");
iReturnCode=(int)_lopen(lpDllFullPathName, OF_READ);
CheckError(iReturnCode, HFILE_ERROR, "DLL File not Exist");
iReturnCode = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS,lpDllFullPathName, strlen(lpDllFullPathName),pszLibFileName, MAX_PATH);
int cb=(1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
pszLibFileRemote = (PWSTR)VirtualAllocEx(hProcess, NULL, cb,MEM_COMMIT, PAGE_READWRITE);
CheckError((int)pszLibFileRemote, NULL, "VirtualAllocEx");
//将DLL的路径名复制到远程进程的内存空间
iReturnCode = WriteProcessMemory(hProcess,pszLibFileRemote,(PVOID)pszLibFileName, cb, NULL);
//计算LoadLibraryW的入口地址
PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "LoadLibraryW");
hRemoteThread = CreateRemoteThread( hProcess, NULL, 0,pfnStartAddr, pszLibFileRemote, 0, &byte_write);
//清场部分
ShowMessage(IntToStr(GetLastError()));
WaitForSingleObject(hRemoteThread, INFINITE);
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
if(hRemoteThread != NULL)
CloseHandle(hRemoteThread );
if(hProcess!= NULL)
CloseHandle(hProcess);
}
else
CloseHandle(hProcess);
}
}
//----------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD aProcesses[1024],cbNeeded,cProcesses;
unsigned int i;
//枚举系统进程ID列表
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;
// Calculate how many process identifiers were returned.//计算进程数量
cProcesses=cbNeeded/sizeof(DWORD);
// 输出每个进程的名称和ID
for(i = 0; i<cProcesses;i++)
PrintProcessNameAndID(aProcesses[i]);
}