aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 112113|回复: 39

自动玩扫雷,鼠标模拟+远程call

 火.. [复制链接]

2

主题

7

回帖

86

积分

一级会员

积分
86
发表于 2011-10-11 21:45:03 | 显示全部楼层 |阅读模式
本帖最后由 www378660084 于 2011-10-11 22:19 编辑

import process;
import winex;
import mouse;
import key;

//地址是在我的xp机器上找到的,不知道一不一样~~~~
/*
MOD:
    模式
    0:call模式
    1:鼠标模拟模式
*/

var MOD = 1
var CALLADDR = 0x010037E1   //call地址
var DATABASE = 0x1005340    //棋盘基址
var SETBASE = 0x01005330    //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
var XYBASE = 0x01005118     //call参数:XYBASE:x   XYBASE+4:y


var prc = process("winmine.exe") //创建扫雷进程

var act,hwnd;

if(MOD){  //鼠标模式
    hwnd = winex.waitVisible("扫雷");  //获取窗口句柄
    win.getActive(hwnd);                //激活窗口
    x,y,cx,cy=win.getPos(hwnd);         //获取窗口坐标
}else{  //call模式
    act = prc.remoteApi("void()", CALLADDR);  //获取远程call
}

var width = prc.readNumber(SETBASE+4,"INT")
var height = prc.readNumber(SETBASE+8,"INT")
for(j=1;height)
for(i=1;width)
{
    n = prc.readNumber(DATABASE+i+32*j,
"byte")  //棋盘基址+x+y*32=棋盘点的值
    /*
        n:棋盘点的值
        未点击时:无雷:0f;;;有雷,8f (有用)
        点击后:无雷:4x,x=周围雷的个数;;;有雷8x
    */

   
if(n==0x0f)  
    {
        
if(MOD){
            mouse.move(x+4+16*i,y+96+16*j,
true);  //移动到坐标点
            mouse.click();                      //点击
            //sleep(500)  
        }else{
            prc.writeNumber(XYBASE,i,
"INT")  //写X坐标
            prc.writeNumber(XYBASE+4,j,"INT")  //写Y坐标
            act();                              //点击函数
        }
    }
}
prc.free();         
//释放句柄


评分

参与人数 3 +170 +30 收起 理由
qqmmcc + 50 + 30
quicker + 100 不错
低调点 + 20 赞一个!

查看全部评分

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2021-11-4 16:37:50 | 显示全部楼层
改进了一下,可以在 Win10 上直接运行,
另外,其实 aardio 可以直接在外部进程内存读写结构体:

//自动扫雷
import winex;
import mouse;
import process;

//启动扫雷游戏
import process.winmine;
var prcs = process.winmine();

//自进程内存读取结构体,写内存用 prcs.write 函数。
var setting = prcs.readStruct(0x01005330,{
    INT count;
//雷点个数
    INT width;//棋盘宽
    INT height;//棋盘高
})

if(false){  
   
//方法一:鼠标模式
    hwnd = winex.waitVisible("扫雷");//获取窗口句柄
    win.showForeground(hwnd);//激活窗口

    sweep =
function(x,y){
        x,y = win.toScreen(hwnd,1+16*x,50+16*y);
//转换为屏幕坐标
        mouse.click(x,y,true); //在指定坐标模拟鼠标单击
    }
}
else{  
   
//方法二:远程Call( 直接调用 EXE 里的函数 )
    var addrCall = 0x010037E1 //call地址
    var addrPoint = 0x01005118 //call参数:addrCallPoint:x   addrCallPoint+4:y
   
   
//获取远程call
    var act = prcs.remoteApi("void()", addrCall);
   
    sweep =
function(x,y){
        
//写入结构体到外部进程
        prcs.write(addrPoint,{
            INT x = x;
            INT y = y;
        })
        
        act();
//远程Call 点击函数
        thread.delay(10); //加点延时
    }
}

var addrDatabase = 0x1005340 //棋盘基址
for(y=1;setting.height){
   
for(x=1;setting.width){
        
//未点击时:无雷:0f;;;有雷,8f (有用),点击后:无雷:4x,x=周围雷的个数;;;有雷8x
        n = prcs.readNumber(addrDatabase+x+32*y,"byte") //棋盘基址+x+y*32=棋盘点的值
        if(n==0x0f) sweep(x,y);
    }
}

//释放进程对象
prcs.free();

65

主题

881

回帖

5033

积分

荣誉会员

积分
5033
发表于 2011-10-11 22:05:44 | 显示全部楼层
在IDE里 右键复制到HTML  然后论坛发帖选择高级模式  
这样看起来效果更好 代码有高亮  层次更清晰....

2

主题

7

回帖

86

积分

一级会员

积分
86
 楼主| 发表于 2011-10-11 22:21:01 | 显示全部楼层
xj199241 发表于 2011-10-11 22:05
在IDE里 右键复制到HTML  然后论坛发帖选择高级模式  
这样看起来效果更好 代码有高亮  层次更清晰....

改过来了,谢谢提醒

43

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2011-10-11 22:34:48 | 显示全部楼层
本帖最后由 编程 于 2011-10-16 21:40 编辑

{:soso_e179:} 楼主很强,附小修改后的代码,供参考

import key;
import mouse;
import process;
import winex;
import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; text="aardio Form";right=346;bottom=138 )
winform.add(
btnCall={ bottom=88;text=
"Call自动扫雷";left=187;top=49;z=2;right=291;cls="button" };
btnMouse={ bottom=88;text=
"鼠标自动扫雷";left=52;top=49;z=1;right=156;cls="button" }
)
/*}}*/

var CALLADDR = 0x010037E1   //call地址
var DATABASE = 0x1005340    //棋盘基址
var SETBASE = 0x01005330         //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
var XYBASE = 0x01005118                //call参数:XYBASE:x   XYBASE+4:y

sweeper  =
function(byMouse){

   
var prc = process("winmine.exe") //创建扫雷进程
    //这里最好指定进程ID,不然会找到你刚发的贴子窗口,因为浏览器标题栏也有"扫雷"这几个字
    hwnd = winex.waitVisible( "<扫雷>|<Minesweeper>",,,,,prc.id );  //获取窗口句柄      
    win.setForeground(hwnd) //外部进程最好用这个函数              
    var x,y,cx,cy=win.getPos(hwnd);    //获取窗口坐标
   
   
var width = prc.readNumber(SETBASE+4,"INT")
   
var height = prc.readNumber(SETBASE+8,"INT")
   
var Act_c = prc.remoteApi("void()", CALLADDR);  //获取远程call
    for(j=1;height){
        
for(i=1;width) begin
            
var n = prc.readNumber(DATABASE+i+32*j,"byte")  //棋盘基址+x+y*32=棋盘点的值
            // 未点击时:无雷:0f;;;有雷,8f (有用) 点击后:无雷:4x,x=周围雷的个数;;;有雷8x
            if(n==0x0f) {
               
if(byMouse){
                    mouse.move(x+4+16*i,y+96+16*j,
true);  //移动到坐标点
                    mouse.click();  
                    win.delay(10);
//加点延时,不然太快完成看不到过程
                }
               
else {
                    prc.writeNumber(XYBASE,i,
"INT")  //写X坐标
                    prc.writeNumber(XYBASE+4,j,"INT")  //写Y坐标
                    Act_c();//点击函数
                    win.delay(100); //加点延时,不然太快完成看不到过程
                }
            };
        
end;
    }
    prc.free();  
//释放句柄
}

winform.btnCall.oncommand =
function(){
    sweeper(
false)
}
  
winform.btnMouse.oncommand=
function(){
    sweeper(
true)
}

winform.show()
import win.version
if( ! win.version.isXp ) {
    winform.msgboxErr(
"此程序仅用于XP系统扫雷游戏")
    winform.btnCall.disabled=
true;
    winform.btnMouse.disabled=
true;
}

win.loopMessage();

点评

真棒: 5.0
真棒: 5
  发表于 2011-10-12 09:28

2

主题

7

回帖

86

积分

一级会员

积分
86
 楼主| 发表于 2011-10-11 23:02:07 | 显示全部楼层
编程 发表于 2011-10-11 22:34
楼主很强,附小修改后的代码,供参考

import key;

看了改动的几处,都很不错,3ks,昨晚不能上网抽空研究一下aardio,写了这个玩意,感觉aardio用起来真的很不错~
论坛的代码要能加上高亮就好了

5

主题

118

回帖

1483

积分

四级会员

积分
1483
发表于 2011-10-11 23:54:41 | 显示全部楼层
远程call看起来有难度,不错的范例

4

主题

146

回帖

862

积分

三级会员

积分
862
发表于 2011-10-12 07:35:00 | 显示全部楼层
很好的学习资料。收藏备用了!

14

主题

51

回帖

386

积分

荣誉会员

积分
386
发表于 2011-10-12 08:51:24 | 显示全部楼层
强大{:soso_e100:},学习。

0

主题

12

回帖

166

积分

一级会员

积分
166
发表于 2011-10-12 09:53:34 | 显示全部楼层
很好的学习资料。

9

主题

70

回帖

583

积分

三级会员

积分
583
发表于 2011-10-12 13:24:13 | 显示全部楼层
楼上好牛啊。不错。

0

主题

5

回帖

183

积分

一级会员

积分
183
发表于 2011-10-16 00:18:55 | 显示全部楼层
顶。aardio真的不错

7

主题

115

回帖

747

积分

三级会员

积分
747
QQ
发表于 2011-10-16 16:21:04 | 显示全部楼层
顶起来,好好学习

6

主题

16

回帖

136

积分

一级会员

积分
136
发表于 2011-10-16 20:34:13 | 显示全部楼层
很好的学习材料

16

主题

84

回帖

662

积分

三级会员

积分
662
发表于 2011-10-17 12:38:29 | 显示全部楼层
Call是怎么找到的?共享一下方法呗,嘿嘿

3

主题

10

回帖

72

积分

一级会员

积分
72
发表于 2011-11-21 00:00:06 | 显示全部楼层
我晕,我想知道,函数基值这样的东西是怎么查的?

9

主题

86

回帖

630

积分

三级会员

叫我何细尔

积分
630
QQ
发表于 2011-12-23 19:11:32 | 显示全部楼层
用CE 或OD 不知我说的可行。

0

主题

3

回帖

18

积分

新手入门

积分
18
发表于 2011-12-27 13:24:50 | 显示全部楼层
{:soso_e179:}
高!

0

主题

3

回帖

17

积分

新手入门

积分
17
发表于 2011-12-30 11:53:40 | 显示全部楼层
Cheat Engine

ollydbg

Dependency Walker  这个最简单了

0

主题

1

回帖

36

积分

新手入门

积分
36
发表于 2012-1-17 10:40:01 | 显示全部楼层
马克。  留着学习。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-3-1 10:16 , Processed in 0.080649 second(s), 33 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表