優質の幻想鄉

 找回密碼
 註冊帳號
搜索
查看: 1599|回復: 0

[分享] 【可用】製作DLL檔案方法,DLL劫持技術,Plusisland文章備份

[複製鏈接]
發表於 2018-5-20 22:24 | 顯示全部樓層 |閱讀模式
本帖最後由 kupiok23-winds+ 於 2018-5-31 03:34 編輯

使用軟體:MicrosoftVisual C++AheadLibCheat EngineDependencyWalker
應用技術:DLL劫持技術、DLL自動注入(不需要另寫exe檔案來注入)

msimg32.dll原始碼:https://drive.google.com/open?id=1HYxPGwdz-KNYhWkdxyBgtrk7CbB4ozrJ
msimg32.dll完成品:
https://drive.google.com/open?id=1MV00dl3wG2is4NxfeT_GUEjrAwglQnNU
解壓縮密碼123456

目前msimg32.dll寫入功能:
LAN平台去廣告、免5秒限制擠房、解除魔獸3地圖8M大小限制
被劫持的對象:
舊版Garena競時通的LAN平台garena_room.exe
被針對的遊戲:
魔獸爭霸3


如何撰寫DLL自動注入:

*.本篇文章還在編輯中,至於什麼時候會寫完還不知道.*


利用 MicrosoftVisual C++ 製作簡單的外掛,可以應用在軟體破解或遊戲修改

由於是自行 GOOGLE 學習,有觀念不正確的地方還請多多包涵

可能有些地方還會違反一般程式設計規則,例如變數名稱大小寫等等

本文將利用兩項很早以前就有的方法來實現外掛的製作,DLL劫持技術和CALL的調用

DLL 劫持技術請先閱讀這一篇文章【原創】神奇的馬甲Dll By 海風月影[RCT]

【原創】神奇的馬甲Dll By 海風月影[RCT]:http://bbs.pediy.com/showthread.php?t=66452

運用這個技術就可以不用 DLLInjector 了,可以簡單的將 DLL 注入遊戲裡面

問題是該如何挑選要製作的假DLL 呢 ? 這感覺像是木馬屠城記的故事一樣

使用 DependencyWalker 挑選我們要製作的假 DLL

Dependency Walker: http://www.dependencywalker.com/

原則上要選擇有在C:\Windows\System32 底下的 DLL ,但並不是每一個都可行

我喜歡選檔案最小的,底下是我常愛用的類型

圖片:
http://i.imgur.com/EyjoNes.png


如果是跟網路相關的,大家常用的好像是 IpHlpApi.dll 因人而異

像我就用過msimg32.dll、PSAPI.DLL、KSUSER.DLL、SENSAPI.DLL

舉例:楓之谷多開就喜歡用楓之谷自帶的檔案 ijl15.dll

製作假 DLL 使用工具來建會比較快,此工具在以下文章 2 樓 下載 GOOGLE雲端下載

GOOGLE雲端下載:http://gdurl.com/vJ72

【樣章1】《加密與解密(第三版)》------18.2.4DLL劫持技術(內存補丁技術)

http://bbs.pediy.com/showthread.php?t=60849

接下來開始使用 AheadLib來建立假 DLL

圖片2:
http://i.imgur.com/SvC9wAZ.png

設定要跟圖中一樣,這裡示範msimg32.dll 生成在桌面上

接下來打開 MicrosoftVisual C++ 新建專案囉!

圖片3:
http://i.imgur.com/AoJadb9.png

圖片4:
http://i.imgur.com/ifZyWDN.png

接下來在取的專案名稱按滑鼠右鍵選"屬性"

圖片5:
http://i.imgur.com/LW2drun.png

請照圖做設定喔!

圖片6:
http://i.imgur.com/h2tV6xf.png

圖片7:
http://i.imgur.com/qZnCX5G.png

由於是示範msimg32.dll ,所以要改成$(OutDir)\msimg32.dll

接下來"原始程式碼"按滑鼠右鍵加入剛剛使用 AheadLib 產生的 msimg32.cpp

記得把 msimg32.cpp 移到專案資料夾內喔! 可以先用 WORD 簡轉繁

為了驗證有沒有成功,我們增加一行程式碼做測試用

增加 MessageBox (NULL, "我是馬甲DLL!","你好!", MB_OK ); 像下面這樣
// 入口函數
BOOL WINAPI DllMain(HMODULE hModule, DWORDdwReason, PVOID pvReserved)
{
   if (dwReason == DLL_PROCESS_ATTACH)
    {
       DisableThreadLibraryCalls(hModule);
       MessageBox ( NULL, "我是馬甲DLL!", "你好!", MB_OK );
       return Load();
    }
   else if (dwReason == DLL_PROCESS_DETACH)
    {
       Free();
    }

   return TRUE;
}

然後把綠色小箭頭旁邊改成Release

圖片8:
http://i.imgur.com/fV0c0bX.png


然後按綠色小箭頭,跑完後會在專案目錄底下產生 DLL 檔案

C:\Users\使用者名稱\Documents\Visual Studio XXXX\Projects\專案名稱\Release

將產生的 DLL 放到遊戲目錄底下,運行遊戲看有沒有彈出訊息


圖片9:

http://i.imgur.com/5GxpVpS.png


有代表這 DLL 可用,沒有代表要從其他 DLL 下手

================================================================================

接著介紹一下目前"暫時"可用的修改記憶體方法,此方法可以無視遊戲 CRC 檢查

在楓之谷裡,不知道誰發明 ICS這個名詞,但本質上是修改 CALL 的方法

CALL 在記憶體裡有很多種變形,我們可以利用的點以下地方,本質上都是 CALL 的呼叫

第一種 call dwordptr [XXXXXXXX]

第二種 jmp dwordptr [XXXXXXXX]

第三種 在高級語言中隱藏Call指令

高級語言中隱藏Call指令:http://bbs.pediy.com/showthread.php?t=12261

可能會長這樣 pushXXXXXXXX 或 mov 暫存器,CALL;

常用的是第一種,第三種有在楓之谷的釣魚成功率 100% 數據看過

我們將舉例卡丁車的代碼來作範例,這裡是示範一層 CALL 範例

這是跑跑卡丁車的代碼

KartRider.exe+255EC2 - 8B 95 E4FCFFFF        - mov edx,[ebp-0000031C]
KartRider.exe+255EC8 - 89 55 F8              - mov [ebp-08],edx
KartRider.exe+255ECB - 81 7D F8E8030000     - cmp [ebp-08],000003E8
KartRider.exe+255ED2 - 76 07                 - jna KartRider.exe+255EDB ←修改這裡的功能:瞬移
KartRider.exe+255ED4 - C7 45 F8E8030000     - mov [ebp-08],000003E8
KartRider.exe+255EDB - 8B 45 08              - mov eax,[ebp+08]
KartRider.exe+255EDE - 50                    - push eax
KartRider.exe+255EDF - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255EE5 - 81 C1 48050000        - add ecx,00000548
KartRider.exe+255EEB - E8 20D3E6FF           - call KartRider.exe+C3210
KartRider.exe+255EF0 - 8D 8D 38FEFFFF        - lea ecx,[ebp-000001C8]
KartRider.exe+255EF6 - E8 65DF0000           - call KartRider.exe+263E60
KartRider.exe+255EFB - C6 45 FF 00           - mov byte ptr [ebp-01],00
KartRider.exe+255EFF - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255F05 - 8B 11                 - mov edx,[ecx]
KartRider.exe+255F07 - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255F0D - FF 52 58              - call dword ptr [edx+58] ←修改點1
KartRider.exe+255F10 - 0FB6 C0               - movzx eax,al
KartRider.exe+255F13 - 85 C0                 - test eax,eax
KartRider.exe+255F15 - 0F84 97010000         - je KartRider.exe+2560B2
KartRider.exe+255F1B - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255F21 - 8B 11                 - mov edx,[ecx]
KartRider.exe+255F23 - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255F29 - FF 52 68              - call dword ptr [edx+68] ←修改點2
KartRider.exe+255F2C - 89 85 34FEFFFF        - mov [ebp-000001CC],eax
KartRider.exe+255F32 - 83 BD 34FEFFFF00     - cmp dword ptr [ebp-000001CC],00
KartRider.exe+255F39 - 75 12                 - jne KartRider.exe+255F4D
KartRider.exe+255F3B - 6A 00                 - push 00
KartRider.exe+255F3D - 8B 8D E8FCFFFF        - mov ecx,[ebp-00000318]
KartRider.exe+255F43 - E8 D8E30000           - call KartRider.exe+264320
KartRider.exe+255F48 - E9 65010000           - jmp KartRider.exe+2560B2
KartRider.exe+255F4D - 8B 85 E8FCFFFF        - mov eax,[ebp-00000318]
KartRider.exe+255F53 - 8B 8D 34FEFFFF        - mov ecx,[ebp-000001CC]
KartRider.exe+255F59 - 3B 48 3C              - cmp ecx,[eax+3C]
KartRider.exe+255F5C - 75 63                 - jne KartRider.exe+255FC1 ←修改這裡的功能代碼來達到:加速
KartRider.exe+255F5E - 8B 95 E8FCFFFF        - mov edx,[ebp-00000318]
KartRider.exe+255F64 - 81 C2 B4050000        - add edx,000005B4
KartRider.exe+255F6A - 52                    - push edx

經過仔細閱讀我們可以得知,如果要達成瞬移功能需要將 [ebp-08] 的內容改為 3E8

(由 KartRider.exe+255ED4 得知)

要達成加速功能 ecx 的內容需要跟 [eax+3C] 一樣 (由KartRider.exe+255F59 得知)

而 ecx 由 [ebp-000001CC] 修改 (由 KartRider.exe+255F53 得知)

其中[ebp-000001CC] 是在KartRider.exe+255F2C 修改

所以要來設計修改內容了

瞬移是這樣修改

void __declspec(naked) __stdcall GodSpeed()
{
   __asm
    {
       cmp GodSpeedOnOff,1 ← 熱鍵開關
       jne Normal
       mov eax,GodSpeedAddress ← 檢查是否為修改位置 KartRider.exe+255F10
       cmp dword ptr [esp],eax
       jnz Normal
       mov dword ptr [ebp-8],3E8h ← 是的話改內容為 3E8
Normal:   
       jmp ReGodSpeed
    }
}


加速是這樣修改

void __declspec(naked) __stdcallSuperSpeed()
{
   __asm
    {
       cmp SuperSpeedOnOff,1 ← 熱鍵開關
       jne Normal
       mov eax,SuperSpeedAddress ← 檢查是否為修改位置 KartRider.exe+255F2C
       cmp dword ptr [esp],eax
       jnz Normal
       sub esp,8 ← 對ESP作補償
       mov eax,[ecx+3Ch] ← 偽造 EAX 返回值 讓EAX 修改 [ebp-000001CC] 的內容
       jmp SuperSpeedAddress
Normal:
       jmp ReSuperSpeed
    }
}

由於這段教學沒有整個從基礎教學,詳細內容可能要先從楓之谷 ICS 數據開始了解

只要知道數據在做什麼,用複製貼上也可以做出一個簡易的楓之谷外掛

Posted 2012-11-30

Labels: 外掛編寫







您需要登錄後才可以回帖 登錄 | 註冊帳號

本版積分規則

小黑屋|手機版|優質の幻想鄉

GMT+8, 2019-3-21 00:00

著作權聲明 & DMCAChild Pornography使用合約 & Terms and Conditions聯絡我們 & Contact Us

快速回復 返回頂部 返回列表