搜索
查看: 4414|回复: 16
打印 上一主题 下一主题

XP版扫雷外挂(C++语言)

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 15:03:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家可以试试
[mw_shl_code=c,true]# include <stdio.h>
# include <stdlib.h>
# include <windows.h>
# include <Tlhelp32.h>   //枚举进程库
# include <string.h>

RECT Rect2;
int PrintfPID (void);//枚举进程
void MouseL (int x,int y);//鼠标左击
void MouseR (int x,int y);//鼠标右击
void ReadMemory (HANDLE q); //读取内存
int main (void)
{
        HANDLE WindowHandle,ProcessHandle; //窗口句柄
        RECT Rect;        //定义矩形数据类型
        LPCTSTR lpClassName = "扫雷"; //窗口类名
        LPCTSTR lpWindowName = "扫雷"; // 窗口标题
        int ProcessPID;
       
        while (1)
        {
                printf ("按任意键开始\n");
                system ("pause");
                WindowHandle = FindWindowA (lpClassName,lpWindowName);  //返回窗口句柄
                GetWindowRect ((HWND)WindowHandle,&Rect); //获取窗口矩形
                ProcessPID = PrintfPID ();
                ProcessHandle = OpenProcess (PROCESS_ALL_ACCESS,0,ProcessPID);
                Rect2.left = Rect.left + 25; //边到雷区有25;
                Rect2.top = Rect.top + 110; //顶到雷区有110;
                ReadMemory (ProcessHandle);
                CloseHandle (ProcessHandle);
        }
        system ("pause");
        return 0;
}

int PrintfPID (void)  //枚举进程
{
    char ProcessName [12] = "winmine.exe";
    PROCESSENTRY32  processInfo;
    int judgment;
   
    HANDLE hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);//获取进程快照句柄
   
    processInfo.dwSize = sizeof (processInfo);  //设置大小
    bool bGetProcess = Process32First ( hSnapshot, &processInfo );//进程入口
   
    while (bGetProcess != false)
    {
       judgment = lstrcmpi (processInfo.szExeFile,ProcessName);//进程名比较
       if (judgment == 0)
          break;
       bGetProcess = Process32Next (hSnapshot,&processInfo); //获取下一个进程信息
    }        
   
    judgment = lstrcmpi (processInfo.szExeFile,ProcessName);//再比较一次.以确定最后一个进程退出还是,找到进程名退出
    if (judgment == 0)
       return processInfo.th32ProcessID;  //返回进程PID
    else
       return 0;
}

void MouseL (int x,int y)//鼠标左击
{
    //mouse_event( MOUSEEVENTF_MOVE,x,y,0,0);//鼠标移动
    SetCursorPos (x,y);
    mouse_event( MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0);//鼠标左击.按下与弹起      
}
void MouseR (int x,int y)//鼠标右击
{
    mouse_event( MOUSEEVENTF_MOVE,x,y,0,0); //鼠标移动
    mouse_event( MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP,0,0,0,0);      
}

void ReadMemory (HANDLE q) //读取内存
{   
        MouseL (Rect2.left,Rect2.top);
    MouseL (Rect2.left,Rect2.top);
    int i,l,c,line = 1,x,a;
    PVOID h;
    int level;
    char ch[9];
    int Memory = 16798561;
    //MouseL (Rect2.left,Rect2.top);  
    //MouseL (Rect2.left,Rect2.top);  
    //printf ("%d %d", Rect2.left,Rect2.top);
   
    for (i = 1; i <= 720; ++i,++a)
    {
      
      
       ReadProcessMemory(q,(LPCVOID)Memory,&h,4,0);
       level = (int)h;
       //printf ("%x %d\n",h,Memory);   
           
       sprintf (ch,"%x",level);
      
       Memory = Memory + 1;
   
           if (strlen (ch) < 8)
       {       
                       printf ("%c%c ",ch[5],ch[6]);
                           if ( (ch[5] != '8') && (ch[6] != 'a') )
                       {
                               //printf ("%c%c ",ch[5],ch[6]);
                                MouseL (Rect2.left,Rect2.top);
                        }       
           }
           else
           {
                           printf ("%c%c ",ch[6],ch[7]);
                          
                           if ( (ch[6] != '8')&& (ch[7] != 'a') ) //8F等于雷
                       {
                               //printf ("%c%c ",ch[6],ch[7]);
                                //printf ("%c%c ",ch[6],ch[7]);
                    MouseL (Rect2.left,Rect2.top);
                           //printf ("%d %d\n",Rect2.left,Rect2.top);  
                           //printf ("%s ",ch);
                       }
           }
      
       Rect2.left = Rect2.left + 16;  
       if (i == 30 * line)
       {
           Memory = Memory + 2;
           ++line;
                   a = 1;
                   Rect2.left = Rect2.left - 480;
                   Rect2.top = Rect2.top + 16;
                   printf ("\n");   
       }
           //Sleep (50);
    }
       
} [/mw_shl_code]



QQ拼音截图未命名.png (15.85 KB, 下载次数: 3)

QQ拼音截图未命名.png

QQ拼音截s图未命名.png (13.51 KB, 下载次数: 3)

QQ拼音截s图未命名.png

XP版扫雷外挂.zip

79.14 KB, 下载次数: 78

推荐
 楼主| 发表于 2013-2-5 15:24:09 | 只看该作者
我发个程序

外挂.zip

5.65 KB, 下载次数: 45

点评

太厉害了!!!  发表于 2014-5-30 20:25
沙发
 楼主| 发表于 2013-2-4 15:05:14 | 只看该作者
window7不要测试后果严重
板凳
发表于 2013-2-4 15:21:32 | 只看该作者

回帖奖励 +5

为什么会编译失败?
地板
发表于 2013-2-4 19:00:29 | 只看该作者
学习下  谢谢提供
5#
 楼主| 发表于 2013-2-5 15:18:10 | 只看该作者
a5875575 发表于 2013-2-4 15:21
为什么会编译失败?

用dev C++编译成功,因为我用C++,啊哈C不成功
6#
 楼主| 发表于 2013-2-5 15:18:50 | 只看该作者
a5875575 发表于 2013-2-4 15:21
为什么会编译失败?

可能少个;号
8#
 楼主| 发表于 2013-2-5 15:27:42 | 只看该作者
一直来都只是放着这个扫雷外挂的代码,却没写怎么写这个程序的,下面是分析扫雷程序代码的过程
在command中用命令Bp rand下断,F9运行程序,下面是断点返回到地雷生成过程的函数分析;
[python] view plaincopy
010036BC    893D 60510001   MOV DWORD PTR DS:[1005160],EDI  
010036C2    A3 30530001     MOV DWORD PTR DS:[1005330],EAX  
010036C7    FF35 34530001   PUSH DWORD PTR DS:[1005334]              ; 将横坐标的值(窗口模式x*y中x的值)入栈  
010036CD    E8 6E020000     CALL winmine.01003940                    ; 得到横坐标上的随机数==   rand()%x  
010036D2    FF35 38530001   PUSH DWORD PTR DS:[1005338]              ; 将纵坐标的值入栈  
010036D8    8BF0            MOV ESI,EAX  
010036DA    46              INC ESI                                  ; rand()%y+1  
010036DB    E8 60020000     CALL winmine.01003940                    ; 得到纵坐标上的随机值==  rand()%A  
010036E0    40              INC EAX                                  ; rand()%x+1  
010036E1    8BC8            MOV ECX,EAX  
010036E3    C1E1 05         SHL ECX,5                                ; (rand()%x+1)<<5  
010036E6    F68431 40530001>TEST BYTE PTR DS:[ECX+ESI+1005340],80    ; 判断是否已经是地雷了  
010036EE  ^ 75 D7           JNZ SHORT winmine.010036C7               ; 如果是,那么重新取值  
010036F0    C1E0 05         SHL EAX,5                                ; (rand()%x+1)<<5  
010036F3    8D8430 40530001 LEA EAX,DWORD PTR DS:[EAX+ESI+1005340]   ; (rand()%x+1)<<5 + rand()%y+1 + 1005340  
010036FA    8008 80         OR BYTE PTR DS:[EAX],80                  ; 标记成地雷 8F = 80|0F  
010036FD    FF0D 30530001   DEC DWORD PTR DS:[1005330]               ; 要设置的地雷数减1  
01003703  ^ 75 C2           JNZ SHORT winmine.010036C7               ; 若还需要生成地雷,往回跳  
01003705    8B0D 38530001   MOV ECX,DWORD PTR DS:[1005338]           ; 宽y  
0100370B    0FAF0D 34530001 IMUL ECX,DWORD PTR DS:[1005334]          ; x*y  
01003712    A1 A4560001     MOV EAX,DWORD PTR DS:[10056A4]           ; 雷数 [10056A4]  
01003717    2BC8            SUB ECX,EAX                              ; 得到非地雷数 x*y-0x42  
01003719    57              PUSH EDI                                 ; EDI=0  
0100371A    893D 9C570001   MOV DWORD PTR DS:[100579C],EDI  
01003720    A3 30530001     MOV DWORD PTR DS:[1005330],EAX           ; 地雷数目存在 地址 1005330  
01003725    A3 94510001     MOV DWORD PTR DS:[1005194],EAX           ; 未标记的地雷数目存在 地址 1005194  
0100372A    893D A4570001   MOV DWORD PTR DS:[10057A4],EDI  
01003730    890D A0570001   MOV DWORD PTR DS:[10057A0],ECX           ; 总的小块数 x*y  
01003736    C705 00500001 0>MOV DWORD PTR DS:[1005000],1  
01003740    E8 25FDFFFF     CALL winmine.0100346A  
01003745    53              PUSH EBX  
01003746    E8 05E2FFFF     CALL winmine.01001950  
0100374B    5F              POP EDI  
0100374C    5E              POP ESI  
0100374D    5B              POP EBX  
0100374E    C3              RETN  
9#
 楼主| 发表于 2013-2-5 15:29:31 | 只看该作者
以上代码用C语言写就是
//差不多这意思,不是按上面的反汇编代码来写的  
int x; // 模式x值 内存地址 1005334  
int y; // 模式Y值 内存地址 1005338  
  
int Mine[(x<<5)*y]; // 存储地雷地址 &Mine[0] = 1005340  
  
int TotalMine = 10;//地雷总数 地址1005330  
  
void SetMine()  
{  
    int i = TotalMine;  
    while ( i > 0)  
    {  
        int tmp_x = rand() % x + 1;//随机生成x坐标点位置  
        int tmp_y = rand() % y + 1;//Y坐标点位置  
        if ( (Mine[(tmp_x<<5) + tmp_y]&0x80) == 0 )//判断是不是已经是地雷了  
        {  
            Mine[(tmp_x<<5) + tmp_y] |= 0x80; //标记地雷  
            i-- ;  
        }  
         
    }  
}  
10#
 楼主| 发表于 2013-2-5 15:29:49 | 只看该作者
从上面代码可以得到以下信息:
地雷个数地址 : 1005330
地雷窗口宽度x值 : 1005334
地雷窗口高度y值 : 1005338

扫雷模式 :10056A0
=0 初级
=1 中级
=2 高级
=3 自定义

地雷标记:
无雷:0x0F
有雷:0x8F

点评

eeeeeeeeeeeeeee  发表于 2013-2-5 21:42
11#
发表于 2013-2-8 00:34:32 | 只看该作者
{:soso_e183:}菜鸟膜拜
12#
发表于 2013-6-2 10:50:37 | 只看该作者
扫雷也有挂啦,。呵呵
13#
发表于 2014-5-25 20:29:45 | 只看该作者
我自己玩3秒钟
14#
发表于 2014-6-30 21:53:03 | 只看该作者
。。。。win7为何不能用?
15#
发表于 2014-9-30 22:01:28 | 只看该作者
cad20020601 发表于 2014-6-30 21:53
。。。。win7为何不能用?

地址偏移量不同,修改一下可以用,我没有修改运行这个Windows崩溃。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表