1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          createthread函數詳解_createremotethread

          來源:互聯網轉載 時間:2023-12-14 14:27:46

          CreateRemoteThread和WriteProcessMemory技術

          示例程序:WinSpy

          另一種注入代碼到其他進程地址空間的方法是使用WriteProcessMemory API。這次你不用編寫一個獨立的DLL而是直接復制你的代碼到遠程進程(WriteProcessMemory)并用CreateRemoteThread執行之。

          讓我們看一下CreateRemoteThread的聲明:

          HANDLECreateRemoteThread(
          HANDLEhProcess,
          //
          handletoprocesstocreatethreadin


          LPSECURITY_ATTRIBUTESlpThreadAttributes,
          //
          pointertosecurity

          //
          attributes


          DWORDdwStackSize,
          //
          initialthreadstacksize,inbytes


          LPTHREAD_START_ROUTINElpStartAddress,
          //
          pointertothread

          //
          function


          LPVOIDlpParameter,
          //
          argumentfornewthread


          DWORDdwCreationFlags,
          //
          creationflags


          LPDWORDlpThreadId
          //
          pointertoreturnedthreadidentifier


          );

          和CreateThread相比,有一下不同:
          ●增加了hProcess參數。這是要在其中創建線程的進程的句柄。
          ●CreateRemoteThread的lpStartAddress參數必須指向遠程進程的地址空間中的函數。這個函數必須存在于遠程進程中,所以我們不能簡單地傳遞一個本地ThreadFucn的地址,我們必須把代碼復制到遠程進程。
          ●同樣,lpParameter參數指向的數據也必須存在于遠程進程中,我們也必須復制它。

          現在,我們總結一下使用該技術的步驟:
          1. 得到遠程進程的HANDLE(OpenProcess)。
          2. 在遠程進程中為要注入的數據分配內存(VirtualAllocEx)、
          3. 把初始化后的INJDATA結構復制到分配的內存中(WriteProcessMemory)。
          4. 在遠程進程中為要注入的數據分配內存(VirtualAllocEx)。
          5. 把ThreadFunc復制到分配的內存中(WriteProcessMemory)。
          6. 用CreateRemoteThread啟動遠程的ThreadFunc。
          7. 等待遠程線程的結束(WaitForSingleObject)。
          8. 從遠程進程取回指執行結果(ReadProcessMemory 或 GetExitCodeThread)。
          9. 釋放第2、4步分配的內存(VirtualFreeEx)。
          10. 關閉第6、1步打開打開的句柄。

          另外,編寫ThreadFunc時必須遵守以下規則:
          1. ThreadFunc不能調用除kernel32.dll和user32.dll之外動態庫中的API函數。只有kernel32.dll和user32.dll(如果被加載)可以保證在本地和目的進程中的加載地址是一樣的。(注意:user32并不一定被所有的Win32進程加載?。﹨⒖几戒汚。如果你需要調用其他庫中的函數,在注入的代碼中使用LoadLibrary和GetProcessAddress強制加載。如果由于某種原因,你需要的動態庫已經被映射進了目的進程,你也可以使用GetMoudleHandle代替LoadLibrary。同樣,如果你想在ThreadFunc中調用你自己的函數,那么就分別復制這些函數到遠程進程并通過INJDATA把地址提供給ThreadFunc。

          2. 不要使用static字符串。把所有的字符串提供INJDATA傳遞。為什么?編譯器會把所有的靜態字符串放在可執行文件的“.data”段,而僅僅在代碼中保留它們的引用(即指針)。這樣,遠程進程中的ThreadFunc就會執行不存在的內存數據(至少沒有在它自己的內存空間中)。

          3. 去掉編譯器的/GZ編譯選項。這個選項是默認的(看附錄B)。
          4. 要么把ThreadFunc和AfterThreadFunc聲明為static,要么關閉編譯器的“增量連接(incremental linking)”(看附錄C)。
          5. ThreadFunc中的局部變量總大小必須小于4k字節(看附錄D)。注意,當degug編譯時,這4k中大約有10個字節會被事先占用。
          6. 如果有多于3tch分支的case語句,必須像下面這樣分割開,或用if-else if代替.

          case constant1: statement1; goto END;
          case constant2: statement2; goto END;
          case constant3: statement2; goto END;
          }

          case constant4: statement4; goto END;
          case constant5: statement5; goto END;
          case constant6: statement6; goto END;
          }
          END:

          =====簡單的CreateRemoteThread例程-初學者必看

          //
          _remotethreaddemo.cpp:Definestheentrypointfortheconsoleapplication.

          //
          Author:秋鎮菜



          #include

          stdafx.h


          #include

          windows.h


          //
          ==========定義一個代碼結構,本例為一個對話框============


          struct
          MyData
          {


          char
          sz[
          64
          ];
          //
          對話框顯示內容


          DWORDdwMessageBox;
          //
          對話框的地址


          };


          //
          ==========遠程線程的函數==============================


          DWORD__stdcallRMTFunc(MyData
          *
          pData)
          {

          typedef
          int
          (__stdcall
          *
          MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
          MMessageBoxMsgBox
          =
          (MMessageBox)pData
          ->
          dwMessageBox;
          MsgBox(NULL,pData
          ->
          sz,NULL,MB_OK);

          return

          0
          ;
          }

          int
          main(
          int
          argc,
          char
          *
          argv[])
          {


          //
          =====獲得需要創建REMOTETHREAD的進程句柄===============================


          HWNDhWnd
          =
          FindWindow(

          notepad

          ,NULL);
          //
          以NOTEPAD為例


          DWORDdwProcessId;
          ::GetWindowThreadProcessId(hWnd,
          &
          dwProcessId);
          HANDLEhProcess
          =
          OpenProcess(
          PROCESS_ALL_ACCESS,
          FALSE,
          dwProcessId);


          //
          =========代碼結構================================================


          MyDatadata;
          ZeroMemory(
          &
          data,
          sizeof
          (MyData));
          strcat(data.sz,

          對話框的內容.

          );
          HINSTANCEhUser
          =
          LoadLibrary(

          user32.dll

          );

          if
          (
          !
          hUser)
          {

          printf(

          Cannotloadlibrary.

          );

          return

          0
          ;
          }
          data.dwMessageBox
          =
          (DWORD)GetProcAddress(hUser,

          MessageBoxA

          );
          FreeLibrary(hUser);

          if
          (
          !
          data.dwMessageBox)

          return

          0
          ;


          //
          =======分配空間===================================================



          void

          *
          pRemoteThread

          =
          VirtualAllocEx(hProcess,
          0
          ,

          1024
          *
          4
          ,MEM_COMMIT
          |
          MEM_RESERVE,
          PAGE_EXECUTE_READWRITE);

          if
          (
          !
          pRemoteThread)

          return

          0
          ;

          if
          (
          !
          WriteProcessMemory(hProcess,pRemoteThread,
          &
          RMTFunc,
          1024
          *
          4
          ,
          0
          ))

          return

          0
          ;

          MyData
          *
          pData

          =
          (MyData
          *
          )VirtualAllocEx(hProcess,
          0
          ,

          sizeof
          (MyData),MEM_COMMIT,
          PAGE_READWRITE);

          if
          (
          !
          pData)

          return

          0
          ;


          if
          (
          !
          WriteProcessMemory(hProcess,pData,
          &
          data,
          sizeof
          (MyData),
          0
          ))

          return

          0
          ;


          //
          ===========創建遠程線程===========================================


          HANDLEhThread

          =
          CreateRemoteThread(hProcess,
          0
          ,

          0
          ,(LPTHREAD_START_ROUTINE)pRemoteThread,
          pData,
          0
          ,
          0
          );

          if
          (
          !
          hThread)
          {

          printf(

          遠程線程創建失敗

          );

          return

          0
          ;
          }
          CloseHandle(hThread);
          VirtualFreeEx(hProcess,pRemoteThread,
          1024
          *
          3
          ,MEM_RELEASE);
          VirtualFreeEx(hProcess,pData,
          sizeof
          (MyData),MEM_RELEASE);
          CloseHandle(hProcess);
          printf(

          HelloWorld!

          );

          return

          0
          ;
          }

          zhuangyu1982@hotmail.com:我用你的程序在windowsxp下運行,彈出messagebox之后,只要點擊確定宿主進程就會崩潰。
          而且不止是messagebox,調用其它的api函數也是一樣,請問這是什么原因?有什么辦法可以解決嗎?

          ——————————————————–

          編譯成RELEASE版本就不會出錯了,主要是DEBUG版本加了一個__chkesp的函數導致調用了非法地址

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          石家莊經貿大學屬于哪個區?石家莊經貿大學屬于新華區。位于學院路的經貿大學創建于1982年,占地268畝。有16個學院(系),76個本科專業,21580名學生。石家莊經貿大學屬于哪個區?河北經貿大學新華區是新華區學府路上的第二所學校。學校環境不錯,學校坐北朝南,師資力量雄厚,培養了很多金融人才!河北石家莊經貿大學是985還是211?石家莊經貿大學既不是985也不是211。是一所普通大學。河北經貿大學...

          OPPOa115與a115k的區別?A115K是A115的升級版,功能和java運行能力都強很多。比如火星文的輸入和顯示,手機內置的QQ2010*/QQ瀏覽器,圖片編輯器,后臺運行Java時支持播放音樂,軟件在線升級,最新固件和搜狗輸入法的集成等等都是A115沒有的。如何區分A115和A115K:手機型號一般會在電池倉或者后蓋上注明。去看看吧。此外,還可以在待機狀態下輸入*#6776#查看手機的所...

          電影《不明身份》到底男主角是什么身份?馬丁哈里斯根本不存在。利亞姆·尼森扮演的那個人是一個殺手組織的成員。為了讓生命科學家掌握這些信息,殺手組織安排了一個計劃:編造一個名叫馬丁·哈里斯的科學家,他與塞巴斯蒂安·科奇扮演的生命科學家關系密切(對不起,我記不起名字)。艾丹·奎恩飾演的馬丁·哈里斯2號原本是一個后備計劃,以防止利亞姆·尼森發生任何事情。但是利亞姆·尼森出了車禍,完全忘記了自己的真實身份,...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>