關於執行緒插入函式如何用的問題

weixin_34377065發表於2008-09-23
關於執行緒插入函式如何用的問題 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061207182656107.html
我現在掌握了不用dll也能程式碼注入的技術  
   
  就是有一個inject函式   把要插入程式的控制程式碼和要插入的函式名前加一個"@"  
  當作引數傳遞過去就行了,如下:  
  procedure   Inject(ProcessHandle:   longword;   EntryPoint:   pointer);  
   
  本來是很好用的  
   
  但是我這裡有一份帶窗體的程式的程式碼     想讓它插到某個pid裡  
  原來的dpr檔案是這樣的:  
   
  program   server;  
   
  uses  
        Forms,  
      mainserve   in   'mainserve.pas'   {ServerForm};  
   
  begin  
      Application.Initialize;  
      Application.CreateForm(TServerForm,   ServerForm);  
      Application.Run;  
  end.  
   
  我改成了:  
   
  program   server;  
   
  uses  
        Forms,windows,  
      mainserve   in   'mainserve.pas'   {ServerForm};  
   
  procedure   main();  
   
  begin  
      Application.Initialize;  
      Application.CreateForm(TServerForm,   ServerForm);  
      Application.Run;  
  end;  
   
   
  var  
  ProcessHandle,   PID:   longword;  
   
  begin  
   
  PID:=1252;//當前我執行的某個IE的PID  
  ProcessHandle   :=   OpenProcess(PROCESS_ALL_ACCESS,   False,   PID);//開啟程式  
  Inject(ProcessHandle,   @Main);//插入程式碼  
  CloseHandle(ProcessHandle);//關閉執行緒控制程式碼  
  end.  
   
   
   
  那個mainserve.pas沒作改動  
   
  編譯沒錯       一執行就出錯說   某個記憶體引用的某個記憶體不能為writen   結果IE就關了  
   
   
  我的改動並沒錯呀??  
   
  我懷疑這個錯誤和程式裡有窗體有關       但是用到了timer     是不是就不能去掉窗體??  
   
  我的懷疑正確嗎????  
 

說明一下       我修改時已把inject的定義加上了       只是上面的程式碼沒體現出來

不用DLL   注入   的方法我也想知道哦..  
  aphex的不用DLL遠端注入是  
  GetWindowThreadProcessId(FindWindow('Shell_TrayWnd',   nil),   @Pid);  
  //獲取Exp程式的PID碼,Shell_TrayWnd為類名,相關的需用SPY++來檢視  
   
  ProcessHandle   :=   OpenProcess(PROCESS_ALL_ACCESS,   False,   Pid);   //開啟程式  
   
  hModule   :=   Pointer(GetModuleHandle(nil));  
  //這裡得到的值為一個返回一個指標型變數,指向內容包括自身映像的基址和長度  
   
  Extent   :=   PImageOptionalHeader(Pointer(integer(hModule)   +   PImageDosHeader(hModule)._lfanew   +   SizeOf(dword)   +   SizeOf(TImageFileHeader))).SizeOfImage;  
  //得到記憶體映像的長度  
   
  VirtualFreeEx(ProcessHandle,   hModule,   0,   MEM_RELEASE);  
  //在Exp程式的記憶體範圍內分配一個足夠長度的記憶體  
   
  hModule_News   :=   VirtualAllocEx(ProcessHandle,   hModule,   Extent,   MEM_COMMIT   or   MEM_RESERVE,   PAGE_EXECUTE_READWRITE);  
  //確定起始基址和記憶體映像基址的位置  
   
  WriteProcessMemory(ProcessHandle,   hModule_News,   hModule,   Extent,   Size);  
  //確定上面各項資料後,這裡開始進行操作  
   
  CreateRemoteThread(ProcessHandle,   nil,   0,   @Download,   hModule,   0,   ThreadId);  
  //建立遠端執行緒,至此注入過程完成  
   
  CloseHandle(ProcessHandle);  
   
   
  偶把我的程式定義成個過程   然後用他這樣的方法去注入.   結果跟LX一樣...    
  高手詳細說下吧..  
 

樓上的是同道中人  
   
  實際上我們插入一個小過程可以成功     哪怕這個過程呼叫其它自定義的過程  
   
  但是把一個程式的原始碼裡dpr檔案裡的主程式定義為過程   再插入這個過程就會報錯  
   
  因為什麼??

請高手現身

關注

請高手獻身

請高手獻身

人工置頂

還沒有人來麼?  
  我現在也有段程式碼   他定義的過程注入沒問題..我自己寫個過程   注入都出錯.     鬱悶

人工置頂

人工置頂

相關文章