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

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

2007-3-16 23:59
14588

【文章标题】: 被已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楼~~~~~~~~~


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

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

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

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

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

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

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


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必是错误用法
2007-4-26 21:35
0
雪    币: 207
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
不好意思,是我马虎了
我把代码改成:
pPe = ((DWORD*)((char*)pAdd + 0x3c));
pPe = (DWORD*)((char*)pAdd + *pPe);

调试了
2007-4-26 23:30
0
游客
登录 | 注册 方可回帖
返回
//