制作Windows游戏外挂几个有用的函数

 除了很熟悉的跨进程注入(远程注入)等技术外。记录一些其它的小函数。 

1、mouse_event/key_event ( SendInput ) 按键/鼠标模拟(鼠标/键盘按键精灵)、

void mouse_event(
  DWORD     dwFlags,  //具体的按键动作,如:左键、右键等。
  DWORD     dx,       // x坐标
  DWORD     dy,       // y坐标
  DWORD     dwData,   // 数据,如滚轮动作,此参数表示滚轮滑动的角度等
  ULONG_PTR dwExtraInfo // 附加信息,使用LPARAM GetMessageExtraInfo();的返回值
);

void keybd_event(
  BYTE      bVk,      //1-254的虚拟键码.数值/字母为其ASCII码,其他以VK_开头的宏
  BYTE      bScan,    //硬件扫描码,
  DWORD     dwFlags,  //取值范围:KEYEVENTF_EXTENDEDKEY,KEYEVENTF_KEYUP(是否是抬起)
  ULONG_PTR dwExtraInfo //附件信息,通常为0
);
微软推荐使用上面2个函数的替代函数
UINT SendInput(
  UINT    cInputs, //pInputs元素的个数 
  LPINPUT pInputs, // 数据首地址,可包含多个鼠标、键盘动作
  int     cbSize // 必须为sizeof(INPUT)
);

//按键模拟示例:


   // 设置数字锁定键按下或抬起
   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];

      // 获取当前状态 
      GetKeyboardState((LPBYTE)&keyState);
      // 如果与要设置的状态不同
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {

         // 一个按键由2个动作组成

         // 先模拟一个按下数字锁定键
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

         // 再模拟一个抬起动作
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
       
      }
   }
Header winuser.h (include Windows.h)
Library User32.lib
DLL User32.dll

2、RegisterHotKey 注册系统热键

3、ToggleDesktop 任务栏的“显示桌面”按钮 (IShellDispatch4的函数) 样例:

#include 
#pragma comment(lib,"Shell32.lib")

void toggleDesktop( )
{
 //需要初始化COM,否则失败  CoInitialize(NULL);
IShellDispatch4 * pInterface = NULL;
HRESULT hResult = CoCreateInstance(
     CLSID_Shell,NULL,
    CLSCTX_ALL,
    __uuidof(IShellDispatch4),
    (void **)&pInterface);
if (!SUCCEEDED(hResult ))
{
    /// log: create IShellDispatch4 object failed.
    return;
}
ASSERT( NULL != pInterface );
hResult = pInterface ->ToggleDesktop();
if( !SUCCEEDED(hResult))
{
    /// log: create ToggleDesktop failed.
}
pInterface ->Release();
/// call succeeded!
}
Header

Shldisp.h

IDL

Shldisp.idl

DLL

Shell32.dll (version 6.0 or later)

4.BOOL IsDebuggerPresent(); 检查当前程序是否 使用用户态的调试器在调试。

头是件 debugapi.h (include Windows.h)
编译库 Kernel32.lib
动态库 Kernel32.dll

 

5.ReadProcessMemory/WriteProcessMemory读写进程内存

BOOL ReadProcessMemory(

HANDLE hProcess, // 目标进程句柄,此句柄必须有PROCESS_VM_READ权限

LPCVOID lpBaseAddress, //要读取的内存起始地址,目标进程

LPVOID lpBuffer, //读取的数据缓存

SIZE_T nSize,    //读取的数据缓存的长度

SIZE_T *lpNumberOfBytesRead  // 实际读取的数目

);
//写入,参数函数类似于读取
BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);
Header memoryapi.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

 

6.BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD   wAttributes );

BOOL WINAPI GetConsoleScreenBufferInfo( _In_  HANDLE                      hConsoleOutput, _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo );

读取(监视)控制台缓冲

Header

ConsoleApi2.h (via Wincon.h, include Windows.h)

Library

Kernel32.lib

DLL

Kernel32.dll

 

9.BOOL GetSystemPowerStatus( LPSYSTEM_POWER_STATUS lpSystemPowerStatus );获取电源相关数据(包括当前电量)

Header winbase.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

10.int GetTextCharset( __in HDC hdc ); 获取当前的语言环境。如:中文,英文等。

Header wingdi.h (include Windows.h)
Library Gdi32.lib
DLL Gdi32.dll

11.LPCH GetEnvironmentStrings(); 获取当前进程的系统环境变量。

Header processenv.h (include Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2, Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

 

你可能感兴趣的:(VC++,Windows)