实现 MU 窗口化 过程
<strong><br/><br/></strong>实现 MU 窗口化 过程 <p></p><p>窗口化 的确可以实现 可能很多人都以实现了 我在这里抛砖引玉了<br/>但是 登陆 30 秒后 出现 GameGuard 出错<br/>实在不知原因 <br/>又找不到 加密解密 的代码 <br/>听说 99 可以和 +11 装备 100% 成功 太 nb <br/>自愧不如了<br/>现在决定放弃了</p><p>把我的这些垃圾 贴到这 谁愿意继续搞 谁搞去把</p><p>< 1 > 调试 :<br/>工具 OllDbg 系统 xp 忽略所有异常 <br/>菜单 文件/打开 选择 main.exe <br/>在参数框中 添入 conn44ect /u210.51.27.96 /p44405 // 这是模仿 MU.exe 启动 Main.exe<br/> // MU.exe 使用了命令行 <br/> // 显然不同的区 IP 不同 <br/>bp 77FB172C ecx == 0c6d39cf // 这是第26次 SEH <br/>断下后按 F7 到这里</p><p>0C6D39CF 8B4424 0C MOV EAX,DWORD PTR SS:<br/>0C6D39D3 8380 B8000000 0>ADD DWORD PTR DS:,2<br/>0C6D39DA C740 18 0000000>MOV DWORD PTR DS:,0<br/>0C6D39E1 31C0 XOR EAX,EAX<br/>0C6D39E3 C3 RETN<br/>0C6D39E4 31C0 XOR EAX,EAX<br/>0C6D39E6 64:FF30 PUSH DWORD PTR FS:<br/>0C6D39E9 64:8920 MOV DWORD PTR FS:,ESP<br/>0C6D39EC 3100 XOR DWORD PTR DS:,EAX<br/>0C6D39EE 64:8F05 0000000>POP DWORD PTR FS: // 这里下断点<br/>0C6D39F5 58 POP EAX<br/>0C6D39F6 833D B07E6D0C 0>CMP DWORD PTR DS:,0</p><p><br/>然后 bp 0C6D39EE <br/>断下后 我们先 看一下 启动 GameGuard.des 的代码<br/>d 5A2470 // 这个地址我也忘记我是如何找到的了 我可能用了 SoftICE 或者 我一直跟踪到此<br/> // ASProtect壳 的HookAPI挺恶心 <br/> // 可能要 BP CreateProcessA + 一个大一点的数<br/>数据窗口 点右键 反汇编 看到下面代码</p><p>005A2470 8D5424 18 LEA EDX,DWORD PTR SS:<br/>005A2474 8D4424 40 LEA EAX,DWORD PTR SS:<br/>005A2478 8D8C24 B0030000 LEA ECX,DWORD PTR SS:<br/>005A247F 52 PUSH EDX<br/>005A2480 50 PUSH EAX<br/>005A2481 6A 00 PUSH 0<br/>005A2483 6A 00 PUSH 0<br/>005A2485 6A 00 PUSH 0<br/>005A2487 6A 01 PUSH 1<br/>005A2489 6A 00 PUSH 0<br/>005A248B 6A 00 PUSH 0<br/>005A248D 8D9424 C8010000 LEA EDX,DWORD PTR SS:<br/>005A2494 51 PUSH ECX<br/>005A2495 52 PUSH EDX<br/>005A2496 FF15 04915B00 CALL DWORD PTR DS: // 这里 调用 CreateProcessA<br/>005A249C 85C0 TEST EAX,EAX<br/>005A249E 75 46 JNZ SHORT main.005A24E6</p><p>005A2496 行 调用 CreateProcessA 。<br/>修改 地址 5B9104 的内容可以 HOOK CreateProcessA ;</p><p>向下 按 F7 或 F8 有几个 跳转指令 <br/>然后 启动了 GameMon.des // 也是 CALL CALL DWORD PTR DS: <br/>注意 一下 OD 中显示出的字符串 可以 发现这些 跳转 多数 跳到了 GameMon failure ;<br/>我把他们 统统 改了 // 见后面的 C 代码 </p><p>////////////////////////////////////////////////// 调试就到这里了 谁喜欢调自己调去把</p><p><br/>< 2 > 注入 DLL <br/>可以很简单的 使用 远程线程 的 方法 照搬 <<winndows 核心编程>> 里的代码就行了</p><p>//////////////////////////////////////////////////////////////////////////////<br/>< 3 > 启动 main.exe 向其代码空间中写入 指令<br/>首先启动 Main // 不要忘了传递命令行 connect /u210.51.27.96 /p44405 <br/> // 各区的 IP 与 端口 在 partition.inf 文件里</p><p>当然以调试器的身份启动 Main 是非常好的 // 但先要躲过 IsDebuggerPresent()<br/>在 26 次 异常后断下 ,修改 Main 的代码 ,一切那么自然<br/>但我不知 如何躲过 IsDebuggerPresent() 所以启动之后产生了 千万次异常</p><p>我只好不用 "调试" 那参数了,这样修改 Main.exe 代码的时机很难掌握了<br/>我用了 这样一个循环 只是延时了 其实没准的 很<br/>while (dwBuf != GREAYE_PROCESS_V && j < 1110000)<br/>{<br/>BOOL fRead = ReadProcessMemory (GetCurrentProcess(), (LPCVOID)GREAYE_PROCESS_A , (LPVOID) &dwBuf, 4, NULL) ;<br/>_ASSERTE (fRead) ;<br/>j ++ ;<br/>}<br/>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p>下面是 被注入的 DLL 的全部代码 <br/>// 注意 : 我从来没搞过任何项目 写过的代码也有限<br/>// 下面的代码 写的不好 请原谅<br/>// 比如 里面有一些 曾经用过 但现在不用的变量 没有删掉<br/>// 还有注释 写的不好请原谅</p><p></p><p>// MuDll.cpp 文件<br/>#include "MU_DLL.h"</p><p><br/>#pragma data_seg ("sharedID")<br/>HANDLE m_hMuThread = NULL ;<br/>HANDLE m_hMuProcess = NULL ;<br/>static int m_iNumLoad = 0 ;<br/>static char m_szMuMsg ;<br/>#pragma data_seg () <br/>#pragma comment (linker, "/SECTION:sharedID,rws")</p><p><br/>WNDPROC m_wpMuOldProc ;<br/>HINSTANCE m_hThis ;<br/>HWND m_hwndInsert ;<br/>LPPROCESS_INFORMATION m_lpProcessInfoMon ;<br/>HWND m_hwndMu ;<br/>char m_lpsSend ; <br/>UINT m_strSendLen = 0 ;</p><p></p><p><br/>int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)<br/>{<br/>if (fdwReason == DLL_PROCESS_ATTACH)<br/>{<br/>m_hThis = hInstance ;<br/>m_iNumLoad ++ ;</p><p>if (m_iNumLoad > 1)<br/>{<br/>m_hwndInsert = FindWindow ("InsertDll", NULL) ;<br/>SetProcessPriorityBoost (m_hMuProcess, TRUE) ;<br/>DWORD dwRun = ResumeThread (m_hMuThread) ;<br/>if ( -1 == dwRun)<br/>{ <br/>char szShowNum ;<br/>sprintf (szShowNum, "hThread %x load time %d\n", m_hMuThread, m_iNumLoad) ; <br/>MessageBox (NULL, szShowNum , " shibai MUdll", MB_OK) ;<br/>FreeLibrary (m_hThis) ;<br/>}<br/>else <br/>{<br/>unsigned dwTreadID = 0;<br/> HANDLE hThread = NULL ;<br/>hThread = (HANDLE)_beginthreadex (NULL, 0, &ThreadReadWrite , NULL, 0, &dwTreadID) ;<br/><br/>}<br/>}<br/>} <br/>return TRUE;<br/>}</p><p>unsigned __stdcall ThreadReadWrite (PVOID pvoid)<br/>{<br/>int i = 0 ;<br/>int j = 0 ;<br/>DWORD dwBuf = 0 ;</p><p>while (dwBuf != GREAYE_PROCESS_V && j < 1110000) // 如果出现保护错误或其他错误 尝试 修改循环次数 这个“dwBuf != GREAYE_PROCESS_V” 没用<br/>{<br/>BOOL fRead = ReadProcessMemory (GetCurrentProcess(), (LPCVOID)GREAYE_PROCESS_A , (LPVOID) &dwBuf, 4, NULL) ;<br/>_ASSERTE (fRead) ;<br/>j ++ ;<br/>}</p><p>SuspendThread (m_hMuThread); <br/> <br/>char FalseNpCode[] = "\xB8\x01\x00\x00\x00" // mov eax, 0x00000001<br/>"\xB9\xE2\x33\xE5\x77" // mov ecx, 0x77E533E2<br/>"\xBA\x08\x06\x14\x00" // mov edx, 0x00140608 <br/>"\x90\x90\x90\x90\x90" // nop<br/>"\x90\x90\x90\x90\x90"<br/>"\x90\x90\x90\x90\x90"<br/>"\x90\x90\x90\x90\x90"<br/>"\x90\x90\x90\x90\x90"<br/>"\x90\x90\x90\x90" ;</p><p>// 跳过 Create GameGuard <br/>BOOL fOKe = WriteProcessMemory (m_hMuProcess, <br/>(LPVOID)NP_ADDRESS, <br/>FalseNpCode, <br/>44, FALSE) ; <br/>// 跳过 GameGuard 后 的后续工作<br/>// 一些跳转<br/>char chrJMP[] = "\xeb" ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A256C, chrJMP, 1, FALSE) ; <br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2b4b, chrJMP, 1, FALSE) ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2d5b, chrJMP, 1, FALSE) ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2dcc, chrJMP, 1, FALSE) ;</p><p>// 一个函数我不知道他的用途,运行他会出错 干脆 NOP 掉了<br/>char chrNOP[] = "\x90\x90\x90\x90\x90\x90\x90" ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2cd9, chrNOP, 7, FALSE) ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005A2ceb, chrNOP, 4, FALSE) ;</p><p>// 下面这些函数的地址 也没什么用 用 SofICE 下断 很容易找到 <br/>// 钩挂 CreateProcess () 函数 <br/>LPVOID lpMyFunc ;<br/>lpMyFunc = (LPVOID)MyCreateProcess ;<br/>BOOL fOKa = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005b9104, (LPCVOID)&lpMyFunc, 4, FALSE) ;<br/><br/>// 改变 MU 窗口类风格<br/>//char cClssStyle[] = "\x03" ;<br/>//BOOL fOKb = WriteProcessMemory (m_hMuProcess, (LPVOID)0x0045D313, cClssStyle, 1, FALSE) ;<br/><br/>// 钩挂 CreateWindow 函数 改变窗口风格<br/>lpMyFunc = (LPVOID)MyCreateWindowEx ;<br/>BOOL fOKc = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B93DC, (LPCVOID)&lpMyFunc, 4, FALSE) ;<br/><br/>// 钩挂 ChangeDisplaySetting 函数 <br/>lpMyFunc = (LPVOID)MyChangeDisplay ;<br/>BOOL fOKd = WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9410, (LPCVOID)&lpMyFunc, 4, FALSE) ;</p><p>// 钩挂 send 函数<br/>lpMyFunc = (LPVOID)MySend ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9470, (LPCVOID)&lpMyFunc, 4, FALSE) ;</p><p>// 钩挂 recv ()<br/>lpMyFunc = (LPVOID)MyRecv ;<br/>WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9494, (LPCVOID)&lpMyFunc, 4, FALSE) ;<br/><br/>// 钩挂 SetTimer () <br/>//dwMyFunc = (DWORD)MySetTimer ;<br/>//WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B93cc, (LPCVOID)&dwMyFunc, 4, FALSE) ;</p><p><br/>// 钩挂 TextOut 函数<br/>//dwMyFunc = (DWORD)MyTextOut ;<br/>//WriteProcessMemory (m_hMuProcess, (LPVOID)0x005B9068, (LPCVOID)&dwMyFunc, 4, FALSE) ;</p><p><br/>//if (fOKa && fOKb && fOKc) <br/>// MessageBox (NULL, " 代码改好了 要出错了吗?", ":(", 0) ;</p><p>ResumeThread (m_hMuThread) ; <br/><br/>CloseHandle (m_hMuThread) ;<br/>CloseHandle (m_hMuProcess) ;</p><p>_endthreadex(0) ;<br/>return 0 ;<br/>}</p><p><br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// MU 子类化窗口过程<br/>LRESULT CALLBACK MuSubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<br/>{<br/>HANDLE hFile ;<br/>DWORD dwActBytes ;<br/><br/>switch (message) <br/>{<br/>case WM_CREATE :</p><p>m_hwndMu = hwnd ;<br/>break ;</p><p>case WM_TIMER :</p><p>if ((int)wParam == 1000)<br/>{<br/>KillTimer (hwnd, (int)wParam) ; // 不知道他是什么 但是必须 Kill<br/>return 0 ;<br/>}<br/>break ;</p><p>case WM_ACTIVATE : // 解决了Mu窗口不放弃焦点的问题<br/>wParam = 1 ;<br/>break ;</p><p>case WM_DESTROY :</p><p>// 顺便把 Mon 结束掉 <br/>TerminateProcess (m_lpProcessInfoMon -> hProcess, 0) ; <br/><br/>//// 将 m_lpsSend串写到磁盘 他们是 Send Recv 包<br/> if (!m_lpsSend) break ;<br/>hFile = CreateFile ("e:\\Mu Msg.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;<br/>WriteFile (hFile, m_lpsSend, m_strSendLen, &dwActBytes, NULL) ;<br/>CloseHandle (hFile) ;<br/>break ;</p><p>case 0x2B11 : // 看Main.exe 的代码 好象有这个 用户消息 但是从没接收到过他<br/>MessageBox (NULL, "0x2B11 Msg", "WndProc", 0) ; <br/>break ;<br/>}</p><p>return CallWindowProc (m_wpMuOldProc, hwnd, message, wParam, lParam); <br/> <br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// CreateWindowEx()<br/>EXPORT HWND WINAPI MyCreateWindowEx (DWORD dwExStyle,LPCTSTR lpClassName, LPCTSTR lpWindowName,DWORD dwStyle,<br/> int x,int y,int nWidth,int nHeight,<br/> HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam) <br/>{<br/>HWND hwnd = NULL ;<br/>if ( strcmp(lpClassName, "MU") == 0)<br/>{<br/>hwnd = CreateWindowEx (/*dwExStyle*/0,<br/>lpClassName, // window class name<br/>lpWindowName, // window caption<br/>WS_OVERLAPPEDWINDOW & (~WS_THICKFRAME ) & (~WS_MINIMIZEBOX) & (~WS_MAXIMIZEBOX), // window style<br/>0, // initial x position<br/>0, // initial y position<br/>640, // initial x size<br/>480, // initial y size<br/>hWndParent, // parent window handle<br/>hMenu, // window menu handle<br/>hInstance, // program instance handle<br/>lpParam) ; // creation parameters<br/>// 子类化 MU 窗口<br/>m_wpMuOldProc = (WNDPROC)SetWindowLong (hwnd, GWL_WNDPROC, (LONG) MuSubclassProc); <br/>}</p><p>else <br/>{<br/>hwnd = CreateWindowEx (dwExStyle,<br/>lpClassName, // window class name<br/>lpWindowName, // window caption<br/>dwStyle, // window style<br/>x, // initial x position<br/>y, // initial y position<br/>nWidth, // initial x size<br/>nHeight, // initial y size<br/>hWndParent, // parent window handle<br/>hMenu, // window menu handle<br/>hInstance, // program instance handle<br/>lpParam) ; // creation parameters<br/>}<br/>return hwnd ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// CreateProcess()<br/>EXPORT BOOL WINAPI MyCreateProcess (LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,<br/> LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,<br/> LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo,<br/> LPPROCESS_INFORMATION lpProcessInformation)<br/> <br/>{ <br/>CreateProcess (lpApplicationName, lpCommandLine, lpProcessAttributes,<br/> lpThreadAttributes, bInheritHandles, <br/> dwCreationFlags | CREATE_SUSPENDED, // 挂起 进程 GameMon.des<br/> lpEnvironment, lpCurrentDirectory, <br/> lpStartupInfo, lpProcessInformation) ;<br/>m_lpProcessInfoMon = lpProcessInformation ;<br/><br/>return TRUE ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// SetTime() 没必要 HOOK</p><p>EXPORT UINT_PTR WINAPI MySetTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)<br/>{</p><p>if (nIDEvent == 1003)<br/>{<br/>MessageBox (NULL, m_szMuMsg, "mu", 0);<br/>}</p><p>return (SetTimer (hWnd, nIDEvent, uElapse, lpTimerFunc)) ;<br/>}</p><p>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// send()</p><p>EXPORT int WINAPI MySend (SOCKET s, const char* buf, int len, int flags)<br/>{<br/>char szSendHex ;<br/>int i = 0 ;<br/>BYTE byte ;<br/>BYTE * pByte = (BYTE*)buf ;</p><p>for (int j = 0 ; j < len ; j++)<br/>{<br/>byte = *pByte >> 4 ;<br/>if (byte < 10) byte += 48 ;<br/>else byte += 55 ;</p><p>szSendHex = byte ;</p><p>byte = *pByte & 0x0F ;<br/>if (byte < 10) byte += 48 ;<br/>else byte += 55 ;</p><p>szSendHex = byte ;<br/>szSendHex = ' ' ;<br/>pByte ++ ;<br/>}<br/>szSendHex = 0 ;</p><p>static int iNumSend = 0 ;<br/>iNumSend ++ ;<br/><br/>m_strSendLen += sprintf (m_lpsSend + m_strSendLen, <br/>TEXT("%s %d PackLen : %d: \n %s\n"), "Send", iNumSend, len, szSendHex) ; <br/><br/>return send (s, buf, len, flags) ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// recv ()<br/>EXPORT int WINAPI MyRecv (SOCKET s, char* buf, int len, int flags)<br/>{</p><p>int iRetn = recv (s, buf, len, flags) ;<br/>char szRecvHex ;<br/>int i = 0 ;<br/>BYTE byte ;<br/>BYTE * pByte = (BYTE*)buf ;</p><p>// Get revc data len <br/>int iPackLen = (int)pByte ;<br/>if ( (! iPackLen) || iPackLen == 1 ) <br/>iPackLen = 2 ;</p><p>for (int j = 0 ; j < iPackLen ; j++)<br/>{<br/>byte = *pByte >> 4 ;<br/>if (byte < 10) byte += 48 ;<br/>else byte += 55 ;</p><p>szRecvHex = byte ;</p><p>byte = *pByte & 0x0F ;<br/>if (byte < 10) byte += 48 ;<br/>else byte += 55 ;</p><p>szRecvHex = byte ;<br/>szRecvHex = ' ' ;<br/>pByte ++ ;<br/>}<br/>szRecvHex = 0 ;</p><p>static int iNumRecv = 0 ;<br/>iNumRecv ++ ;<br/><br/>m_strSendLen += sprintf (m_lpsSend + m_strSendLen, <br/>TEXT("%s %d PackLen : %d iRetn : %d : \n %s\n"), "Recv", iNumRecv, iPackLen, iRetn, szRecvHex) ; </p><p><br/>return iRetn ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// TextOut() 没必要 HOOK</p><p>EXPORT BOOL WINAPI MyTextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString)<br/>{<br/>if (*lpString == 'G') <br/>{<br/>MessageBox (NULL, m_szMuMsg, "GameGaurd ?", 0) ;<br/>}<br/>return TextOut (hdc, nXStart, nYStart, lpString, cbString) ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// ChangeDisplay() 直接返回 不出现黑屏了<br/>EXPORT LONG WINAPI MyChangeDisplay (LPDEVMODE lpDevMode, DWORD dwflags)<br/>{<br/>return 0 ;<br/>}<br/>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p><br/>EXPORT void SetMuHandle(HANDLE hProcess, HANDLE hThread)<br/>{<br/>m_hMuProcess = hProcess ;<br/>m_hMuThread = hThread ;<br/>}</p><p>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// </p><p></p><p><br/>// MuDll.h 文件</p><p>#pragma once<br/>#include <Winsock2.h><br/>#pragma comment(lib, "Ws2_32")<br/>#include <windows.h><br/>#include <stdio.h><br/>#include <process.h></p><p>#include <Dbghelp.h><br/>#pragma comment(lib, "Dbghelp")</p><p>#include <Crtdbg.h> </p><p>#ifdef __cplusplus<br/>#define EXPORT extern "C" __declspec (dllexport)<br/>#else<br/>#define EXPORT __declspec (dllexport)<br/>#endif</p><p>#define NP_ADDRESS 0x005A2470<br/>#define NP_ADDRESS_V 0x1824448D<br/>#define NP_ADDRESS_END_A 0x005A2498<br/>#define GREAYE_PROCESS_A 0x0C6E0374<br/>#define GREAYE_PROCESS_V 0x6AEC8B55</p><p><br/>LRESULT CALLBACK MuSubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;</p><p>// 读写 MU.exe进程空间 代码 的 线程<br/>unsigned __stdcall ThreadReadWrite (PVOID pvoid) ;</p><p>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// 下面函数导出 给 InsertDll.exe 使用<br/>EXPORT void SetMuHandle (HANDLE hProcess, HANDLE hThread) ;</p><p> </p><p>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br/>// 下面定义 HOOK API 都以 My 开头<br/>// Hook CreateWindowEx Func<br/>EXPORT HWND WINAPI MyCreateWindowEx (<br/>DWORD dwExStyle,<br/>LPCTSTR lpClassName,<br/>LPCTSTR lpWindowName,<br/>DWORD dwStyle,<br/>int x,<br/>int y,<br/>int nWidth,<br/>int nHeight,<br/>HWND hWndParent,<br/>HMENU hMenu,<br/>HINSTANCE hInstance,<br/>LPVOID lpParam) ;<br/>EXPORT LONG WINAPI MyChangeDisplay (LPDEVMODE lpDevMode, DWORD dwflags) ; </p><p>EXPORT BOOL WINAPI MyCreateProcess(<br/>LPCTSTR lpApplicationName,<br/>LPTSTR lpCommandLine,<br/>LPSECURITY_ATTRIBUTES lpProcessAttributes,<br/>LPSECURITY_ATTRIBUTES lpThreadAttributes,<br/>BOOL bInheritHandles,<br/>DWORD dwCreationFlags,<br/>LPVOID lpEnvironment,<br/>LPCTSTR lpCurrentDirectory,<br/>LPSTARTUPINFO lpStartupInfo,<br/>LPPROCESS_INFORMATION lpProcessInformation<br/>);<br/>EXPORT UINT_PTR WINAPI MySetTimer (HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); <br/>EXPORT DWORD WINAPI MyWaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);<br/>EXPORT BOOL WINAPI MyTextOut (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString); <br/>EXPORT int WINAPI MySend (SOCKET s, const char* buf, int len, int flags);<br/>EXPORT int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);</p>
页:
[1]