實現 MU 窗口化 過程


實現 MU 窗口化 過程

 

窗口化 的確可以實現 可能很多人都以實現了 我在這里拋磚引玉了
但是 登陸 30 秒后 出現 GameGuard 出錯
實在不知原因 
又找不到  加密解密 的代碼 
聽說 99 可以和 +11 裝備 100% 成功 太 nb 
自愧不如了
現在決定放棄了

把我的這些垃圾 貼到這 誰願意繼續搞 誰搞去把

< 1 > 調試 :
工具 OllDbg 系統 xp 忽略所有異常 
菜單 文件/打開 選擇 main.exe 
在參數框中 添入 conn44ect /u210.51.27.96 /p44405             // 這是模仿  MU.exe 啟動 Main.exe
                                                             // MU.exe 使用了命令行 
                                                             // 顯然不同的區 IP 不同 
bp 77FB172C ecx == 0c6d39cf // 這是第26次 SEH 
斷下后按 F7 到這里

0C6D39CF    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
0C6D39D3    8380 B8000000 0>ADD DWORD PTR DS:[EAX+B8],2
0C6D39DA    C740 18 0000000>MOV DWORD PTR DS:[EAX+18],0
0C6D39E1    31C0            XOR EAX,EAX
0C6D39E3    C3              RETN
0C6D39E4    31C0            XOR EAX,EAX
0C6D39E6    64:FF30         PUSH DWORD PTR FS:[EAX]
0C6D39E9    64:8920         MOV DWORD PTR FS:[EAX],ESP
0C6D39EC    3100            XOR DWORD PTR DS:[EAX],EAX
0C6D39EE    64:8F05 0000000>POP DWORD PTR FS:[0]              // 這里下斷點
0C6D39F5    58              POP EAX
0C6D39F6    833D B07E6D0C 0>CMP DWORD PTR DS:[C6D7EB0],0


然后 bp 0C6D39EE 
斷下后 我們先 看一下 啟動 GameGuard.des 的代碼
d 5A2470     // 這個地址我也忘記我是如何找到的了 我可能用了 SoftICE 或者 我一直跟蹤到此
             // ASProtect殼 的HookAPI挺惡心 
             // 可能要 BP CreateProcessA + 一個大一點的數
數據窗口 點右鍵 反匯編 看到下面代碼

005A2470    8D5424 18       LEA EDX,DWORD PTR SS:[ESP+18]
005A2474    8D4424 40       LEA EAX,DWORD PTR SS:[ESP+40]
005A2478    8D8C24 B0030000 LEA ECX,DWORD PTR SS:[ESP+3B0]
005A247F    52              PUSH EDX
005A2480    50              PUSH EAX
005A2481    6A 00           PUSH 0
005A2483    6A 00           PUSH 0
005A2485    6A 00           PUSH 0
005A2487    6A 01           PUSH 1
005A2489    6A 00           PUSH 0
005A248B    6A 00           PUSH 0
005A248D    8D9424 C8010000 LEA EDX,DWORD PTR SS:[ESP+1C8]
005A2494    51              PUSH ECX
005A2495    52              PUSH EDX
005A2496    FF15 04915B00   CALL DWORD PTR DS:[5B9104]         // 這里 調用 CreateProcessA
005A249C    85C0            TEST EAX,EAX
005A249E    75 46           JNZ SHORT main.005A24E6

005A2496 行 調用 CreateProcessA 。
修改 地址 5B9104 的內容可以 HOOK CreateProcessA ;

向下 按 F7 或 F8 有幾個 跳轉指令 
然后 啟動了  GameMon.des  // 也是 CALL CALL DWORD PTR DS:[5B9104] 
注意 一下 OD 中顯示出的字符串 可以 發現這些 跳轉 多數 跳到了 GameMon failure ;
我把他們 統統 改了         // 見后面的 C 代碼 

////////////////////////////////////////////////// 調試就到這里了 誰喜歡調自己調去把


< 2 > 注入 DLL 
可以很簡單的 使用 遠程線程 的 方法 照搬 <<winndows 核心編程>> 里的代碼就行了

//////////////////////////////////////////////////////////////////////////////
< 3 > 啟動 main.exe 向其代碼空間中寫入 指令
首先啟動 Main  // 不要忘了傳遞命令行  connect /u210.51.27.96 /p44405  
                // 各區的 IP 與 端口 在 partition.inf 文件里

當然以調試器的身份啟動 Main 是非常好的   // 但先要躲過 IsDebuggerPresent()
在 26 次 異常后斷下 ,修改 Main 的代碼 ,一切那么自然
但我不知 如何躲過 IsDebuggerPresent() 所以啟動之后產生了 千萬次異常

我只好不用 "調試" 那參數了,這樣修改 Main.exe 代碼的時機很難掌握了
我用了 這樣一個循環 只是延時了 其實沒准的 很
while (dwBuf != GREAYE_PROCESS_V && j < 1110000)
{
BOOL fRead = ReadProcessMemory (GetCurrentProcess(),  (LPCVOID)GREAYE_PROCESS_A , (LPVOID) &dwBuf, 4, NULL) ;
_ASSERTE (fRead) ;
j ++ ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面是 被注入的 DLL 的全部代碼 
// 注意 : 我從來沒搞過任何項目 寫過的代碼也有限
//       下面的代碼 寫的不好 請原諒
//       比如 里面有一些 曾經用過 但現在不用的變量 沒有刪掉
//         還有注釋 寫的不好請原諒

 

// MuDll.cpp 文件
#include "MU_DLL.h"


#pragma data_seg ("sharedID")
HANDLE m_hMuThread = NULL ;
HANDLE m_hMuProcess = NULL ;
static int m_iNumLoad = 0 ;
static char m_szMuMsg[1024] ;
#pragma data_seg () 
#pragma comment (linker, "/SECTION:sharedID,rws")


WNDPROC                m_wpMuOldProc ;
HINSTANCE              m_hThis ;
HWND                   m_hwndInsert ;
LPPROCESS_INFORMATION  m_lpProcessInfoMon ;
HWND                   m_hwndMu ;
char                   m_lpsSend [302700] ;  
UINT                   m_strSendLen = 0 ;

 


int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
m_hThis = hInstance ;
m_iNumLoad ++ ;

if (m_iNumLoad > 1)
{
m_hwndInsert = FindWindow ("InsertDll", NULL) ;
SetProcessPriorityBoost (m_hMuProcess, TRUE) ;
DWORD dwRun = ResumeThread (m_hMuThread) ;
if ( -1 == dwRun)
{
char szShowNum[1024] ;
sprintf (szShowNum, "hThread  %x load time %d/n", m_hMuThread, m_iNumLoad) ;   
MessageBox (NULL, szShowNum , " shibai MUdll", MB_OK) ;
FreeLibrary (m_hThis) ;
}
else 
{
unsigned dwTreadID = 0;
    HANDLE hThread = NULL ;
hThread = (HANDLE)_beginthreadex (NULL, 0, &ThreadReadWrite , NULL, 0, &dwTreadID) ;

}
}
}
return TRUE;
}

unsigned __stdcall ThreadReadWrite (PVOID pvoid)
{
int i = 0 ;
int j = 0 ;
DWORD dwBuf = 0 ;

while (dwBuf != GREAYE_PROCESS_V && j < 1110000)   // 如果出現保護錯誤或其他錯誤 嘗試 修改循環次數 這個“dwBuf != GREAYE_PROCESS_V” 沒用
{
BOOL fRead = ReadProcessMemory (GetCurrentProcess(),  (LPCVOID)GREAYE_PROCESS_A , (LPVOID) &dwBuf, 4, NULL) ;
_ASSERTE (fRead) ;
j ++ ;
}

SuspendThread (m_hMuThread);  
 
char FalseNpCode[] = "/xB8/x01/x00/x00/x00"    // mov  eax,  0x00000001
"/xB9/xE2/x33/xE5/x77"     // mov  ecx,  0x77E533E2
"/xBA/x08/x06/x14/x00"     // mov  edx,  0x00140608
"/x90/x90/x90/x90/x90"     // nop
"/x90/x90/x90/x90/x90"
"/x90/x90/x90/x90/x90"
"/x90/x90/x90/x90/x90"
"/x90/x90/x90/x90/x90"
"/x90/x90/x90/x90" ;

// 跳過 Create GameGuard
BOOL fOKe = WriteProcessMemory (m_hMuProcess, 
(LPVOID)NP_ADDRESS, 
FalseNpCode, 
44, FALSE) ;  
// 跳過 GameGuard 后 的后續工作
// 一些跳轉
char chrJMP[] = "/xeb" ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A256C, chrJMP, 1, FALSE) ; 
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2b4b, chrJMP, 1, FALSE) ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2d5b, chrJMP, 1, FALSE) ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2dcc, chrJMP, 1, FALSE) ;

// 一個函數我不知道他的用途,運行他會出錯 干脆 NOP 掉了
char chrNOP[] = "/x90/x90/x90/x90/x90/x90/x90" ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2cd9, chrNOP, 7, FALSE) ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2ceb, chrNOP, 4, FALSE) ;

// 下面這些函數的地址 也沒什么用 用 SofICE 下斷 很容易找到 
// 鈎掛 CreateProcess () 函數 
LPVOID lpMyFunc ;
lpMyFunc = (LPVOID)MyCreateProcess ;
BOOL fOKa = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005b9104, (LPCVOID)&lpMyFunc, 4, FALSE) ;

// 改變 MU 窗口類風格
//char cClssStyle[]   = "/x03" ;
//BOOL fOKb = WriteProcessMemory (m_hMuProcess, (LPVOID)0x0045D313, cClssStyle, 1, FALSE) ;

// 鈎掛 CreateWindow 函數 改變窗口風格
lpMyFunc = (LPVOID)MyCreateWindowEx ;
BOOL fOKc = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B93DC, (LPCVOID)&lpMyFunc, 4, FALSE) ;

// 鈎掛 ChangeDisplaySetting 函數 
lpMyFunc = (LPVOID)MyChangeDisplay ;
BOOL fOKd = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9410, (LPCVOID)&lpMyFunc, 4, FALSE) ;

// 鈎掛 send 函數
lpMyFunc = (LPVOID)MySend ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9470, (LPCVOID)&lpMyFunc, 4, FALSE) ;

// 鈎掛 recv ()
lpMyFunc = (LPVOID)MyRecv ;
WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9494, (LPCVOID)&lpMyFunc, 4, FALSE) ;

// 鈎掛 SetTimer () 
//dwMyFunc = (DWORD)MySetTimer ;
//WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B93cc, (LPCVOID)&dwMyFunc, 4, FALSE) ;


// 鈎掛 TextOut 函數
//dwMyFunc = (DWORD)MyTextOut ;
//WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9068, (LPCVOID)&dwMyFunc, 4, FALSE) ;


//if (fOKa && fOKb && fOKc) 
// MessageBox (NULL, " 代碼改好了 要出錯了嗎?", ":(", 0) ;

ResumeThread (m_hMuThread) ; 

CloseHandle (m_hMuThread) ;
CloseHandle (m_hMuProcess) ;

_endthreadex(0) ;
return 0 ;
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MU 子類化窗口過程
LRESULT CALLBACK MuSubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HANDLE hFile ;
DWORD dwActBytes ;

switch (message) 
{
case WM_CREATE :

m_hwndMu = hwnd ;
break ;

case WM_TIMER :

if ((int)wParam == 1000)
{
KillTimer (hwnd, (int)wParam) ;  // 不知道他是什么 但是必須 Kill
return 0 ;
}
break ;

case WM_ACTIVATE :   // 解決了Mu窗口不放棄焦點的問題
wParam = 1 ;
break ;

case WM_DESTROY :

// 順便把 Mon 結束掉 
TerminateProcess (m_lpProcessInfoMon -> hProcess, 0) ;

//// 將 m_lpsSend串寫到磁盤  他們是 Send Recv 包
  if (!m_lpsSend) break ;
hFile = CreateFile ("e://Mu Msg.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
WriteFile (hFile, m_lpsSend, m_strSendLen, &dwActBytes, NULL) ;
CloseHandle (hFile) ;
break ;

case 0x2B11 :   // 看Main.exe 的代碼 好象有這個 用戶消息 但是從沒接收到過他
MessageBox (NULL, "0x2B11 Msg", "WndProc", 0) ;
break ;
}

return  CallWindowProc (m_wpMuOldProc, hwnd, message, wParam, lParam); 
        
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CreateWindowEx()
EXPORT HWND WINAPI MyCreateWindowEx (DWORD dwExStyle,LPCTSTR lpClassName, LPCTSTR lpWindowName,DWORD dwStyle,
  int x,int y,int nWidth,int nHeight,
  HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam) 
{
HWND hwnd = NULL ;
if ( strcmp(lpClassName, "MU") == 0)
{
hwnd = CreateWindowEx (/*dwExStyle*/0,
lpClassName,                  // window class name
lpWindowName,                 // window caption
WS_OVERLAPPEDWINDOW & (~WS_THICKFRAME ) & (~WS_MINIMIZEBOX) & (~WS_MAXIMIZEBOX),    // window style
0,                            // initial x position
0,                            // initial y position
640,                          // initial x size
480,                          // initial y size
hWndParent,                   // parent window handle
hMenu,                        // window menu handle
hInstance,                    // program instance handle
lpParam) ;                    // creation parameters
// 子類化 MU 窗口
m_wpMuOldProc = (WNDPROC)SetWindowLong (hwnd,  GWL_WNDPROC, (LONG) MuSubclassProc); 
}

else 
{
hwnd = CreateWindowEx (dwExStyle,
lpClassName,                  // window class name
lpWindowName,                 // window caption
dwStyle,   // window style
x,   // initial x position
y,   // initial y position
nWidth,   // initial x size
nHeight,   // initial y size
hWndParent,                   // parent window handle
hMenu,                        // window menu handle
hInstance,                    // program instance handle
lpParam) ;                    // creation parameters
}
return hwnd ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CreateProcess()
EXPORT BOOL WINAPI MyCreateProcess (LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
    LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation)
 
{
CreateProcess (lpApplicationName, lpCommandLine, lpProcessAttributes,
   lpThreadAttributes, bInheritHandles, 
   dwCreationFlags | CREATE_SUSPENDED,                 // 掛起 進程  GameMon.des
   lpEnvironment, lpCurrentDirectory, 
   lpStartupInfo, lpProcessInformation) ;
m_lpProcessInfoMon = lpProcessInformation ;

return TRUE ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SetTime() 沒必要 HOOK

EXPORT UINT_PTR WINAPI  MySetTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
{

if (nIDEvent == 1003)
{
MessageBox (NULL, m_szMuMsg, "mu", 0);
}

return (SetTimer (hWnd, nIDEvent, uElapse, lpTimerFunc)) ;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// send()

EXPORT int WINAPI MySend (SOCKET s, const char* buf, int len, int flags)
{
char szSendHex[3072] ;
int i = 0 ;
BYTE byte ;
BYTE * pByte = (BYTE*)buf ;

for (int j = 0 ; j < len ; j++)
{
byte = *pByte >> 4 ;
if (byte < 10) byte += 48 ;
else byte += 55 ;

szSendHex[i++] = byte ;

byte = *pByte & 0x0F ;
if (byte < 10) byte += 48 ;
else byte += 55 ;

szSendHex[i++] = byte ;
szSendHex[i++] = ' ' ;
pByte ++ ;
}
szSendHex[i] = 0 ;

static int iNumSend = 0 ;
iNumSend ++  ;

m_strSendLen += sprintf (m_lpsSend + m_strSendLen, 
TEXT("%s  %d PackLen : %d: /n        %s/n"), "Send", iNumSend, len, szSendHex) ; 

return send (s, buf, len, flags) ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// recv ()
EXPORT int WINAPI MyRecv (SOCKET s, char* buf, int len, int flags)
{

int iRetn = recv (s, buf, len, flags) ;
char szRecvHex[3072] ;
int i = 0 ;
BYTE byte ;
BYTE * pByte = (BYTE*)buf ;

// Get revc data len 
int iPackLen = (int)pByte[1] ;
if ( (! iPackLen) || iPackLen == 1 )  
iPackLen = 2 ;

for (int j = 0 ; j < iPackLen ; j++)
{
byte = *pByte >> 4 ;
if (byte < 10) byte += 48 ;
else byte += 55 ;

szRecvHex[i++] = byte ;

byte = *pByte & 0x0F ;
if (byte < 10) byte += 48 ;
else byte += 55 ;

szRecvHex[i++] = byte ;
szRecvHex[i++] = ' ' ;
pByte ++ ;
}
szRecvHex[i] = 0 ;

static int iNumRecv = 0 ;
iNumRecv ++  ;

m_strSendLen += sprintf (m_lpsSend + m_strSendLen, 
TEXT("%s  %d PackLen : %d  iRetn : %d : /n        %s/n"), "Recv", iNumRecv, iPackLen, iRetn, szRecvHex) ; 


return iRetn ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TextOut() 沒必要 HOOK

EXPORT BOOL WINAPI MyTextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString)
{
if (*lpString == 'G') 
{
MessageBox (NULL, m_szMuMsg, "GameGaurd ?", 0) ;
}
return TextOut (hdc, nXStart, nYStart, lpString, cbString) ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  ChangeDisplay() 直接返回 不出現黑屏了
EXPORT LONG WINAPI MyChangeDisplay (LPDEVMODE lpDevMode, DWORD dwflags)
{
return 0 ;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


EXPORT void SetMuHandle(HANDLE hProcess, HANDLE hThread)
{
m_hMuProcess = hProcess ;
m_hMuThread = hThread ;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 

 


// MuDll.h 文件

#pragma once
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32")
#include <windows.h>
#include <stdio.h>
#include <process.h>

#include <Dbghelp.h>
#pragma comment(lib, "Dbghelp")

#include <Crtdbg.h> 

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

#define NP_ADDRESS            0x005A2470
#define NP_ADDRESS_V          0x1824448D
#define NP_ADDRESS_END_A      0x005A2498
#define GREAYE_PROCESS_A      0x0C6E0374
#define GREAYE_PROCESS_V      0x6AEC8B55


LRESULT CALLBACK MuSubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;

// 讀寫 MU.exe進程空間 代碼 的 線程
unsigned __stdcall ThreadReadWrite (PVOID pvoid) ;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 下面函數導出 給 InsertDll.exe 使用
EXPORT void  SetMuHandle (HANDLE hProcess, HANDLE  hThread) ;

  

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 下面定義 HOOK API 都以 My 開頭
// Hook CreateWindowEx Func
EXPORT HWND WINAPI MyCreateWindowEx (
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam) ;
EXPORT LONG WINAPI MyChangeDisplay (LPDEVMODE lpDevMode, DWORD dwflags) ; 

EXPORT BOOL WINAPI MyCreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
EXPORT UINT_PTR WINAPI  MySetTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
EXPORT DWORD WINAPI MyWaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);
EXPORT BOOL WINAPI  MyTextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString);             
EXPORT int WINAPI MySend (SOCKET s, const char* buf, int len, int flags);
EXPORT int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);

 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: