两个困扰了很久的问题,有点难度!请高手们,进来看看

uio45757 2002-08-20 09:43:57
第一个问题是,远程创展进程.其实我已经是按照网上的内容原原本本地抄下去的,编绎的时候无错,运行的时候,用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]);
}
...全文
20 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
uio45757 2002-08-27
  • 打赏
  • 举报
回复
当然够!!
SessionEnum 2002-08-27
  • 打赏
  • 举报
回复
to uio45757(一条傻鱼)

你的程序有没有足够的权限啊?

我试过老侃的代码,可以运行,后来我又试了<<windows核心编程>>上的代码
根本就通不过,要改了一下才可以.

uio45757 2002-08-27
  • 打赏
  • 举报
回复
你的代码,在老侃的那个网站也有,可是我也试过了,就是不成功:(
谢谢
wyb_45 2002-08-26
  • 打赏
  • 举报
回复
其实,写的传文件的信息包结构,我感觉应该写成一个结构体就好了。或者写成一个类。
struct
{
String filename;
String validate;
int size;
char file_T[1024];
...
}
xiaoyu 2002-08-26
  • 打赏
  • 举报
回复
thank u
snsins 2002-08-26
  • 打赏
  • 举报
回复
我把代码给你贴出来,其实差不多都是API,应该在BC下也能运行
首先我们要得到宿主进程的ID

其中targetFile 我是这样定义的

#define targetFile "explorer.exe"

DWORD CInsertDlg::GetProcessId()
{
DWORD Pid=-1;
HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 lPrs;
ZeroMemory(&lPrs,sizeof(lPrs));
lPrs.dwSize=sizeof(lPrs);
Process32First(hSnap,&lPrs);
if (strstr(targetFile,lPrs.szExeFile))
{
Pid=lPrs.th32ProcessID;
return Pid;
}

while(1)
{
ZeroMemory(&lPrs,sizeof(lPrs));
lPrs.dwSize=(&lPrs,sizeof(lPrs));
if (!Process32Next(hSnap,&lPrs))
{
Pid=-1;
break;
}
if (strstr(targetFile,lPrs.szExeFile))
{
Pid=lPrs.th32ProcessID;
break;
}
}

return Pid;

}


void CInsertDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD Pid=-1;
Pid=GetProcessId();

if (Insert(Pid))
{
::MessageBox(NULL,"Insert the dll to target process is success!","Insert",MB_ICONINFORMATION);
}
else
{
::MessageBox(NULL,"Insert the dll to target process if failed!","Insert",MB_ICONINFORMATION);
}
}

BOOL CInsertDlg::Insert(DWORD dwProcessId)

{

HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
if (hProcess==NULL)
{
return FALSE;
}

char szModulePath[MAX_PATH];
GetModuleFileName(NULL,szModulePath,MAX_PATH);
PathRemoveFileSpec(szModulePath);
CString strModlePath = _T(szModulePath);
if(strModlePath[strModlePath.GetLength() - 1] != '\\')strModlePath += _T('\\');
strModlePath += _T("test.dll");//这一段代码就是得到DLL的路径,DLL放在当前程序的目录下的,其实也可以直接指定


LPVOID RemoteMemory = VirtualAllocEx(hProcess,NULL,strModlePath.GetLength() + 1,MEM_COMMIT,PAGE_READWRITE);

if (RemoteMemory==NULL)
{
return FALSE;
}



if (!WriteProcessMemory(hProcess,RemoteMemory,(void *)(LPCTSTR)strModlePath,strModlePath.GetLength() + 1,NULL))
{
return FALSE;
}


PTHREAD_START_ROUTINE pfn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");

if (pfn==NULL)
{
return FALSE;
}


HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,pfn,RemoteMemory,0,NULL);

if (hThread==NULL)
{
return FALSE;
}

WaitForSingleObject(hThread,INFINITE);//等待线程返回

VirtualFreeEx(hProcess,RemoteMemory,0,MEM_RELEASE);//释放内存 CloseHandle(hThread);
CloseHandle(hProcess);

return TRUE;
}

程序在我这里完全正常
snsins 2002-08-26
  • 打赏
  • 举报
回复
还有
你的DLL也要写对.............

如果你的DLL写错了,那么即使插入成功,你也得不到正确的结果...
snsins 2002-08-26
  • 打赏
  • 举报
回复
我有远程插入代码的VC版
要不要?
uio45757 2002-08-26
  • 打赏
  • 举报
回复
各位大侠,在传文件方法我也差不多完成了,只剩下第一个问题,老是不成功
hehe,你们说用那个rundll32.exe调用行不行??
不过具体的我不会,是完全不会,指点一下也好,总之是不让别人杀了我的程序!
我没有打算用钩子
uio45757 2002-08-25
  • 打赏
  • 举报
回复
当然要,大侠!!!!
大大怪老张 2002-08-24
  • 打赏
  • 举报
回复
sign
snsins 2002-08-24
  • 打赏
  • 举报
回复
可能你的DLL路径名有问题
把DLL放在C盘下面
别用中文名的路径名

我有VC版的原代码
如果你需要我可以给你贴出来
uio45757 2002-08-23
  • 打赏
  • 举报
回复
还有第一个问题没有解决啊,
多谢小兵和大笨蛋,虽然我还没有成功,最起码我已经知道我错在那里了,第二个问题真的困扰了很久
已经另开贴子给分,谢了
http://www.csdn.net/expert/topic/963/963158.xml?temp=.1670343
uio45757 2002-08-22
  • 打赏
  • 举报
回复
在win98下没有用,嗯,知道了
但是我是在2000下用的,很奇怪,就是用不了
bcb_fans 2002-08-22
  • 打赏
  • 举报
回复
不要再想CreateRemoteThread了,这个函数在98下无效,人家一样可以搞定你,去看看《Windows高级编程》里边的描述吧。
uio45757 2002-08-22
  • 打赏
  • 举报
回复
远程创建进程的原因是
因为程序怕让人用ctrl+alt+del杀掉,
如果用那个注册服务的话,照样会让人杀死,如果用钩API,我又不会用,
只有出些下策
我过一两天再结,多谢你的代码
wyb_45 2002-08-21
  • 打赏
  • 举报
回复
这是一种一应一答的方式来传递文件。
wyb_45 2002-08-21
  • 打赏
  • 举报
回复
我试过,没有内存溢出问题。但是以我的经验看,在分配内存时应该有少1的Bug。
wyb_45 2002-08-21
  • 打赏
  • 举报
回复
远程创展进程,什么意思,
关于传文件的代码,我以前帖过,再帖一次。比较多,

void __fastcall TForm_file::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
String sok_string=Socket->ReceiveText();
if(sok_string.SubString(1,13)!="wybsend|file|")
{
return;
}
sok_string.Delete(1,13);
String sok5=sok_string.SubString(1,5);
sok_string.Delete(1,6);
if(sok5=="allow")
{
first_send(Socket);
return;
//Socket->SendText("发第一个包"); //发文件
}
if(sok5=="nexts")
{
int pos=(sok_string.SubString(1,sok_string.Length()-1)).ToInt();
ProgressBar1->Position=pos;
nexts_send(Socket,pos);
return;
//Socket->SendText("发第一个包"); //发文件
}
// Socket->SendText("wybsend|file|error|first|");
if(sok5=="error")
{

stre_block=stre_block/10;//减少包的长度
StatusBar1->SimpleText="数据包有误,重新传输"+(String)stre_block;
Sleep(2000);
if(sok_string.SubString(1,5)=="first")
{first_send(Socket);
return;}
//Socket->SendText("重发一个包"); //发文件
}


}
//---------------------------
void __fastcall TForm_file::ClientSocket_cRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int size=Socket->ReceiveLength();
char * sok=new char[size];
Socket->ReceiveBuf(sok,size);
String sok_string=sok;
//ListBox1->Items->Add("ClientSocket_c收到"+sok_string);//收文件
if(sok_string.SubString(1,13)!="wybsend|file|")
return;
sok_string.Delete(1,13);
if(sok_string.SubString(1,6)=="first|")
{
//这是第一个包,分解文件大小
currently_number=1;//收第一个包
sok_string.Delete(1,6);
FileSize=1;
String FileSize_S=sok_string.SubString(1,sok_string.Pos("|")-1);
int FileSize_S_length=FileSize_S.Length();
try
{
FileSize = FileSize_S.ToInt();
}
catch(...){}
ProgressBar1->Min=0;
ProgressBar1->Max=FileSize;
ProgressBar1->Position=0;
//分解文件内容第一个包的大小
sok_string.Delete(1,sok_string.Pos("|"));
String block_size_S=sok_string.SubString(1,sok_string.Pos("|")-1);
int block_size_length=block_size_S.Length();
int block_size=block_size_S.ToInt();//
int temp_size=(21+FileSize_S_length+block_size_length);
if(block_size!=size-temp_size)
{//判断包的信息大小
//ShowMessage("block_size="+(String)block_size+",\n"+(String)size+"\n"+(String)(size-temp_size));
Socket->SendText("wybsend|file|error|first|");
delete [] sok;
return;
}

char * f=new char[size-temp_size];
for(int i=0;i<size-temp_size;i++)
{
f[i]=sok[i+temp_size];
}
TFileStream * pms=new TFileStream(filename,fmCreate|fmOpenWrite);
pms->WriteBuffer(f,size-temp_size);
delete pms;
delete [] f;
delete [] sok;
ProgressBar1->Position=block_size;
Socket->SendText("wybsend|file|nexts|"+(String)(block_size)+"|");
return;
}
//收下一个包
if(sok_string.SubString(1,6)=="nexts|")
{
sok_string.Delete(1,6);
// String FileSize_S=sok_string.SubString(1,sok_string.Pos("|")-1);
// int FileSize_S_length=FileSize_S.Length();
//分解文件内容下一个包的大小
String block_size_S=sok_string.SubString(1,sok_string.Pos("|")-1);
int block_size_length=block_size_S.Length();
int block_size=block_size_S.ToInt();//
// sok_string.Delete(1,sok_string.Pos("|"));
int temp_size=(20+block_size_length);
if(block_size!=size-temp_size)
{
Label1->Caption="传输过程中传输数据包出错";
// ShowMessage("err block_size="+(String)block_size+",\n"+(String)size+"\n"+(String)(size-temp_size));
delete [] sok;
return;
}

char * f=new char[size-temp_size];
for(int i=0;i<size-temp_size;i++)
{
f[i]=sok[i+temp_size];
}

FILE *in;
if ((in = fopen(filename.c_str(), "a+b"))== NULL)
return;
fseek(in,0,2);
fwrite(f,size-temp_size,1,in);
fclose(in);
delete [] f;
delete [] sok;

TFileStream * pms=new TFileStream((filename),fmOpenRead);
int file_size_open=pms->Size; //文件大小
delete pms;
// Label3->Caption="下载"+(String)file_size_open+"/"+(String)ProgressBar1->Max;
StatusBar1->SimpleText=(String)file_size_open+"/"+(String)ProgressBar1->Max;
Label1->Caption=(String)file_size_open+"/"+(String)ProgressBar1->Max;
ProgressBar1->Position=file_size_open;
Socket->SendText("wybsend|file|nexts|"+(String)(file_size_open)+"|");
return;
}
if(sok_string.SubString(1,6)=="end_e|")
{
delete [] sok;
StatusBar1->SimpleText="文件下载完毕";
Label1->Caption="文件下载完毕";
Button1->Caption="关闭";
//Socket->Close();
return;
}
}
//---------------------------
//---------------------------
void TForm_file::first_send(TCustomWinSocket *Socket)
{
currently_number=1;//发第一个包
int d=0;
{
TFileStream * pms=new TFileStream((filename),fmOpenRead);
d=pms->Size; //文件大小
delete pms;
pms=NULL;
}
ProgressBar1->Min=0;
ProgressBar1->Max=d;
int file_DX=d;//保存文件大小
FILE *in;
if ((in = fopen(filename.c_str(), "rb"))
== NULL)
{
return;
}
fseek(in,0,0);
if(d>stre_block)
d=stre_block;

char *s =new char[d];
fread(s,d,1,in);
fclose(in);

String F_size="wybsend|file|first|"+(String)file_DX+"|"+(String)d+"|"; // ExtractFileName

int F_size_l=F_size.Length();
char *c=new char[d+F_size_l];
strcpy(c,F_size.c_str());

for(int i=0;i<d;i++)
c[i+F_size_l]=s[i];
Socket->SendBuf(c,d+F_size_l);
// delete [] s;
// delete [] c;

}
//---------------------------
void TForm_file::nexts_send(TCustomWinSocket *Socket,int pos)
{
// ProgressBar1->Position=pos;
currently_number=1;//发下个包 nexts
int d=0;
{
TFileStream * pms=new TFileStream((filename),fmOpenRead);
d=pms->Size; //文件大小
delete pms;
pms=NULL;
}
StatusBar1->SimpleText=(String)pos+"/"+(String)d;
Label1->Caption=(String)pos+"/"+(String)d;
Update();
if(d<=pos)
{
Socket->SendText("wybsend|file|end_e|");
StatusBar1->SimpleText="文件上传完毕";
Label1->Caption="文件上传完毕";
Button1->Caption="关闭";
Update();
return;//文件传输完毕 ok
}
//Sleep(100);
FILE *in;
if ((in = fopen(filename.c_str(), "rb"))== NULL)
{return;}
fseek(in,pos,0);
if(d>stre_block+pos) //d
d=stre_block;
else
d=d-pos;

char *s =new char[d];
fread(s,d,1,in);
fclose(in);

String F_size="wybsend|file|nexts|"+(String)d+"|";

int F_size_l=F_size.Length();
char *c=new char[d+F_size_l];
strcpy(c,F_size.c_str());

for(int i=0;i<d;i++)
c[i+F_size_l]=s[i];
Socket->SendBuf(c,d+F_size_l);
delete [] s;
delete [] c;

}
uio45757 2002-08-21
  • 打赏
  • 举报
回复
这方面的代码我也有,可是我总是不会用,
TO:大笨蛋
我该怎么办??是不是发文件的时候,文件要大一点,,但是接收的端口一次应该最多是收8192,我好像试过.
如果发送端一次地
char *temp = new char[1424*1424];
MyFile->ReadBuffer(temp,MyFile->Size);
是一MB地去发
接收的端口也是一次次8192字节地去收!!
有代码让我看看吗??先谢了!!
加载更多回复(6)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧