首页
社区
课程
招聘
[原创]Worm.Parite.Residented 详细分析+专杀工具src
2010-8-4 21:44 10462

[原创]Worm.Parite.Residented 详细分析+专杀工具src

2010-8-4 21:44
10462
【文章标题】: Worm.Parite.Residented 详细分析+专杀工具src
【文章作者】: Azure[LCG]
【作者邮箱】: Azure@52pojie.cn
【作者QQ号】: 325002492
【加壳方式】: UPX
【编写语言】: BC++
【使用工具】: IDA、OD
【操作平台】: Win7+WinXP Sp3(VM)
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  完蛋了……看来我的计算机水平还是菜鸟等级的,装着自己很懂似的,不装杀软,裸奔,导致今天在干伤天害理的事情的时候被病毒感染,全盘exe文件除了最核心的系统文件无一幸免。
  这个专杀只是把文件的病毒区段数据填0,然后修改入口点,但是文件大小还是没恢复回去……因为感染数量相当巨大……这只是D盘的= =郁闷啊……
  留下一个图片
  
  我欠回炉重造了……唉。。。
  
  下次再也不敢帮别人盗版了……= =
  ------------------------------------------------------------------------------------------------------------------
  以上为去年10月1感染病毒当天的吐嘈
  
  彻底败掉了啊……败给了一个2001年10月7日写的病毒……- -囧爆肝,既然经历了这么多年的时光还能在网络上进行传染,就说明很有分析的必要吧……

  当然现在的杀毒软件都可以干掉的、打破了我两年裸奔不中毒的记录啊……- -唉。
  好吧……现在开始拆它。
  以感染的InternetExplore为例(版本号6.0.2900.5512)
感染后明显多出一段
  对比感染前后PE头


  我们先来分析被感染程序的Loader
  用到的IDA里的解码脚本
  - -其实渣质量的.
  
    [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], 0EAB8D[color=#008000]//decode key[/color]
    [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], 0041901C[color=#008000]//解码起始位置[/color]
    [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]esi[/color][/color], 598[color=#008000]//固定大小[/color]
  L007:
    [color=#0000D0][color=#0000D0]xor[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+[color=#FF0000][color=#FF0000]esi[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color]
    [color=#0000D0][color=#0000D0]dec[/color][/color]     [color=#FF0000][color=#FF0000]esi[/color][/color]
    [color=#0000D0][color=#0000D0]sub[/color][/color]     [color=#FF0000][color=#FF0000]esi[/color][/color], 3
    [color=#0000D0][color=#0000D0]jnz[/color][/color] L007
  
  [color=#0000D0]#include[/color] <idc.idc>
  [color=#0000D0]static[/color] decrypt([color=#b000b0]end[/color], key)
  {
  	[color=#0000D0]auto[/color] i, x[color=#008000];[/color]
  	[color=#b000b0]end[/color]=[color=#b000b0]end[/color]+0x598[color=#008000];[/color]
  	[color=#0000D0]for[/color] (i=0x598[color=#008000];i!=0;i=i-4)[/color]
  	{
  		x=[color=#b000b0]Dword[/color]([color=#b000b0]end[/color])[color=#008000];[/color]
  		x= (x^key)[color=#008000];[/color]
  		PatchDword([color=#b000b0]end[/color],x)[color=#008000];[/color]
  		[color=#b000b0]end[/color] = [color=#b000b0]end[/color] - 4[color=#008000];[/color]
  	}
  }
  

  执行decrypt(0x41901c,0x0EAB8D)即可
  
  既然是解码,我们就把这段叫作DecodeProc吧……解码段最后跳去执行Loader的main函数了
  
  .qnk_:0041901C                 [color=#0000D0][color=#0000D0]jnz[/color][/color]     [color=#0000D0]short[/color] loc_419013
  .qnk_:0041901E                 [color=#0000D0][color=#0000D0]nop[/color][/color]
  .qnk_:0041901F                 [color=#0000D0][color=#0000D0]nop[/color][/color]
  .qnk_:00419020                 [color=#0000D0][color=#0000D0]call[/color][/color]    main
  .qnk_:00419020 DecodeProc      [color=#b000b0]endp[/color]
  .qnk_:00419020
  .qnk_:00419020 [color=#008000]; ---------------------------------------------------------------------------[/color]
  

Loader流程

  Loader数据结构
  
  00419020  00017DE8  [color=#0000D0]CALL[/color]
  00419024  00000000------------------------------------------------
  00419028  00400000  IEXPLORE.00400000[color=#008000];下面一砣是原程序和病毒体信息[/color]
  0041902C  00002451  +0x0C OEP RVA
  00419030  00016C00  +0x10 原大小
  00419034  000171D6  +0x14 加密病毒Dll偏移
  00419038  0002AA00  +0x18 病毒Dll大小
  0041903C  00000000
  00419040  00401000  +0x20 <&KERNEL32.LoadLibraryA>
  00419044  00402B4C  +0x24 ASCII [color=#808080][color=#808080]"UnhandledExceptionFilter"[/color][/color]
  00419048  00402AE2  +0x28 ASCII [color=#808080][color=#808080]"GetCommandLineA"[/color][/color]
  0041904C  00001AEC
  00419050  00002B4A  +0x30 被替换掉的第一个IAT Thunk
  00419054  00002AE0  +0x34 被替换掉的第二个IAT Thunk  - -插一句,其实如果我早就注意到这里的话专杀的代码可以直接用这个数据、还能省掉减掉基址那一步……嘛,算了,反正效果一样、懒得去改了
  00419058  00000400
  0041905C  7C863E6A  kernel32.[b][color=#000080]UnhandledExceptionFilter[/color][/b][color=#008000]; 被替换掉的Kernel32前两个函数[/color]
  00419060  7C812FAD  kernel32.GetCommandLineA
  

  Loader main函数的关键点
  
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]ebp[/color][/color]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ebp[/color][/color], [color=#FF0000][color=#FF0000]esp[/color][/color]
  [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]esp[/color][/color], -140
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]ebp[/color][/color]
  [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], 4                   [color=#008000]; [color=#FF0000]eax[/color]=DATA after [color=#0000D0]call[/color][/color]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#FF0000][color=#FF0000]ebp[/color][/color]
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]ebx[/color][/color]
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]esi[/color][/color]
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]edi[/color][/color]
  [color=#0000D0][color=#0000D0]xor[/color][/color]     [color=#FF0000][color=#FF0000]ebx[/color][/color], [color=#FF0000][color=#FF0000]ebx[/color][/color]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edi[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]]     [color=#008000]; [color=#FF0000]edi[/color]=DATA[/color]
  [color=#0000D0][color=#0000D0]lea[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]-38]
  [color=#0000D0][color=#0000D0]sub[/color][/color]     [color=#FF0000][color=#FF0000]edi[/color][/color], 5                   [color=#008000]; CALL addr[/color]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+C]   [color=#008000]; [color=#FF0000]eax[/color]=oep rva[/color]
  [color=#0000D0][color=#0000D0]lea[/color][/color]     [color=#FF0000][color=#FF0000]esi[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+84]  [color=#008000]; [color=#FF0000]esi[/color]=lpKernel32_dll[/color]
  [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+8]   [color=#008000]; [[color=#FF0000]edi[/color]+8]base addr[/color]
  [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], 4
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color]     [color=#008000]; 返回地址=oep[/color]
  

  在InitImportTable函数里回填IAT并准备Loader之后要用到的IAT,下面的代码是用来回填IAT用的
  
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+24]
  [color=#0000D0][color=#0000D0]push[/color][/color]    hKernel32
  [color=#0000D0][color=#0000D0]call[/color][/color]    [b][color=#000080][b][color=#000080]GetProcAddress[/color][/b][/color][/b]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C]
  [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+28]
  [color=#0000D0][color=#0000D0]push[/color][/color]    hKernel32
  [color=#0000D0][color=#0000D0]call[/color][/color]    [b][color=#000080][b][color=#000080]GetProcAddress[/color][/b][/color][/b]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C]
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20]
  [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], 4
  [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color]
  

  
  剩下的几个关键函数用C代码的方式分析
  
  bool [color=#0000D0]__stdcall[/color] IsInfected([color=#0000D0][color=#0000D0]int[/color][/color] a1, [color=#0000D0][color=#0000D0]int[/color][/color] a2, [color=#0000D0][color=#0000D0]int[/color][/color] a3)
  {
    [color=#b000b0][color=#0000D0]if[/color][/color] ( ![b][color=#000080][b][color=#000080]RegOpenKeyEx[/color][/b][/color][/b](HKEY_CURRENT_USER,
            a3 + 189,                             [color=#008000]// Software\Microsoft\Windows\CurrentVersion\Explorer[/color]
            0,
            KEY_READ,
            &hKey) )
    {
      bInfected = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0]HKEY[/color], [color=#0000D0][color=#0000D0]int[/color][/color], _DWORD, _DWORD, [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0][color=#0000D0]int[/color][/color] *))(a2 + 48))(hKey, a3 + 240, 0, 0, a1, &v5) == 0[color=#008000];[/color]
      (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0]HKEY[/color]))(a2 + 52))(hKey)[color=#008000];[color=#008000]// RegQueryKeyValueExA(X,PINF...)[/color][/color]
                                                  [color=#008000]//病毒核心Dll的文件位置[/color]
    }
    [color=#0000D0]return[/color] bInfected[color=#008000];[/color]
  }
  
  [color=#0000D0]char[/color] ExpandVirus([color=#0000D0][color=#0000D0]int[/color][/color] a1<[color=#FF0000][color=#FF0000]ebx[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a2<[color=#FF0000][color=#FF0000]edi[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a3<[color=#FF0000][color=#FF0000]esi[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a4, [color=#0000D0][color=#0000D0]int[/color][/color] a5, [color=#0000D0][color=#0000D0]int[/color][/color] a6)
  {
    GetModuleFileNameA(0, &v12, MAX_PATH, a2, a3, a1)[color=#008000];[/color]
    hFile = CreateFileA(&v12,GENERIC_READ,1,0,3,1,0)[color=#008000];[/color]
    [color=#b000b0][color=#0000D0]if[/color][/color] ( hFile == -1 )
    {
      BYTE3(v16) = 0[color=#008000];[/color]
    }
    [color=#b000b0][color=#0000D0]else[/color][/color]
    {
      GetTempPathA(MAX_PATH, &v12)[color=#008000];[/color]
      v15 = [b][color=#000080][b][color=#000080]GetTickCount[/color][/b][/color][/b]()[color=#008000];       [color=#008000]//生成随机文件名[/color][/color]
      v7 = 0[color=#008000];[/color]
      [color=#0000D0]do[/color]
      {
        v8 = *((_BYTE *)&v15 + v7)[color=#008000];[/color]
        *((_BYTE *)&v15 + v7++) = v8 / 10 + 97[color=#008000];[/color]
      }
      [color=#0000D0]while[/color] ( v7 <= 2 )[color=#008000];[/color]
      BYTE3(v15) = 0[color=#008000];[/color]
      GetTempFileNameA(&v15, v8 % 10, &v12, &v15, 0, a4)[color=#008000];[/color]
      v14 = CreateFileA(a4,GENERIC_WRITE|GENERIC_READ,1,0,2,128,0)[color=#008000];[/color]
      [color=#b000b0][color=#0000D0]if[/color][/color] ( v14 == -1 )
      {
        BYTE3(v16) = 0[color=#008000];[/color]
      }
      [color=#b000b0][color=#0000D0]else[/color][/color]
      {                                           [color=#008000]// 每次解码10KB病毒DLL,然后写完了继续解[/color]
        v9 = *(_DWORD *)(a6 + 24)[color=#008000];[/color]
        (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], _DWORD, _DWORD, _DWORD))(a5 + 28))(hFile, *(_DWORD *)(a6 + 20), 0, 0)[color=#008000];[color=#008000]// SetFilePoint[/color][/color]
        [color=#0000D0]for[/color] ( [color=#008000]; v9 > 0x2800; v9 -= 10240 )[/color]
        {
          (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 20))(hFile, &v11, 10240, &v13, 0)[color=#008000];[color=#008000]// ReadFile[/color][/color]
          Decode2(*(_DWORD *)(a6 + 128), &v11, 10240)[color=#008000];[color=#008000]// 解码病毒DLL[/color][/color]
          (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 24))(v14, &v11, 10240, &v13, 0)[color=#008000];[/color]
        }
        (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 20))(hFile, &v11, v9, &v13, 0)[color=#008000];[color=#008000]// [/color][/color]
                                                  [color=#008000]// - -解码最后一块,完事擦屁股[/color]
        Decode2(*(_DWORD *)(a6 + 128), &v11, v9)[color=#008000];[/color]
        (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 24))(v14, &v11, v9, &v13, 0)[color=#008000];[/color]
        (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color]))(a5 + 32))(v14)[color=#008000];[/color]
        BYTE3(v16) = 1[color=#008000];[/color]
      }
      [b][color=#000080][b][color=#000080]CloseHandle[/color][/b][/color][/b](hFile)[color=#008000];[/color]
    }
    [color=#0000D0]return[/color] BYTE3(v16)[color=#008000];[/color]
  }
  
  [color=#0000D0]char[/color] [color=#0000D0]__stdcall[/color] InitVirusDll([color=#0000D0][color=#0000D0]int[/color][/color] a1, [color=#0000D0][color=#0000D0]int[/color][/color] a2, [color=#0000D0][color=#0000D0]int[/color][/color] a3, [color=#0000D0][color=#0000D0]int[/color][/color] a4)
  {
    v4 = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color]))a2)(a1)[color=#008000];      [color=#008000]// - -Load从输入表里得到的病毒路径[/color][/color]
    [color=#0000D0]return[/color] v4
        && (v5 = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0][color=#0000D0]int[/color][/color]))(a2 + 4))(v4, a4 + 245)) != 0[color=#008000]// [b][color=#000080]GetProcAddress[/color][/b](Initiate)[/color]
        && ([color=#0000D0]unsigned[/color] [color=#0000D0]__int8[/color])(([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] *)([color=#0000D0][color=#0000D0]int[/color][/color]))v5)(a3)[color=#008000];[color=#008000]// Initiate(Addr)[/color][/color]
                                                  [color=#008000]// 这里Addr是一开始DecodeProc执行完以后那个Call的地址[/color]
                                                  [color=#008000]// 00419020    E8 7D010000     [color=#0000D0]call[/color]    004191A2[/color]
                                                  [color=#008000]// Loader分析告一段落。下面继续Dll分析[/color]
  }
  

  以上代码删除了大量的废物、不过这样看起来流程更清晰。
  
  Loader分析到此结束。
  ------------------------------------------------------------------------------------------------------------------
  病毒执行的流程是强制替换Kernel32前两个函数为LoadLibraryA和GetProcAddress,然后在运行的时候再还原。依据此原理,用C++编了个16K的程序。感染以后188KB……作者还真是不注意文件大小啊。这么大一砣东西粘到一个16K的程序上……蛋疼。
  - -好吧,不扯淡了,继续……
  
  下面是对于病毒核心Dll的分析
  ------------------------------------------------------------------------------------------------------------------
  核心Dll中Initiate函数
  
  [color=#0000D0]char[/color] [color=#0000D0]__cdecl[/color] Initiate([color=#0000D0][color=#0000D0]int[/color][/color] a1)
  {
    hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, [color=#808080][color=#808080]"Residented"[/color][/color])[color=#008000];[/color]
    [color=#b000b0][color=#0000D0]if[/color][/color] ( !hMutex || (result = sub_4019A8(v4, ([color=#0000D0][color=#0000D0]int[/color][/color])&v3, 262)) != 0 && v3 < 7u && v3 >= 2u )
      result = ([color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color])SetWindowsHookExA(WH_CALLWNDPROC, ([color=#0000D0]HOOKPROC[/color])AttachHook, *([color=#0000D0]HINSTANCE[/color] *)off_459938[0], 0)[color=#008000];[color=#008000]// 放钩子,咬人[/color][/color]
                                                  [color=#008000]// 全局钩子,注入N多有CALLWNDPROC的进程[/color]
                                                  [color=#008000]// 感谢气泡熊的解答^_^[/color]
    [color=#b000b0][color=#0000D0]if[/color][/color] ( hMutex )
      result = [b][color=#000080][b][color=#000080]CloseHandle[/color][/b][/color][/b](hMutex)[color=#008000];[/color]
    [color=#b000b0][color=#0000D0]if[/color][/color] ( !v8 )
    {
      v7 = 8[color=#008000];[/color]
      v9 = v4[color=#008000];[/color]
      [color=#b000b0][color=#0000D0]if[/color][/color] ( v4 )
      {
        v10 = *(_DWORD *)v9[color=#008000];[/color]
        v7 = 56[color=#008000];[/color]
        result = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__fastcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color]))(*(_DWORD *)v9 - 4))(v9, 3)[color=#008000];[color=#008000]// call    ika1.008FC65C[/color][/color]
                                                  [color=#008000]// CleanUp[/color]
        v7 = 44[color=#008000];[/color]
      }
      [color=#b000b0][color=#0000D0]if[/color][/color] ( !v8 )
        result = v6[color=#008000];[/color]
    }
    [color=#0000D0]return[/color] result[color=#008000];[/color]
  }
  
  0012FCF0   00000004  |HookType = WH_CALLWNDPROC
  0012FCF4   008F1EBC  |Hookproc = [color=#b000b0]offset[/color] ika1.AttachHook
  0012FCF8   008F0000  |hModule = 008F0000 (ika1)
  0012FCFC   00000000  \ThreadID = 0
  

  
  通过以下的流程图可以清楚地看到病毒做坏事的过程

  这里关于InitInfectStruct函数初始化的结构体的数据结构有必要说一下……
  
  008F4944  008F4A14  +0x00 pFileInfo
  008F4948  008F4AA8  +0x04 p?(Size:0xC)
  008F494C  008F2268  +0x08 pSelf
  008F4950  008F4AD0  +0x0C pCurrentFileInfo([color=#0000D0]struct[/color])
  008F4954  008F4B28  +0x10 p?(Size:0x4)
  008F4958  008F4B34  +0x14 pDecodeProc(Size:0xC)
  008F495C  00000000  +0x18 [color=#0000D0]BOOL[/color] bSuccess[color=#008000];[/color]
  008F4960  008F48C8  +0x1C [color=#0000D0]LPSTR[/color] lpInftectFile[color=#008000];[/color]
  008F4964  008F498C  +0x20 p(size:0x84 - Status:inited by 0)
  008F4968  00001800  +0x24 [color=#0000D0]HANDLE[/color] hFile[color=#008000];[color=#008000]//(Infecting)[/color][/color]
  008F496C  00000820  +0x28 [color=#b000b0][color=#0000D0]DWORD[/color][/color] dwFileAttribute[color=#008000];[/color]
  008F4970  6E633000  +0x2C FILETIME CreationTime
  008F4974  01CA9B55
  008F4978  66265278  +0x30 FILETIME LastAccessTime
  008F497C  01CAAD4D
  008F4980  6E633000  +0x34 FILETIME LastWriteTime
  008F4984  01CA9B55
  
  00874863   |.  E8 70420400   [color=#0000D0][color=#0000D0]call[/color][/color]    008B8AD8 [color=#0000D0]new[/color]
  
  0087487D   |.  E8 1EDCFFFF   [color=#0000D0][color=#0000D0]call[/color][/color]    008724A0[color=#008000];initSturct[/color]
  
  __struct DecodeProc{
  }[color=#008000];(Size:0x14)[/color]
  008F476C  008F457C pSelf
  008F4770  00000000
  008F4774  008F477C pDecodeCode
  
  
  
  
  __struct FileInfo{
  }[color=#008000];(Size:0x14)[/color]
  
  008F479C  00000003  +0x00 [color=#b000b0][color=#0000D0]DWORD[/color][/color] dwNumberOfSections[color=#008000];[/color]
  008F47A0  000000D8  +0x04 [color=#b000b0][color=#0000D0]DWORD[/color][/color] e_lfanew[color=#008000];[/color]
  008F47A4  008F46CC  +0x08 pSelf
  008F47A8  008F47B4  +0x0C pNtHeader
  008F47AC  008F4910  +0x10 pIMAGE_SECTION_HEADER
  
  
  
  __struct pCurrentFileInfo{
  }[color=#008000];[/color]
  
  008F4858  008F46CC  +0x00 pSelf
  008F485C  008F4870  +0x04 [color=#0000D0]LPSTR[/color] lpCurrentFilePath[color=#008000];[/color]
  008F4860  000000EC  +0x08 [color=#0000D0]HANDLE[/color] hFile[color=#008000];(CurrentFile)[/color]
  008F4864  0000004A
  008F4868  00000001
  008F486C  00000038
  

  关于多态入口的生成函数、这里分析的比较少。总之就两种指令格式
  
  [color=#0000D0][color=#0000D0]push[/color][/color] imm32
  [color=#0000D0][color=#0000D0]pop[/color][/color] reg32
  

  这是一种、还有
  
  [color=#0000D0][color=#0000D0]mov[/color][/color] reg32,imm32
  

  
  因为所使用的寄存器并不是固定的,前一种可以判断是否是0x68,后一种对应的机器码可以表示为X&0xB0=0xB0,具体参见专杀的代码。
  
  008F477C     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F477D     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F477E     68 90909090     [color=#0000D0][color=#0000D0]push[/color][/color]    90909090
  008F4783     5B              [color=#0000D0][color=#0000D0]pop[/color][/color]     [color=#FF0000][color=#FF0000]ebx[/color][/color]
  008F4784     BF 90909090     [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edi[/color][/color], 90909090
  008F4789     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F478A     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F478B     68 90909090     [color=#0000D0][color=#0000D0]push[/color][/color]    90909090
  008F4790     5E              [color=#0000D0][color=#0000D0]pop[/color][/color]     [color=#FF0000][color=#FF0000]esi[/color][/color]
  008F4791     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F4792     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F4793     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F4794     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F4795     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  008F4796     90              [color=#0000D0][color=#0000D0]nop[/color][/color]
  

  ASM Table
  
  008C4C30    B8 BBB9BABE     [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], BEBAB9BB
  008C4C35    BF E8EBE9EA     [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edi[/color][/color], EAE9EBE8
  008C4C3A    EE              [color=#0000D0][color=#0000D0]out[/color][/color]     [color=#FF0000][color=#FF0000]dx[/color][/color], [color=#FF0000][color=#FF0000]al[/color][/color]
  008C4C3B    EF              [color=#0000D0][color=#0000D0]out[/color][/color]     [color=#FF0000][color=#FF0000]dx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
  

  下面这段是关于GetPEFileInfo函数的一点OD笔记、也可以结合着在IDA里分析出的函数名一起看
  
  00873140   /$  53            [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]ebx[/color][/color]
  00873141   |.  8BD8          [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ebx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
  00873143   |.  8B43 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  00873146   |.  8B4B 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  00873149   |.  0FB750 14     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+14]            [color=#008000];  SizeOfOptionalHeader;[/color]
  0087314D   |.  0FB741 06     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+6]             [color=#008000];  NumberOfSections;[/color]
  00873151   |.  8BC8          [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
  00873153   |.  8B43 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  00873156   |.  C1E1 03       [color=#0000D0][color=#0000D0]shl[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], 3
  00873159   |.  0353 04       [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+4]
  0087315C   |.  8D0C89        [color=#0000D0][color=#0000D0]lea[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+[color=#FF0000][color=#FF0000]ecx[/color][/color]*4]
  0087315F   |.  03D1          [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#FF0000][color=#FF0000]ecx[/color][/color]
  00873161   |.  8B48 54       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+54]           [color=#008000];  SizeOfHeaders;[/color]
  00873164   |.  83C2 18       [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], 18
  00873167   |.  2BCA          [color=#0000D0][color=#0000D0]sub[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]edx[/color][/color]
  00873169   |.  83F9 28       [color=#0000D0][color=#0000D0]cmp[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], 28
  0087316C   |.  73 0E         [color=#0000D0][color=#0000D0]jnb[/color][/color]     [color=#0000D0]short[/color] 0087317C
  0087316E   |.  8B53 08       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8]
  00873171   |.  33C0          [color=#0000D0][color=#0000D0]xor[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
  00873173   |.  C742 18 03000>[color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+18], 3
  0087317A   |.  5B            [color=#0000D0][color=#0000D0]pop[/color][/color]     [color=#FF0000][color=#FF0000]ebx[/color][/color]
  0087317B   |.  C3            [color=#0000D0][color=#0000D0]retn[/color][/color]
  0087317C   |>  8B53 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  0087317F   |.  0FB74A 06     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+6]             [color=#008000];  NumberOfSections;[/color]
  00873183   |.  41            [color=#0000D0][color=#0000D0]inc[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color]
  00873184   |.  8BC1          [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]ecx[/color][/color]
  00873186   |.  C1E0 03       [color=#0000D0][color=#0000D0]shl[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], 3
  00873189   |.  8D0480        [color=#0000D0][color=#0000D0]lea[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+[color=#FF0000][color=#FF0000]eax[/color][/color]*4]
  0087318C   |.  50            [color=#0000D0][color=#0000D0]push[/color][/color]    [color=#FF0000][color=#FF0000]eax[/color][/color]
  0087318D   |.  E8 E65A0400   [color=#0000D0][color=#0000D0]call[/color][/color]    008B8C78
  00873192   |.  59            [color=#0000D0][color=#0000D0]pop[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color]
  00873193   |.  8943 10       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+10], [color=#FF0000][color=#FF0000]eax[/color][/color]
  00873196   |.  8B53 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  00873199   |.  8B43 08       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8]
  0087319C   |.  0FB752 14     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+14]            [color=#008000];  SizeOfOptionalHeader;[/color]
  008731A0   |.  0353 04       [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+4]
  008731A3   |.  83C2 18       [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], 18
  008731A6   |.  E8 39F7FFFF   [color=#0000D0][color=#0000D0]call[/color][/color]    008728E4
  008731AB   |.  8B4B 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  008731AE   |.  8B53 10       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+10]
  008731B1   |.  0FB741 06     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+6]
  008731B5   |.  8BC8          [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
  008731B7   |.  8B43 08       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8]
  008731BA   |.  C1E1 03       [color=#0000D0][color=#0000D0]shl[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], 3
  008731BD   |.  8D0C89        [color=#0000D0][color=#0000D0]lea[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+[color=#FF0000][color=#FF0000]ecx[/color][/color]*4]        [color=#008000];  读取节表[/color]
  008731C0   |.  E8 2FF7FFFF   [color=#0000D0][color=#0000D0]call[/color][/color]    008728F4
  008731C5   |.  8B53 08       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8]
  008731C8   |.  B9 28000000   [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]ecx[/color][/color], 28
  008731CD   |.  8B43 08       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8]
  008731D0   |.  8B52 20       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20]
  008731D3   |.  83C2 58       [color=#0000D0][color=#0000D0]add[/color][/color]     [color=#FF0000][color=#FF0000]edx[/color][/color], 58
  008731D6   |.  E8 19F7FFFF   [color=#0000D0][color=#0000D0]call[/color][/color]    008728F4
  008731DB   |.  8B43 0C       [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C]
  008731DE   |.  0FB750 06     [color=#0000D0][color=#0000D0]movzx[/color][/color]   [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+6]
  008731E2   |.  8913          [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]], [color=#FF0000][color=#FF0000]edx[/color][/color]
  008731E4   |.  B0 01         [color=#0000D0][color=#0000D0]mov[/color][/color]     [color=#FF0000][color=#FF0000]al[/color][/color], 1
  008731E6   |.  5B            [color=#0000D0][color=#0000D0]pop[/color][/color]     [color=#FF0000][color=#FF0000]ebx[/color][/color]
  008731E7   \.  C3            [color=#0000D0][color=#0000D0]retn[/color][/color]
  

  
  剩下大量的关于核心Dll的分析请参见附件中的idb文件。

  下面的是我写的专杀中用于判断是否感染病毒和进行病毒清除的核心代码
  
  [color=#0000D0]if[/color] (pSH->Name[0]=='.'&&\
  	(pSH->Name[1]-6==pSH->Name[2]-3)&&\
  	(pSH->Name[2]-3==pSH->Name[3])&&\
  	pSH->Name[4]==0x7)
  {
  	[color=#0000D0]CString[/color] [color=#0000D0]str[/color];
  	[color=#0000D0]str[/color].Format([color=#808080]"Infected file found on %s"[/color],sPath);
  	[b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]);
  	pSH= IMAGE_FIRST_SECTION(pNtH);
  	[color=#0000D0]DWORD[/color] dwKey,dwStartAddr;
  	dwStartAddr=rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pNtH->OptionalHeader.AddressOfEntryPoint)+([color=#0000D0]DWORD[/color])lpFile;
  	[color=#0000D0]DWORD[/color] dwEnd;
  	dwEnd=([color=#0000D0]DWORD[/color])lpFile+[b][color=#000080]GetFileSize[/color][/b](hFile,0);
  	[color=#0000D0]for[/color] (dwStartAddr;dwStartAddr<dwEnd;dwStartAddr++)
  	{
  		[color=#0000D0]if[/color]((*(([color=#0000D0]PBYTE[/color])dwStartAddr)&0xB0)==0xB0||*([color=#0000D0]PBYTE[/color])(dwStartAddr)==0x68)
  		{
  			dwKey=*([color=#0000D0]PDWORD[/color])(dwStartAddr+1);
  			[color=#0000D0]break[/color];
  		}
  	}
  	[color=#0000D0]for[/color] (dwStartAddr+=5;dwStartAddr<dwEnd;dwStartAddr++)
  	{
  		[color=#0000D0]if[/color]((*(([color=#0000D0]PBYTE[/color])dwStartAddr)&0xB0)==0xB0||*([color=#0000D0]PBYTE[/color])(dwStartAddr)==0x68)[color=#008000]//mov edx,XXor push..[/color]
  		{
  			dwStartAddr=rva2raw(pNtH->FileHeader.NumberOfSections, pSH, *([color=#0000D0]PDWORD[/color])(dwStartAddr+1)-pNtH->OptionalHeader.ImageBase)+([color=#0000D0]DWORD[/color])lpFile;
  			[color=#0000D0]break[/color];
  		}
  	}
  	[color=#0000D0]DWORD[/color] oep,imp1,imp2;
  	oep=dwStartAddr+0x10;
  	imp1=dwStartAddr+0x28;
  	imp2=dwStartAddr+0x2C;
  	oep=(*([color=#0000D0]PDWORD[/color])oep)^dwKey;
  	imp1=(*([color=#0000D0]PDWORD[/color])imp1)^dwKey;
  	imp1=[color=#008000]/*rva2raw(pNtH->FileHeader.NumberOfSections, pSH,*/[/color] imp1-pNtH->OptionalHeader.ImageBase;[color=#008000]//);[/color]
  	imp2=(*([color=#0000D0]PDWORD[/color])imp2)^dwKey;
  	imp2=[color=#008000]/*rva2raw(pNtH->FileHeader.NumberOfSections, pSH,*/[/color] imp2-pNtH->OptionalHeader.ImageBase;[color=#008000]//);[/color]
  	[color=#0000D0]str[/color].Format([color=#808080]"OEP RVA found at: 0x%.8X"[/color],oep);
  	[b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]);
  	[color=#0000D0]str[/color].Format([color=#808080]"First API name swap RVA found at : 0x%.8X\n"[/color],imp1);
  	[b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]);
  	[color=#0000D0]str[/color].Format([color=#808080]"Second API name swap RVA found at : 0x%.8X\n"[/color],imp2);
  	[b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]);
  	pImportDescriptor=(PIMAGE_IMPORT_DESCRIPTOR)(([color=#0000D0]DWORD[/color])lpFile+ rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pNtH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
  	[color=#0000D0]while[/color](pImportDescriptor->FirstThunk)
  	{
  		[color=#0000D0]char[/color]* dllname = ([color=#0000D0]char[/color]*)(([color=#0000D0]DWORD[/color])lpFile + rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pImportDescriptor->Name));
  		[color=#0000D0]if[/color] (!stricmp(dllname,[color=#808080]"kernel32.dll"[/color]))
  		{
  			pThunkData = (PIMAGE_THUNK_DATA)(([color=#0000D0]DWORD[/color])lpFile+ rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pImportDescriptor->OriginalFirstThunk));
  			pThunkData->u1.Function = imp1-2;
  			pThunkData++;
  			pThunkData->u1.Function = imp2-2;
  			[color=#0000D0]break[/color];
  		}
  		[color=#0000D0]else[/color]
  			pImportDescriptor++;
  	}
  	pNtH->OptionalHeader.AddressOfEntryPoint=oep;
  	pSH= IMAGE_FIRST_SECTION(pNtH)+pNtH->FileHeader.NumberOfSections-1;
  	dwSection=pSH->PointerToRawData;
  	[color=#FF0000]memset[/color](pSH,0,[color=#0000D0]sizeof[/color](PIMAGE_SECTION_HEADER));
  	pNtH->FileHeader.NumberOfSections--;
  	pNtH->OptionalHeader.SizeOfImage-=0x1000;
  	cntVirus++;
  	memcpy(pNewBuf,([color=#0000D0]PCHAR[/color])lpFile+dwSection-4,4);
  }
  

  完全代码请参见附件中的ResidentKiller源代码。
  
--------------------------------------------------------------------------------
【经验总结】
  我给这个病毒起个名字好了,综合网上查到的资料和各大杀毒引擎的结果,给这个病毒命名为Worm.Parite.Residented
  VirusTotal扫描结果
  http://www.virustotal.com/zh-cn/analisis/47bd590e99bee93bb0b46d7b74d60da3c931b8115122a4b450045591ea366399-1280672787

  - -专杀的源码写的太挫了,大家就凑合着看吧、第一次在实战中应用dfs和bfs……应该算是吧……反正是学病毒里遍历磁盘的方法

  非常感谢气泡熊的解答、还有师傅。
附件目录以及Hash


  附件外链:http://fs.unpack.cn/?fs=26&u=145
  病毒的主体思路:首先由感染病毒的文件中的Loader释放病毒Dll并调用Initiate函数,然后注入全局钩子,其中Explorer会在装载Dll时发动一个新的线程去做坏事、这样即使钩子卸掉了,病毒还是可以存活在Explorer中。然后分出来的线程负责感染硬盘exe和src文件、
  
  终于做完专杀了……时间2010.7.31.21:59
  
  专杀思路:UnHook掉所有类型为CALLWND的钩子,因为如果感染病毒的进程运行的话,很多的进程都会因为它的钩子而插入一个Dll,这样将导致病毒核心Dll无法被清除,然后结束掉两个有CALLWND的进程,这两个程序的Dll是没有办法用UnHook卸掉的、只能干掉。bfsFile一次搜索8个文件,避免CPU过高被发现,然后慢慢感染……
  
  - -花了1天而已……开发速度已经比以前有了飞跃式的进展……当然以前也没有一次搞过这么长时间编程。
  病毒分析告一段落了,反正专杀都做出来了,- -剩下的代码分析的太详细了反而不是很好。
  第一次在实战中应用bfs和dfs啊……应该算是吧、
  拖了这么长时间啊……- -真是太对不起你了,电脑啊……今天才给你复仇啊……
  附件里有3个样本,一个是病毒的核心Dll,一个是经过原版(- -实际上我后来发现我只留了个解压缩过的Dll,原版已经找不到了,不过一样分析……哈哈~)Dll感染过的DeathStartup,一个是经过改良的(因为原版感染速度实在太糟糕了,bfsFile的时候8个文件中间就要隔N长时间。懒得等的同学可以使用第二个附件,No_Delay版本……)不这个版本对硬盘不是很友好的说……
  
  就这样吧……皆さん、頑張つてください
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年08月04日
                                                           Azure[LCG]

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞6
打赏
分享
最新回复 (10)
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jasonzhou 2010-8-5 10:28
2
0
有史以来看过的最生动的技术帖子。赞。。。
雪    币: 695
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
patapon 4 2010-8-5 11:28
3
0
杨家塘师傅收我为徒吧
雪    币: 1379
活跃值: (703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hmilywen 2010-8-5 12:30
4
0
赞,我喜欢图...
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 2010-8-8 08:32
5
0
我也中过大部分软件重新装 学习了
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
webwizard 2010-8-17 04:52
6
0
佩服LZ。
从哪里跌倒,就从哪里爬起来!
雪    币: 29414
活跃值: (18620)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2010-8-17 09:25
7
0
才看到此帖,补上精华。
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 8 2010-8-17 09:32
8
0
膜拜未成年的yangjt牛
雪    币: 8861
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-8-17 17:03
9
0
好老的名字...
是新变种?
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haner 2010-8-18 04:37
10
0
太牛了 佩服啊
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Greater 2010-8-25 16:36
11
0
这个必须顶起  楼主好牛逼啊
我佩服
游客
登录 | 注册 方可回帖
返回