首页
社区
课程
招聘
被Worm.Win32.Viking.ix搞疯了,马虎写了个东东,分享一下
2007-3-16 23:59 14056

被Worm.Win32.Viking.ix搞疯了,马虎写了个东东,分享一下

2007-3-16 23:59
14056
【文章标题】: 被已Worm.Win32.Viking.ix搞疯了,马虎写了个东东,分享一下
【文章作者】: llydd
【作者邮箱】: llydd@163.com
【下载地址】: 自己搜索下载
【使用工具】: peid,vc++6,winhex
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  前些天突然发现进程里出现些怪进程像Logo1_.exe,rund1l32.exe,iexp1ore.exe之类的,一看就知道不是什么好鸟
  注册表启动项里都出现了那些东东,
  本以为把它们从系统里删除了就不会出现问题了,系统里差不多每个EXE文件都被搞的面目全非了,图标都变没了
  找了个以前写的测试程序用PEID查了一下发现区块名都变成lw0x60,lw0x61之类的,运行一下发现程序半天没反应
  过了一会才运行,突然发现只要运行那些被感染的文件后,被感染的程序会被变成原先被感染的文件,突然想到正
  常程序可能被捆绑到病毒体后才出现这种情况,一旦运行感染后的程序,病毒体会先执行,然后从被感染文件中剥离
  并修改注册表启动项,释放uninstall在c:\winnt\install目录,释放rund1l32.exe在c:\winnt\目录释放Logo1_.exe
  找到这些东东都把它们删了,清除注册表,但每个EXE都被感染了,我总不能每个EXE都运行一遍,让它们恢复正常吧
  装杀毒软件吧,偶的老机子跑不动,AMD K7的老机机了~~~,权当练练手,写的清除工具
  
  #include "windows.h"
  #include "stdio.h"
  #include "string.h"
  int g_Count_File=0;
  
  void list(char *cPath)
  {
          WIN32_FIND_DATA wfd;
          HANDLE hFind;
          char cDir[MAX_PATH];
          char cSubDir[MAX_PATH];
          ::GetCurrentDirectory(sizeof(cDir),cDir);
          ::SetCurrentDirectory(cPath);
          hFind=::FindFirstFile("*.*",&wfd);
          if(hFind==INVALID_HANDLE_VALUE)
          {
                  return ;
          }
          do
          {        //判断是否是目录
                  if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
                  {
                          if(wfd.cFileName[0]!='.')
                          {
                                  //将该目录名与当前路径合并成目录路径
                                  ::wsprintf(cSubDir,"%s\\%s",cPath,wfd.cFileName);
                                  list(cSubDir);
                          }
                         
                 
                  }
                  else
                  {       
                         
                          HANDLE hFile=::CreateFile(
                                                                  wfd.cFileName,
                                                                  GENERIC_READ|GENERIC_WRITE,
                                                                  FILE_SHARE_READ|FILE_SHARE_WRITE,
                                                                  NULL,
                                                                  OPEN_EXISTING,
                                                                  FILE_ATTRIBUTE_NORMAL,
                                                                  NULL);
                         
                          if(hFile==INVALID_HANDLE_VALUE)
                                  continue ;
                                         
                         
                          HANDLE hMap=::CreateFileMapping(
                                                  hFile,
                                                  NULL,
                                                  PAGE_READWRITE,
                                                  0,
                                                  0,
                                                  NULL);
                          void* pAdd=::MapViewOfFile(
                                                  hMap,
                                                  FILE_MAP_ALL_ACCESS,
                                                  0,
                                                  0,
                                                  0);
                          if(hMap==0)
                                  continue ;
                          DWORD *pPe;
                          PIMAGE_SECTION_HEADER pSec;
                          WORD nSecNumber=0;
                          DWORD dNewFileSize=0;
                          DWORD *pNewFile;
                          //判断是否文件首字为'MZ'
                          if(*(WORD*)pAdd==0x5a4d)
                          {
                                  pPe=(DWORD*)*((DWORD*)((char*)pAdd+0x3c));
                                  pPe=(DWORD*)((DWORD)pAdd+(DWORD)pPe);
                                  //获取文件大小,以免得到一些文件首字为'MZ'但偏移3C处的双字段值超出内存映像文件范围
                                  dNewFileSize=::GetFileSize(hFile,&dNewFileSize);
                                  //判断是否'PE\0\0'
                                  if ((DWORD)pPe<=((DWORD)pAdd+dNewFileSize)&&*pPe==0x004550)
                                  {
                                         
                                          nSecNumber=*(WORD*)((char*)pPe+6);
                                          pSec=(PIMAGE_SECTION_HEADER)((char*)pPe+248);
                                          //定位到第一个块表,判断其区名是否为lw0x60若是则被感染
                                          if (strcmp((const char*)(pSec->Name),"lw0x60")==0)
                                          {
                                                  //定位到最后一个区块
                                                  for(unsigned int i=1;i<nSecNumber;i++)
                                                  {
                                                          pSec=(PIMAGE_SECTION_HEADER)((char*)pSec+40);
                                                  }
                                                  //原文件大小为感染后的文件大小减去病毒体大小后的值
                                                  dNewFileSize=dNewFileSize-(pSec->PointerToRawData+pSec->SizeOfRawData);
                                                  pNewFile=(DWORD*)(pSec->SizeOfRawData+pSec->PointerToRawData+(char*)pAdd);
                                                  char *temp1,*temp2;
                                                  temp1=(char*)pAdd;
                                                  temp2=(char*)pNewFile;
                                                  //将原文件数据依次移到感染后文件的头部,以还原原文件
                                                  for (i=0;i<dNewFileSize;i++)
                                                  {
                                                          *(temp1++)=*(temp2++);
                                                  }
                                                  ::FlushViewOfFile(pAdd,dNewFileSize);
                                                  ::UnmapViewOfFile(pAdd);
                                                  ::CloseHandle(hMap);
                                                  //修改文件大小
                                                  ::SetFilePointer(hFile,dNewFileSize,NULL,FILE_BEGIN);
                                                  ::SetEndOfFile(hFile);
                                                  g_Count_File++;
                                                  printf("%s\t被清除\n",wfd.cFileName);
                                                 
  
                                          }
  
                                  }
  
                          }
                          ::UnmapViewOfFile(pAdd);
                          ::CloseHandle(hMap);
                          ::CloseHandle(hFile);
                         
                         
  
                  }
         
          }
          while(::FindNextFile(hFind,&wfd)!=0);
          ::SetCurrentDirectory(cDir);
         
  }
  
  void main()
  {
          char cDrive[4]="A:\\";
          char* p=cDrive;
          UINT uDriveType;
          for(;*p<='Z';(*p)++)
          {
                  uDriveType=::GetDriveType(cDrive);
                  if(uDriveType==DRIVE_REMOVABLE||uDriveType==DRIVE_FIXED)
                  {
                          list(cDrive);
                  }
          }
  
          printf("共%d个文件被感染\n",g_Count_File);
          system("pause");
  }
  
  清除工具只能清除区块名为lw0x60之类的Win32.Viking.ix病毒,具体的分析小菜菜只能弄到这里,见笑了
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年03月16日 下午 11:59:43

附件在11楼~~~~~~~~~

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (27)
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
llydd 9 2007-3-17 00:03
2
0
我传上来病毒样本和被感染后的文件
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qandzjl 2007-3-17 17:16
3
0
小强`````
雪    币: 441
活跃值: (149)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
rockhard 4 2007-3-17 18:07
4
0
学习并MARK一下,哪天说不定用得着楼主的工具
雪    币: 236
活跃值: (11)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
sdzbyy 5 2007-3-17 20:05
5
0
学习了~
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2007-3-17 22:34
6
0
型号我运行未知程序都在user用户下执行
加上目前换了Vista。一切都是那么的安静
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
zhaoocn 7 2007-3-18 19:57
7
0
那个病毒很是烦人
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
binbinbin 28 2007-3-19 09:47
8
0
威金病毒。变下图标,有点熊猫的感觉
by the way。good program
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnxyy 2007-3-20 12:53
9
0
附件损坏了,不能下载?
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
progray 2007-3-22 21:03
10
0
老大,请检查附件,每次下载后是0字节,谢谢。
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
llydd 9 2007-3-22 21:38
11
0
怎么上传上去的东西下载后老是0KB
我把附件传到http://llydd.ys168.com上去了
雪    币: 8020
活跃值: (3177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ldljlzw 2007-3-22 22:04
12
0
写得好,早点搞好附件!
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qq7119 2007-3-23 19:04
13
0
楼主 顺手 帮编译 个 成品
拿到公司去  试试
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mengtian 2007-3-24 23:06
14
0
学习了,如何用呢?
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
林海雪原 6 2007-3-25 12:04
15
0
威金病毒。。。。我中了的,好烦。。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fpluto 2007-3-27 17:12
16
0
熊猫就是维金的变种,好象就算是用LZ的方法来清病毒也不太完全吧,还有就是维金对某些驱程有破坏作用,特别是打印驱程
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
alexmayer 2007-4-4 10:38
17
0
支持楼主,谢谢,学习中……
雪    币: 425
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Genius 2007-4-7 11:14
18
0
思路清晰,写的程序也很流畅,作者的编程功底很强呀
雪    币: 268
活跃值: (10)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
三根火柴 4 2007-4-13 17:19
19
0
程序中有点看不懂,哪位能给解释一下这两句:
dNewFileSize=dNewFileSize-(pSec->PointerToRawData+pSec->SizeOfRawData);
pNewFile=(DWORD*)(pSec->SizeOfRawData+pSec->PointerToRawData+(char*)pAdd);
是不是最后一个节就是病毒所在的节?
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
llydd 9 2007-4-13 18:06
20
0
dNewFileSize=dNewFileSize-(pSec->PointerToRawData+pSec->SizeOfRawData);
pNewFile=(DWORD*)(pSec->SizeOfRawData+pSec->PointerToRawData+(char*)pAdd);
是不是最后一个节就是病毒所在的节?

这是正常文件的大小(用实际文件的大小减去病毒文件的大小)
用PEID查看到的区块信息都是病毒的区块,正常文件被附加到病毒文件的后面!用PEID是查看不到正常文件的区块信息的的,
雪    币: 268
活跃值: (10)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
三根火柴 4 2007-4-13 19:10
21
0
谢谢楼主热心解答好像有点明白了,我还以为是病毒体附加到了最后的节
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
binglan212 2007-4-25 20:28
22
0
楼主真强,用你的东西,恢复了好多重要的exe 文件,这里先谢谢了。

  if (strcmp((const char*)(pSec->Name),"lw0x60")==0)

我中的viking 不是 lw0x60  而是 df7r0 ,不过一样可以用。

*******************

附件不能下载估计是服务器上有杀毒软件,你一上传就当成病毒 杀掉了!所以是0字节

************************
雪    币: 207
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dragonyjd 1 2007-4-26 20:41
23
0
请教楼主,我调试了一下楼主的代码,我感觉pPe=(DWORD*)((DWORD)pAdd+(DWORD)pPe);是不是应该改为:pPe = (DWORD*)((DWORD)pAdd + *pPe);阿?
我用楼上的代码到不到'PE\0\0'头。
基地址+e_lfanew
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
llydd 9 2007-4-26 21:35
24
0
自已感觉代码风格不是很好


pPe=(DWORD*)((DWORD)pAdd+(DWORD)pPe);是不是应该改为:pPe = (DWORD*)((DWORD)pAdd + *pPe);阿?


          pPe=(DWORD*)*((DWORD*)((char*)pAdd+0x3c));
执行之后pPe就存放的是该PE文件的IMAGE_NT_HEADERS结构的RVA
(DWORD*)((DWORD)pAdd+(DWORD)pPe)后便可在去判断是否PE是标志
若是你*pPe的话搞不好就内存访问异常了,而且*pPe必是错误用法
雪    币: 207
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dragonyjd 1 2007-4-26 23:30
25
0
不好意思,是我马虎了
我把代码改成:
pPe = ((DWORD*)((char*)pAdd + 0x3c));
pPe = (DWORD*)((char*)pAdd + *pPe);

调试了
游客
登录 | 注册 方可回帖
返回