能力值:
( LV9,RANK:780 )
|
-
-
26 楼
东西不错,学习了,刚才测试了下,秒杀没有了
|
能力值:
( LV5,RANK:60 )
|
-
-
27 楼
就是没棋子找0,有棋子找非0,很简单,多找几次,这个棋子数不超过256个,应该是字节表示的,你按字节搜索就行了
|
能力值:
( LV5,RANK:60 )
|
-
-
28 楼
可能是游戏更新了,或者太老了,基址可能不一样了,要用的话可以自己找下基址,在前面宏那地方把棋盘基址换了应该就能用了,最近忙考研,很久没上看雪了,等考研结束了再回来~
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
源码是个好东西!!
|
能力值:
( LV13,RANK:460 )
|
-
-
30 楼
mark,媳妇常玩这游戏,留用:)
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
如果程序运行不了,重新定位下基址就好了,楼主这个郁金香教程进化来的吧
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
好东西 得好好学习下 谢谢楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
学C++ 下来看看
|
能力值:
( LV5,RANK:60 )
|
-
-
34 楼
这个警告要关你的游戏的时候你可以不要点确定,这时候游戏还可以继续玩,继续搜索内存,最近有时间我又重新找了下XP下的地址,可以把前面宏改成下面这样就能用了
#define XP_TABLE_BASE 0x0012A480
#define XP_REMAIN_BASE 0x00115CDC //0x001163B0
#define XP_TIME_BASE 0x00117744 //0x00117E18
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
都是牛啊。我晕死
|
能力值:
( LV9,RANK:140 )
|
-
-
36 楼
感谢分享..............
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
thank you very much ! 下载下来学习学习 !
|
能力值:
( LV3,RANK:20 )
|
-
-
38 楼
It's great !
Thank you very much !
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
thanks a lot
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
sendmessage以最快的速度模拟点击
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
不错的呀 还从来都没有弄过连连看的 灰常有兴趣 试试看
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
我是有兴趣的菜鸟
|
能力值:
( LV15,RANK:1673 )
|
-
-
43 楼
有朋友在玩这个.下个来学习学习
|
能力值:
( LV3,RANK:30 )
|
-
-
44 楼
qq游戏连连看是比较简单的游戏,我们猜测程序员定义了19*11大小的数组来存放连连看棋盘上面的棋子数据
鉴于这个数组比较大,而棋子没有很多所以认为8位二进制就足够表示棋子的类型了,假定程序员使用的是BYTE类型数组
使用CE工具查找游戏进程,我们猜测没有棋子的位置值为0,然后不断练来让棋盘数据不同来构造条件让我们猜到数组的地址
我们来关注第一个位置的棋子让它的值初始为空我们扫描内存,然后刷新下棋盘,根据刷新结果来修改ce的条件
比如从没有变成了有棋子,我们就修改为增加的数值,然后如果两次都有棋子但是棋子不同就使用过滤条件改变的值
最后找到满足我们所有设置的条件的一个或者几个值,然后od载入 查看 从这个地址开始19*11之后的数值是不是跟棋盘一样
(为了容易区分是不是,可以构造很多的空白没有棋子的棋盘)找到后就能确定棋盘数组的基址,然后就能读出后续的内存值
读到一个数组里面,为了自己找能消去的一对用,然后就是想办法去点击能消去的某些棋子,这里使用发送虚拟鼠标消息进行欺骗
为了发送虚拟按键消息,我们必须找到某个棋子在电脑上面的地址,因为窗口在桌面上的位置不固定(你也可以固定,那你就蛋疼了)
于是我们使用相对坐标,使用spy++记录我们自己点击第一个棋子的坐标,然后根据每个棋子的大小来计算每个棋子的坐标
棋子的大小可以截屏,算像素分别除以 19 跟11 结果是 35 31
然后就是怎么找能消去的一对了这个不是技术问题了 是算法的东西了 因为我们大话数据结构还没看多少 暂时不讨论了
注意读取内存使用的是根据窗口标题找句柄找pid 找进程句柄 然后使用 ReadProcessMemory 读取其内存
注意 不同系统的基址不同 (win 7 0x0012A444 而 xp后面是 0x0012A480)不同版本的游戏基址貌似也不同
|
能力值:
( LV3,RANK:30 )
|
-
-
45 楼
//TODO: Add your control notification handler code here
//获取窗口句柄
HWNDgameh=::FindWindow(NULL,gameCaption);
//获取窗口进程ID
DWORDprocessid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定进程
HANDLEprocessH=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读指定进程 内存数据
DWORD byread;
LPCVOIDpbase=(LPCVOID)0x0012A444; //棋盘数据基址
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processH,pbase,nbuffer,11*19,&byread);
///显示棋盘数据
charbuf[11];
m_chessdata="";//清空编辑
for (int y=0;y<=10;y++)
{
for (int x=0;x<=18;x++) //读一行
{
itoa(chessdata[y][x],buf,16); //转换成字串
m_chessdata+=buf;
m_chessdata+=" ";
}
//换行
m_chessdata+="\r\n";
}
UpdateData(false);
HWNDhwnd=::FindWindow(NULL,gameCaption);
intlparam;
lparam=(y<<16)+x+31*2;//表示指定格
::SendMessage(hwnd,WM_LBUTTONDOWN,0,lparam);//
::SendMessage(hwnd,WM_LBUTTONUP,0,lparam); //
|
能力值:
( LV3,RANK:30 )
|
-
-
46 楼
这个玩意我也弄过,不过找能消去的一对的那个代码我没写直接拿人家现成的
|
能力值:
( LV3,RANK:30 )
|
-
-
47 楼
这个是郁金香视频简单版本的代码
我只是修改了下棋盘的基址
不同系统 不同版本的游戏基址是有可能变化的
找能消去的比较麻烦就没自己去实现
|
能力值:
( LV3,RANK:30 )
|
-
-
48 楼
去年的帖子了 啥时候被顶上来的
精华哦 不错嘛 楼主 支持下
|
能力值:
( LV2,RANK:10 )
|
-
-
49 楼
好東西呀,必須看看
|
能力值:
( LV3,RANK:20 )
|
-
-
50 楼
如果是仿造郁金香的 那就没什么意思了。如果是逆向改 判断代码还有点意思
|
|
|