這個貌似比代碼注入高級一點,原理一樣,只是廣泛不同 首先說下我是怎樣不用DLL注入也可以CALL游戲里的函數(shù)吧. 其實我是用過程注入的.意思是說我將要CALL的游戲函數(shù)寫到一個過程里.然后在目標(biāo)進程中建立一個內(nèi)存空間,把我寫的過程的注入到該空間里.具體怎么做呢?我就用我的程序里的一個小功能來做個介紹吧! 就用完美國際的角色死亡回城的CALL來說明,下面是代碼及說明: //過程注入函數(shù) function TForm1.FunIn(Hid:cardinal;FunName:pointer):cardinal; var {要注入線程的窗口句柄和臨時存放的句柄} TmpHandle: THandle; ThreadID: Thandle; ThreadAdd:pointer; WriteCount: DWORD; begin ThreadAdd := VirtualAllocEx(Hid, nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//在目標(biāo)進程建立內(nèi)存空間 WriteProcessMemory(Hid, ThreadAdd,FunName, 4096, WriteCount);//將要注入的過程寫到上面建立的內(nèi)存空間中 TmpHandle := CreateRemoteThread(Hid, nil, 0, ThreadAdd, nil, CREATE_SUSPENDED, ThreadID);//獲得注入后過程的句柄ID result:=TmpHandle;//返回句柄ID end; //游戲回城CALL procedure gohome; var Address:pointer; begin Address:=Pointer($005829B0); //函數(shù)入口地址 asm pushad MOV EAX,DWORD PTR DS:[$8F0F7C] MOV EAX,DWORD PTR DS:[EAX+$20] LEA ECX,DWORD PTR DS:[EAX+$EC] CALL Address popad end; end; //調(diào)用 procedure TForm1.Button1Click(Sender: TObject); begin homeAdd:=FunIn(HPro,@gohome);//調(diào)用注入函數(shù) ResumeThread(homeAdd); //運行注入的CALL線程 CloseHandle(homeAdd); //關(guān)閉線程 end; 以上我都寫成這么的詳細(xì)如果還有人說不會那我就沒辦法了. 如果真的不明白的話那就不要用CALL了 |