QQ连连看小外挂

  1. 找到程序本身的 exe
  2. 去掉程序中的广告
  3. 写一个 QQ 连连看的外挂

先双击运行 qqllk.exe,出现一广告窗口,后点击开始游戏按钮,出现另外一个百度广告窗口。
通过 PChunter32 查看可知 qqllk.ocx 是 qqllk.exe 的子进程广告程序,qqllk.exe 又是 explorer.exe
的子进程。在百度广告窗口点击继续按钮就打开了真正的游戏窗口 kyodai.exe。

image.png

然后使用 PEid 扫描程序所在文件夹就知道存在这三个程序执行文件。

image.png

Qqllk.exe delphi 程序
Qqllk.ocx 是一个加 aps 壳可执行文件
Keyodai.exe 可执行文件
发现直接打开 keydai.exe 运行不了游戏
火绒剑检测 Qqllk.ocx 行为,发现修改了 Keyodai.exe

image.png

想要了解程序的执行流程,看看程序之间到底干了什么,可以直接把 qqllk.exe 拖到 OD
CreateWindowExW CreateProcessW api 下断点

系统 api 代码

image.png
image.png

第一个广告窗口


image.png

第二个程序进程


image.png

第二个广告窗口


image.png

打开第二个 OD,附加或者直接打开第二个广告程序,但是要先设置 strongOD 才能调试多个


image.png

然后重启 OD。
CreateprocessA 或 W 下断点

image.png

查看到 kyodai.exe 被创建即被挂起

image.png

直接用另一个 OD 打开游戏程序找到 winmain 函数


image.png

跟进去看看
一看貌似没有恢复

image.png

当执行完第二个广告后 Winmain 代码被改变,游戏程序便能正常执行


image.png

猜测是第二个广告程序在创建游戏进程挂起的时候修改了 winmian 的地方。
那么我们可以在 Qqllk.ocx 程序中的 resumethread 和 writeprocessmemory 下断点

image.png

然后执行唤起操作

image.png

由此去广告暂时有了两个方案:
1、只要启动 keyoai.exe 到指定的 0x43817A 地址上修改,使用 loadPE 计算出这个地址在文件
中的位置,然后将其值修改成 0 就可以了。
2、通过运行第二个广告程序后,运行到游戏程序的 OEPC 处直接 dump。

直接用第二种方式:
现在第一个 OD 运行 Qqllk.ocx,执行到唤起处,
另外一个 OD 附加 keyoai.exe,然后查看内存,查看 PE 头,找到 OEP 下断,
第一个 OD 继续执行,另外一个 OD 继续执行到 OEP 处直接 dump 出来即可。

image.png

到此处 dump

image.png

然后可以直接双击打开运行 dump 出来的程序,即可正常运行。
/*思路一 : 指南针 配合清除函数
1.根据 ce 搜索到减少道具数值的地方
2.跟出减少道具数值函数
3.来到 调用减少道具数值函数的地方

  1. 查找是谁调用的减少道具数值函数
    5.即可找到关键点 道具分发函数 f0-fb 间
    6.可以通过该函数调用多个道具
    */
    思路二 : 查找炸弹函数

可以先从简单的思路二入手,尝试查找炸弹函数,内联汇编调用
经过观察,可以通过炸弹的声效文件 flystar.wav 查找所有参考文本字串

image.png

查找所有命令 push 00459250

image.png

全部命令下断点
再次运行游戏,玩到点击炸弹的时候,断点在下图

image.png

然后查看堆栈调用

image.png

回车,在此下断点,重新运行游戏(注意每次运行游戏可以选 A 级别然后点击练习可以简
单点),玩到获得炸弹道具后,点击炸弹道具,运行到此后单步步过执行

image.png

执行到此发现 edx 发生变化,多次执行其他道具可以发现

image.png

指南针对应 edx = F0
重列对应 edx = F1
炸弹对应 edx = F4
执行完 0041de5c 处后断到 0041ec07,执行完后炸弹减少,两个卡牌消失
在此往上找到 case F4,可知是道具分支调用

image.png

因此 0041de5c 处 call 的是道具分发函数
由此内嵌调用以下汇编代码即可调用炸弹做出一个小外挂

0041DE4D |. 8B86 94040000 MOV EAX,DWORD PTR DS:[ESI+0x494] ; dump.0044CE70
0041DE53 |. 8D8E 94040000 LEA ECX,DWORD PTR DS:[ESI+0x494]
0041DE59 |. 52 PUSH EDX
0041DE5A |. 53 PUSH EBX
0041DE5B |. 53 PUSH EBX
0041DE5C |. FF50 28 CALL DWORD PTR DS:[EAX+0x28]

据观察,edx,ebx的赋值容易,但是要找esi的值。

image.png

但是由于栈保存的值不是固定的,所以要找到固定的。

可以打开CE软件,打开调试进程查找12A1F4,找到几个静态地址

image.png

经过测试上面三个绿色地址都可以赋值给esi。

下面就可以编写外挂插件

新建MFC DLL 工程

image.png

关键文件代码如下:

QQPlugin.cpp

#include "stdafx.h"

#include "QQPlugin.h"

#include "QQPlugindll.h"

#ifdef _DEBUG

#define new *DEBUG_NEW*

#endif

// CQQPluginApp

*BEGIN_MESSAGE_MAP*(CQQPluginApp, *CWinApp*)

*END_MESSAGE_MAP*()

// CQQPluginApp 构造

CQQPluginApp::CQQPluginApp()

{

// TODO:  在此处添加构造代码,

// 将所有重要的初始化放置在 InitInstance 中

}

// 唯一的一个 CQQPluginApp 对象

CQQPluginApp theApp;

// CQQPluginApp 初始化

#define WM_MOD_WINNAME *WM_USER*+110

*LRESULT* *CALLBACK* WindowProc(*HWND* hWnd, *UINT* uMsg,*WPARAM* wParam, *LPARAM* lParam)

{

if (uMsg== WM_MOD_WINNAME)

{

*OutputDebugString*(L"ok");

}

else if (uMsg== *WM_KEYDOWN*)

{

if (wParam== *VK_F**1*)

{

int BaseAddr = 0x45DEBC;

int m_Esi = *(int*)BaseAddr;

_asm

{

mov esi, [m_Esi];

mov eax, dword *ptr* ds : [esi + 0x494];

lea ecx, dword *ptr* ds : [esi + 0x494];

*push* 0xf4;

*push* ebx;

*push* ebx;

*call*dword *ptr* ds : [eax + 0x28];

}

}

return *DefWindowProc*(hWnd, uMsg, wParam, lParam);

}

return *CallWindowProc*(theApp.m_pOldProc, hWnd, uMsg, wParam, lParam);

}

*UINT* __stdcall ThreadProc(*PVOID* pVar)

{

// 初始化,防止崩溃

*AFX_MANAGE_STATE*(*AfxGetStaticModuleState*());

QQPlugindll* pDlg= new QQPlugindll;

pDlg->*Create*(IDD_DIALOG1);

pDlg->*ShowWindow*(*SW_SHOW*);

pDlg->*RunModalLoop*();

return 0;

}

*BOOL* CQQPluginApp::InitInstance()

{

//CWinApp::InitInstance();

*OutputDebugString*(L"InitInstance");

m_hMainWnd= *FindWindow*(*NULL*, L"QQ连连看");

m_pOldProc = (*WNDPROC*)*SetWindowLongPtr*(m_hMainWnd, *GWLP_WNDPROC*,

(*LONG_PTR*)WindowProc);

::*SendMessage*(m_hMainWnd, WM_MOD_WINNAME, 0, 0);

// 创建线程,在线程中启动一个对话框

*_beginthreadex*(0, 0, ThreadProc, this, 0, 0);

return *TRUE*;

}

QQPlugindll.cpp

#include "stdafx.h"

#include "QQPlugin.h"

#include "QQPlugindll.h"

#include "afxdialogex.h"

// QQPlugindll 对话框

*IMPLEMENT_DYNAMIC*(QQPlugindll, *CDialogEx*)

QQPlugindll::QQPlugindll(*CWnd** pParent /*=NULL*/)

: *CDialogEx*(IDD_DIALOG1, pParent)

{

}

QQPlugindll::~QQPlugindll()

{

}

void QQPlugindll::DoDataExchange(*CDataExchange** pDX)

{

*CDialogEx*::*DoDataExchange*(pDX);

}

*BEGIN_MESSAGE_MAP*(QQPlugindll, *CDialogEx*)

*ON_BN_CLICKED*(IDC_BUTTON1, &QQPlugindll::OnBnClickedButton1)

*END_MESSAGE_MAP*()

// QQPlugindll 消息处理程序

//循环炸弹

void QQPlugindll::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

for (int i= 0; i< 100; i++)

{

::*SendMessage*(theApp.m_hMainWnd, *WM_KEYDOWN*, *VK_F**1*, 0);

}

}

最后使用注入工具往游戏程序注入生成的dll文件,出现一个窗口,点击一键消消乐按钮后实现一键消除。

效果图如下:

image.png

解决完后可以再说说思路一的做法:

每次按练习后都会随机生成地图

由此可以给关键api函数下断,bp rand

image.png

找到地图数据

483AC8 地图数据地址

483AC8内存拷贝给12BB50

12BB50=[Esi+0x195C] 地图地址

地图数组首地址是12BB50,但是数据开始的地方是12BB58,前面八个字节没用。

在点击游戏中两张相同卡牌或点击指南针之前,找两个相同数字靠在一起的下硬件访问断点

尝试断下来通过栈回溯找指南针函数和消除函数的地方

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容