青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

聚星亭

吾笨笨且懶散兮 急須改之而奮進
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    【前言】
        夜里失眠,到這個論壇上泡,發現這個編程版塊不是很正規,因為我認為的好的編程版塊應該是以討論分享及解決具體問題而存在的,而不是想咱論壇這樣:
救助的問題不明確,分享就是單純的分享源碼,分享XX成品之類……

    【廢話】
          前幾天研究外掛了,就我這點破水平,脫機啊,封包掛啊之類的與我無緣了,只能做做內掛,滿足一下自己的虛榮心……
     這里大概的給大家分享一下做內掛編程方面的知識,高手飄過,跟我一樣菜的朋友多多提出您的寶貴意見,相互學習、共勉!!!
     當然了,也希望這篇文章能騙個精華之類的東東,作為我炫耀的資本~~~~
     內掛,其實不難的,這里主要分享遠程線程注入相關的東西,至于其它什么游戲找CALL,功能CALL調用相關的東西,可以參考一下我寫的:
     賺取權限第三貼,一個有意思的keygenMe的逆向分析
          其實道理都是相同的,當然,如果您非常想要了解相關的東西,請參考別人大牛寫的文章,這里不做詳細討論。

     【基礎】
      我理解的遠程線程注入,包括注入代碼,注入DLL分為這兩種(如果有不對的地方希望指正,謝謝),注入DLL就不多廢話了,就是把DLL及所在目錄的名字一些通過寫內存的API寫到目標進程中,我今天主要討論的是向目標進程寫代碼,是獲取目標進程的句柄的方法有很多的,比如創建進程鏡像,然后遍歷進程,再如通過遍歷窗口標題,類名之類得到窗口句柄,然后在由窗口句柄得到進程的句柄,這里只舉最常用到的通過窗口名的方法,至于遍歷進程的方法有很多的,您可以百度一下就能找到……
void CZHGameDlg::OnShuaxin() 
{
        
//載入游戲
        DWORD dwZHThreadId;
        DWORD dwZHProcessId;
        HWND hZHWnd;
        DWORD BASE;
        
char tmpName[65];
        
int i = 0;
        CString sClassName
= "";


        hZHWnd 
= ::FindWindow("縱橫時空",NULL);
        UpdateData(TRUE);
        m_nChioceGM.ResetContent(); 
        
if(hZHWnd != NULL)
        {
                
while(hZHWnd > 0)
                {
                        
if(i >=5)
                        {
                                ::AfxMessageBox(
"因掛機效率考慮,本掛最多可以控制5個角色!請關閉一些角色然后點刷新按鈕!");
                                
break;
                        }
                        
int hFunc=GetClassName(hZHWnd,sClassName.GetBuffer(0),2000);
                        
if(hFunc != 0 && 0 <= sClassName.Find("縱橫時空"))
                        {
                                
if( dwZHThreadId = ::GetWindowThreadProcessId(hZHWnd, &dwZHProcessId))
                                {
                                        
try
                                        {
                                                m_hZHProcess 
= ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwZHProcessId+1);
                                                
if(m_hZHProcess != NULL) 
                                                {
                                                        ReadProcessMemory(m_hZHProcess,(LPVOID)ZH_BASE_ADDR,
&BASE,4,NULL); 
                                                        ReadProcessMemory(m_hZHProcess,(LPVOID)(BASE
+0xAC),tmpName,20,NULL); 

                                                        ProcName[i].Name 
= tmpName;
                                                        ProcName[i].hZHhwnd 
= hZHWnd;
                                                        ProcName[i].hZHProcess 
= m_hZHProcess;
                                                        
if0> m_nChioceGM.FindStringExact(0,ProcName[i].Name))
                                                        m_nChioceGM.AddString(ProcName[i].Name);

                                                        SetDlgItemText(IDC_TISHI,
"提示: 遍歷游戲角色完畢,請選擇游戲角色");

                                                        i
++;
                                                        UpdateData(FALSE);
                                                }
                                          }
catch()
                                          {
                                                ::AfxMessageBox(
"出現未知錯誤");
                                        } 
                                }
                        }

                        hZHWnd 
= ::GetNextWindow(hZHWnd,GW_HWNDNEXT); 
                } 
        }
        
else
        {
                SetDlgItemText(IDC_TISHI,
"提示: 沒有找到游戲窗口,請確認游戲是否已經開啟");
        }
}

這樣我們就可以得到同一個游戲的所有窗口句柄、進程句柄,游戲角色名等信息(這里只以縱橫時空這個游戲來說,由于不同的游戲,游戲數據的存儲用的數據結構各不相同,所以,這個取角色名的位置不能通用!)如果你有其它的方法,歡迎跟帖子分享!


      【內容一:簡單的代碼執行】
       到這里,我們已經得到目標窗口的句柄了,然后接下來就是調用游戲中的函數,讓游戲去執行它,以達到我們的通過程序控制的目的!
      比如,我先要讓我們的程序能夠控制游戲,比如讓我們程序控制的角色簡單的跳一下。假設我們通過分析游戲的代碼,找到,跳,這個動作的代碼如下:
//--------->跳<---------//
DWORD _stdcall JumpA()
{
        DWORD RealAddress,Addr;
        Sell_STR SellParam;

        RealAddress 
= 0x00409C80//真正CALL地址
        Addr = 0x004336F0//加密CALL地址

        _asm
        {
                push 
0
                mov eax, dword ptr [
0x00833C5C//游戲基址
                add eax, 108
                push eax
                lea ecx,SellParam
                call Addr
                push eax
                MOV ecx, 
0x0084B908
                call RealAddress
        }
        
return 0;
}

只要我們能讓游戲順利的執行我們的上述代碼,我們就可以通過傳入不同的參數,來達到拾取物品的目的!
         怎么樣來讓游戲執行這個代碼呢?
         游戲的進程跟我們自己的進程是兩個獨立的實例,自然的,游戲不會跑到我們的進程空間內來執行我們程序的代碼,否則Windows就亂套了~~~,我們要做的,就只有兩步!
         第一步  :  把要讓游戲執行的代碼寫入游戲的進程空間內!
         第二步 : 給游戲進程創建一個線程,讓它執行上述的代碼!

        其實要完成上述的兩步不難的,寫目標進程的API函數是:WriteProcessMemory  ,具體的定義如下:
BOOL WriteProcessMemory(
                HANDLE hProcess, 
// handle to process whose memory is written to
                LPVOID lpBaseAddress,
                
// address to start writing to
                LPVOID lpBuffer, // pointer to buffer to write data to
                DWORD nSize, // number of bytes to write
                LPDWORD lpNumberOfBytesWritten 
                
// actual number of bytes written
);
至于在目標進程創建個線程的API及定義如下:
HANDLE CreateRemoteThread(
                HANDLE hProcess, 
// handle to process to create thread in
                LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes
                DWORD dwStackSize, // initial thread stack size, in bytes
                LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
                LPVOID lpParameter, // argument for new thread
                DWORD dwCreationFlags, // creation flags
                LPDWORD lpThreadId // pointer to returned thread identifier
);
好了,把我寫的一個遠程線程注入代碼的函數貼一下:
void    InjectToProcess(DWORD (*FunName)())
{
        HANDLE TmpHandle;
        DWORD dwThreadId;
        DWORD dwProcessId;

        CString sClassName
= "";

        m_hPwnd 
= ::FindWindow("TForm1","游戲找CALL練習實例one");//得到窗口句柄

        
if(m_hPwnd == NULL)
        {
                MessageBox(
"沒有找到主程序,請先運行主程序");
        }

        
int hFunc=GetClassName(m_hPwnd,sClassName.GetBuffer(0),2000);
        
if(hFunc != 0 && 0 <= sClassName.Find("TForm1"))
        {
                
if( dwThreadId = ::GetWindowThreadProcessId(m_hPwnd, &dwProcessId))
                {
                        m_hProcess 
= ::OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessId);
                        
if(m_hProcess != NULL) 
                        {
                                
//在目標進程建立內存空間 
                                LPVOID ThreadAdd = ::VirtualAllocEx(m_hProcess, NULL,0x1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                                ::WriteProcessMemory(m_hProcess,ThreadAdd ,FunName,
0x1024,NULL); 
                                TmpHandle 
= CreateRemoteThread(m_hProcess, 
                                                                NULL, 
0, (LPTHREAD_START_ROUTINE)ThreadAdd, NULL, 
                                                                
0, NULL);//獲得注入后過程的句柄ID 

                                
if(WaitForSingleObject(TmpHandle,INFINITE) != WAIT_OBJECT_0)
                                {
                                        CString StrTmp;
                                        StrTmp.Format(
"%d",GetLastError());
                                        MessageBox(StrTmp);
                                }
                                CloseHandle(TmpHandle);
                                CloseHandle(m_hProcess);
                                VirtualFreeEx(m_hProcess,ThreadAdd,
0x1024,MEM_RELEASE);
                        }
                }
        }
}

這樣,我們只要在函數里調用:InjectToProcess(JumpA)
就可以搞定了!


      【內容一:關于參數的傳遞】

       其實,絕大多數游戲里的函數都是帶有參數的,遠程線程里參數的傳遞其實也不難的,直接舉個例子吧,希望對卡在這里的朋友有所幫助!
      這里舉自動的拾取物品的例子,比如我們通過對游戲的分析,找到游戲拾取物品的代碼如下:
//--------->撿取物品<---------//_OK
void _stdcall JianWuA(PP1_STR P)
{
        DWORD SendAddr 
= ZH_CALL_SEND;
        DWORD SendEcx 
= ZH_CALL_ECX;
        DWORD Addr 
= ZH_CALL_SHIQU;

        DWORD WuPos;
        DWORD XiangZiID;
        Sell_STR SellParam;

        DWORD Mubiao 
= ZH_SQMUBIAO_ADDR;
        WuPos 
= P->Param1;
        XiangZiID 
= P->Param2;

        _asm
        {
                 push WuPos 
//在物品欄的位置
                push XiangZiID //要拾取的物品的ID
                lea ecx,SellParam
                Call Addr 
//簡單的封包加密
                push eax
                MOV ecx, SendEcx
                call SendAddr 
//發包CALL
                MOV BYTE PTR [Mubiao],0
        }
}

這里需要的參數有兩個,一個是地上箱子的ID,一個是箱子中物品的位置,這里的遠程注入的函數當然也不像上一個函數那么簡單了,我改成了下面的樣子:

      初始化部分:
void CInjectCall::InitPorcess(HANDLE _hProcess)
{
    m_hProcess 
= _hProcess;
    
if(m_hProcess != NULL)  
    {
        
//在目標進程中為函數名創建空間
        ThreadAdd  = ::VirtualAllocEx(m_hProcess, NULL,0x128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        
//在目標進程中為函數名創建空間
        ParamAddr  = ::VirtualAllocEx(m_hProcess, NULL,0x128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        JiNengAddr  
= ::VirtualAllocEx(m_hProcess, NULL,0x128, MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    }
}

      注入部分:
void CInjectCall::InjectFunc(LPVOID pFun, DWORD *Param, DWORD ParamSize)
{
        HANDLE TmpHandle;
        DWORD lpNumberOfBytes;
        
if(m_hProcess != NULL) 
        {
                
// ---- 寫入函數地址
        ::WriteProcessMemory(m_hProcess, ThreadAdd, pFun, 0x128&lpNumberOfBytes); 
                
// ---- 寫入參數地址
        ::WriteProcessMemory(m_hProcess, ParamAddr, Param, ParamSize, &lpNumberOfBytes);

                TmpHandle 
= ::CreateRemoteThread(m_hProcess, 
                                                NULL, 
0, (LPTHREAD_START_ROUTINE)ThreadAdd,
                                                ParamAddr, 
//有參數就寫參數,無參數就為NULL
                                                0&lpNumberOfBytes);//獲得注入后過程的句柄ID 

               ::WaitForSingleObject(TmpHandle,INFINITE);

                ::CloseHandle(TmpHandle);
        }
}
     內存釋放部分:
void CInjectCall::TheEndPorcess()
{
    
if(m_hProcess != NULL)  
    {
        ::VirtualFreeEx(m_hProcess,JiNengAddr,
0x128,MEM_RELEASE);
        ::VirtualFreeEx(m_hProcess,ThreadAdd,
0x128,MEM_RELEASE);
        ::VirtualFreeEx(m_hProcess,ParamAddr,
0x128,MEM_RELEASE);
    }
}

我們調用的方式也就變成了:
void CInjectCall::JianWu(int WuPosInList, int XiangZiID)
{
        P1_STR MyParam;
        DWORD ParamSum;
        BYTE tmpid 
= 0;
        MyParam.Param1 
= WuPosInList;
        MyParam.Param2 
= XiangZiID;
        ParamSum 
= sizeof(MyParam);

        InjectFunc(JianWuA, (DWORD 
*)&MyParam,ParamSum);
}

P1_STR 的結構體定義如下:
typedef struct _P1_STR{ 
        
int Param1;
        
int Param2;
        
int Param3;
}P1_STR,
*PP1_STR; 
這樣就可以了~~~~
      【結尾】
       今天要說的東西就這么多,一些沒什么技術含量的東西,希望對正需要的朋友帶來幫助,也十分的感謝大家能看完我這又臭又長的破爛文章!
       感覺,不管匯編也好,Delphi也好,VB,JAVA也罷,還是C順手,極力推薦大家學C,因為很多的東西都可以自己控制,而且又簡單明了,真的是簡約而不簡單的·~~~
             好了,去就說這么多,希望各位大牛不要笑話,同我一樣的菜菜繼續努力,去睡覺去了~~~~
         游戲的半成品外掛連接如下:
         /Files/bester/ZH_Boot/ZHPlg_src.rar
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜一区二区三区不卡视频| 国产欧美日韩视频| 日韩视频久久| 欧美电影在线观看完整版| 美女黄毛**国产精品啪啪| 榴莲视频成人在线观看| 欧美电影免费观看高清| 欧美激情一区| 日韩视频三区| 午夜精品国产更新| 久久久欧美一区二区| 欧美凹凸一区二区三区视频| 欧美国产高潮xxxx1819| 欧美视频一区二区三区| 国产情侣久久| 亚洲精品韩国| 欧美在线观看日本一区| 男人的天堂亚洲在线| 亚洲欧洲日本专区| 99国产精品久久| 午夜精品久久久99热福利| 久久综合久色欧美综合狠狠 | 欧美专区在线| 欧美成人综合网站| 国产日产高清欧美一区二区三区| 亚洲黄色免费| 欧美一区二区在线免费观看| 欧美成人一区在线| 99成人在线| 夜夜嗨av一区二区三区免费区| 国产精品卡一卡二卡三| 久久国产精品99国产| 久久精品中文字幕免费mv| 亚洲免费在线电影| 亚洲一二三区视频在线观看| 久久激情综合网| 噜噜噜躁狠狠躁狠狠精品视频| 欧美阿v一级看视频| 欧美日韩在线三级| 国产精品极品美女粉嫩高清在线 | 99精品国产在热久久下载| 香蕉久久夜色精品国产| 欧美国产日韩一区二区在线观看| 欧美在线视频观看免费网站| 亚洲精品美女| 在线视频一区观看| 很黄很黄激情成人| 亚洲欧美国产视频| 亚洲三级影片| 久久精品日韩| 国产日韩精品一区二区浪潮av| 亚洲精品中文字| 免费在线成人av| 久久国产毛片| 好吊视频一区二区三区四区 | 国产亚洲精品高潮| 亚洲欧美亚洲| 亚洲一区二区三区涩| 欧美午夜在线一二页| 亚洲与欧洲av电影| 中文国产成人精品| 国产精品高潮呻吟久久av无限| 一区二区欧美亚洲| 欧美一区二区在线视频| 欧美精品www在线观看| 狠狠网亚洲精品| 久久在线视频| 久久久久久伊人| 亚洲国产成人tv| 欧美激情一区在线| 免费日韩av片| 99精品欧美一区二区三区| 亚洲激情在线观看视频免费| 欧美不卡在线| 亚洲一区欧美激情| 羞羞色国产精品| 国内激情久久| 欧美 日韩 国产一区二区在线视频 | av成人免费| 国产精品视频免费| 久久久久亚洲综合| 免费欧美日韩| 亚洲免费在线观看| 久久大香伊蕉在人线观看热2| 影音先锋中文字幕一区| 91久久中文| 国产精品日韩二区| 噜噜噜在线观看免费视频日韩| 农夫在线精品视频免费观看| 在线视频一区观看| 久久se精品一区二区| 亚洲精品在线二区| 欧美一二区视频| 亚洲精品亚洲人成人网| 一区二区三区**美女毛片| 国产日韩亚洲欧美精品| 亚洲国产美女久久久久| 国产精品一区免费观看| 美国三级日本三级久久99| 欧美日韩国产在线一区| 久久精品亚洲国产奇米99| 欧美激情偷拍| 久久亚洲综合色| 欧美午夜激情在线| 欧美91大片| 国产欧美日韩另类视频免费观看| 亚洲国产精品精华液网站| 国产嫩草影院久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久av一区| 亚洲剧情一区二区| 一区二区三区视频在线| 在线日韩av永久免费观看| 99re8这里有精品热视频免费| 极品少妇一区二区| 亚洲自拍啪啪| 一区二区三区|亚洲午夜| 久久久青草青青国产亚洲免观| 亚洲视频福利| 欧美高清你懂得| 欧美福利一区二区三区| 国产香蕉久久精品综合网| 99热精品在线观看| 99精品欧美一区| 欧美激情一区二区三区在线视频 | 性做久久久久久免费观看欧美| 欧美sm视频| 免费观看成人| 国产一区二区三区四区hd| 亚洲一区二区三区777| 在线亚洲高清视频| 欧美精品一区二区三区蜜臀| 欧美jizz19hd性欧美| 国内精品久久久久久久97牛牛| 在线视频欧美日韩精品| 亚洲综合激情| 欧美性猛交xxxx乱大交蜜桃| 亚洲精品一区二区三区婷婷月| 91久久午夜| 欧美激情精品久久久六区热门| 欧美电影美腿模特1979在线看 | 亚洲国产精彩中文乱码av在线播放| 欧美一区二区三区免费看| 久久成人精品视频| 国产一区二区视频在线观看 | 久久久噜噜噜久久中文字幕色伊伊| 久久精品中文| 在线日韩av片| 欧美福利在线观看| 亚洲人www| 亚洲免费网址| 国产一区二区精品| 久久亚洲精品伦理| 亚洲国产精品成人久久综合一区| 亚洲精品一区二区三区99| 欧美日韩国产在线观看| 亚洲一区二区在线| 久久久久综合一区二区三区| 亚洲高清激情| 欧美日韩成人精品| 亚洲在线观看免费| 蜜臀av国产精品久久久久| 亚洲国产天堂久久综合网| 欧美日韩亚洲在线| 香蕉久久一区二区不卡无毒影院| 欧美jizz19hd性欧美| 中文av字幕一区| 国产一区二区三区视频在线观看| 美女视频一区免费观看| 在线中文字幕不卡| 美玉足脚交一区二区三区图片| 亚洲精品一二区| 国产色婷婷国产综合在线理论片a| 久久久av网站| 亚洲一区欧美二区| 欧美jizzhd精品欧美巨大免费| 最新成人av网站| 亚洲专区在线视频| 亚洲福利视频在线| 国产精品九九久久久久久久| 久久精品最新地址| 在线一区二区日韩| 欧美激情一区二区在线| 欧美在线不卡| 亚洲私人影院在线观看| 在线观看欧美日韩国产| 国产精品盗摄久久久| 欧美1区2区| 久久精品日韩欧美| 亚洲永久免费视频| 亚洲精品你懂的| 欧美成人综合在线| 先锋资源久久| 亚洲专区国产精品| 日韩午夜精品| 在线国产欧美| 韩国视频理论视频久久| 国产精品日韩欧美| 欧美日韩一区二区在线视频| 免费在线观看日韩欧美|