1。打开游戏查看特征 发现不是真正的exe程序
发现这个才是
找特征 先到代码段搜索字符串 找到一些打开浏览器
都下断
运行发现断不下来 ,那就到每个call里下断
再次运行断下来了 但这个是一个死循环
这个才是点击游戏的回调
f8 出现可疑字符串
继续 又出现可疑字符串
到文件里改名运行试试 果然是的
但是再次启动最开始那个程序报错
不管它直接分析新程序
先查壳 压缩壳直接脱
运行程序查看特点 查看行为 等发现它创建一个进程打开真正的程序
下断 CreateProcessA
发现了真的程序
运行程序 但是有报错
直接上火绒剑查打开它的程序 看有哪些行为
直接手动改
到这里就可以直接用了 现在就开始写辅助先分析
先查特点
1.有声音
2.有道具
3.相同的去掉
4.有时间
我的思路是先找到×××或者×××的回调函数,不管那么多先从声音文件开始(×××的声音的文件是:
到代码段查字符串
下断
当有×××的时候同时点击×××就会断下然后查看调用栈
然后再分析下一些关键断点
以找到了一个关跳 意思是如果俩个是相等的就会消掉
nop试试
果然是的 发现只要第一下点击×××然后随便点下 就会有增加
现在开始找它为什么会增 也就是说它的增加的函数
通过上面有的断点发现如果是点击的是的道具框总是会调用这个函数 同时发现都是调用的一个函数
进入函数看看原来是个道具减少函数
修改下 把减少改成增加
果然
同样找到了真正的增加函数
现在回过来找它是怎么调用的 发现一些 f1 f4等等
刚才有分析它的增加减少函数 很定有对内存操作查看内存
找到了这些 那就再分析 哪个是×××啊 发现是f4
这里出现了错误分析 条件断点不断点下来 但是找到了上面有个关键函数 是一个道具分发 因为所有道具最终调的一个函数
重点来了那就慢慢分析这些参数 点下×××
这里发现有一个地址哪都能看到 随便到个地方看看
那应该是一个对象的基址 到调用栈往上层跟 一直有 可能也是个全局的用ce搜下 发现几个全局 (绿色)那就先保存再试
目前找到了三个点 ×××的增减 道具分发函数 点击图片判断是否相等
同样思路 可以找到定时函数这里找到了判断跳转:如果时间到了就结束弹框
这里打到了跳转直接改了(分析发现是如果相等就做一些准备工作可以是加载失败框什么的 其它情况一直是不等于 改成jmp)
成功
这里就简单的分析了下分析 报告:
12ac5a ×××地址12AC7E
对比
0041B1CE E8 AD4BFFFF CALL kyodai.0040FD80 ; 都走
0041B1D3 8A45 E8 MOV AL,BYTE PTR SS:[EBP-0x18]
0041B1D6 3845 D4 CMP BYTE PTR SS:[EBP-0x2C],AL
0041B1D9 90 NOP ; 不相等这里跳过
0041B1DA 90 NOP
0041B1DB 90 NOP
0041B1DC 90 NOP
0041B1DD 90 NOP
0041B1DE 90 NOP
0041B1DF 80BE 48090000 D>CMP BYTE PTR DS:[ESI+0x948],0xD4
0041B1E6 0F85 CA010000 JNZ kyodai.0041B3B6 ; 相等这里跳过
0041B1EC FF75 E4 PUSH DWORD PTR SS:[EBP-0x1C]
0041B1EF 8BCE MOV ECX,ESI
0041B1F1 FF75 E0 PUSH DWORD PTR SS:[EBP-0x20]
0041B1F4 E8 076E0000 CALL kyodai.00422000
增加道具函数
0041B487 FF75 D8 PUSH DWORD PTR SS:[EBP-0x28]
0041B48A E8 89D90000 CALL kyodai.00428E18
0041B48F 85C0 TEST EAX,EAX
0041B491 59 POP ECX ; 0012A1F4
0041B492 74 0A JE SHORT kyodai.0041B49E
0041B494 FF75 D8 PUSH DWORD PTR SS:[EBP-0x28]
0041B497 8BCE MOV ECX,ESI
0041B499 E8 DB240000 CALL kyodai.0041D979 ; 增加×××函数
0041B49E 8B8E 841E0000 MOV ECX,DWORD PTR DS:[ESI+0x1E84]
0041B4A4 53 PUSH EBX
0041B4A5 53 PUSH EBX
减少×××函数
0042AA97 C1E0 04 SHL EAX,0x4
0042AA9A 03C7 ADD EAX,EDI
0042AA9C 90 NOP
0042AA9D 90 NOP
0042AA9E 90 NOP
0042AA9F 90 NOP
0042AAA0 66:3958 06 CMP WORD PTR DS:[EAX+0x6],BX
0042AAA4 7F 0B JG SHORT kyodai.0042AAB1
0042AAA6 3958 0C CMP DWORD PTR DS:[EAX+0xC],EBX
增加×××函数
0042AA6D 8858 05 MOV BYTE PTR DS:[EAX+0x5],BL
0042AA70 66:FF40 06 INC WORD PTR DS:[EAX+0x6]
0042AA74 0FBF40 06 MOVSX EAX,WORD PTR DS:[EAX+0x6]
0042AA78 EB 02 JMP SHORT kyodai.0042AA7C
0042AA7A 33C0 XOR EAX,EAX
关键函数
0041AF11 E8 F32E0000 CALL kyodai.0041DE09
0041AF16 8D45 0C LEA EAX,DWORD PTR SS:[EBP+0xC]
0041AF19 8BCE MOV ECX,ESI ; 函数3
0041AF1B 50 PUSH EAX
0041AF1C E8 A8590000 CALL kyodai.004208C9
0041AF21 8BF8 MOV EDI,EAX
0041AF23 8D45 0C LEA EAX,DWORD PTR SS:[EBP+0xC]
0041AF26 50 PUSH EAX
0041AF27 8BCE MOV ECX,ESI ; 标签2
0041AF29 E8 D8140000 CALL kyodai.0041C406
0041AF2E 50 PUSH EAX
0041AF2F 57 PUSH EDI
0041AF30 8BCE MOV ECX,ESI
0041AF32 E8 C9310000 CALL kyodai.0041E100
0041AF37 5F POP EDI ; kyodai.0041AF2E
0041AF38 FF75 10 PUSH DWORD PTR SS:[EBP+0x10]
0041AF3B 803D 848D4500 0>CMP BYTE PTR DS:[0x458D84],0x0
0041AF42 8BCE MOV ECX,ESI
0041AF44 FF75 0C PUSH DWORD PTR SS:[EBP+0xC]
0041AF47 FF75 08 PUSH DWORD PTR SS:[EBP+0x8]
0041AF4A 74 07 JE SHORT kyodai.0041AF53 ; 如果俩个相等
0041AF4C E8 7B090000 CALL kyodai.0041B8CC
0041AF51 EB 05 JMP SHORT kyodai.0041AF58
0041AF53 E8 05000000 CALL kyodai.0041AF5D ; 音乐
0041AF58 5E POP ESI ; kyodai.0041AF2E
0041AF59 5D POP EBP ; kyodai.0041AF2E
0041AF5A C2 0C00 RETN 0xC ; 这里返回
0041AF5D B8 5C744400 MOV EAX,kyodai.0044745C ; 父%E
0041AF62 E8 F9CD0100 CALL kyodai.00437D60
0041AF67 81EC A0010000 SUB ESP,0x1A0
0041AF6D 53 PUSH EBX ; kyodai.0040CA97
0041AF6E 56 PUSH ESI
//动画
68A2EB18 FFD0 CALL EAX
68A2EB1A 85C0 TEST EAX,EAX
68A2EB1C 74 73 JE SHORT mfc42.68A2EB91
68A2EB1E 837D FC 00 CMP DWORD PTR SS:[EBP-0x4],0x0
68A2EB22 74 28 JE SHORT mfc42.68A2EB4C
68A2EB24 8B43 04 MOV EAX,DWORD PTR DS:[EBX+0x4]
68A2EB27 3D 18010000 CMP EAX,0x118
68A2EB2C 74 07 JE SHORT mfc42.68A2EB35
68A2EB2E 3D 04010000 CMP EAX,0x104
68A2EB33 75 17 JNZ SHORT mfc42.68A2EB4C
68A2EB35 6A 01 PUSH 0x1
68A2EB37 8BCE MOV ECX,ESI
68A2EB39 E8 3CD1FDFF CALL mfc42.#6215
68A2EB3E 8BCE MOV ECX,ESI
//定时
0040F502 8B06 MOV EAX,DWORD PTR DS:[ESI] ; kyodai.0044CE70
0040F504 8BCE MOV ECX,ESI
0040F506 FF50 30 CALL DWORD PTR DS:[EAX+0x30]
0040F509 39BE C0000000 CMP DWORD PTR DS:[ESI+0xC0],EDI
0040F50F EB 12 JNZ SHORT kyodai.0040F523 //JMP ; 时间
0040F511 8B06 MOV EAX,DWORD PTR DS:[ESI] ; kyodai.0044CE70
0040F513 8BCE MOV ECX,ESI
0040F515 FF50 14 CALL DWORD PTR DS:[EAX+0x14]
0040F518 85C0 TEST EAX,EAX
0040F51A 74 07 JE SHORT kyodai.0040F523
辅助源码 (dll 要注入进去)
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
void fun()
{
/*
0012A1F4=this=[0x47FDE0]
0012A688=ecx=[this+0x494]
0041DE4D |. 8B86 94040000 mov eax,dword ptr ds:[esi+0x494] ; 123.0044CE70
0041DE53 |. 8D8E 94040000 lea ecx,dword ptr ds:[esi+0x494] ; 0012A688
0041DE59 |. 52 push edx
0041DE5A |. 53 push ebx
0041DE5B |. 53 push ebx
0041DE5C |. FF50 28 call dword ptr ds:[eax+0x28] ; 道具事件分发
00129DBC 00000000
00129DC0 00000000
00129DC4 000000F4 是×××
*/
int BaseAddr = 0x47FDE0;
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];
}
}
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
{
// 创建一个按钮
CreateWindow(L"Button",
L"清除一个",
WS_CHILD | WS_VISIBLE | WS_BORDER,
0, 0, 80, 25,
hwnd,
(HMENU)0x1008,
0, 0);
// 创建一个按钮
CreateWindow(L"Button",
L"全部清除",
WS_CHILD | WS_VISIBLE | WS_BORDER,
0, 30, 80, 25,
hwnd,
(HMENU)0x1009,
0, 0);
}
case WM_COMMAND:
{
WORD HiwParam = HIWORD(wParam);//高两字节:控件通码
WORD LowParam = LOWORD(wParam);//低两字节:控件id
//清除一个
if (HiwParam == BN_CLICKED&&LowParam == 0x1008)
{
fun();
return 1;
}
if (HiwParam == BN_CLICKED&&LowParam == 0x1009)
{
//0041CB72 | . 8B8E 841E0000 mov ecx, dword ptr ds : [esi + 0x1E84]
//0041CB7B | .E8 57C60000 call <123.返回剩余方块个数>
//for fun sleep(100)
//for(;;){
//fun();
//}
return 1;
}
}break;
case WM_CLOSE:
{
EndDialog(hwnd, 0);
ExitProcess(0);
return 0;
}
default:break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
DWORD WINAPI DoCreateDialog(LPVOID lpParameter)
{
MSG msg;
WNDCLASS wndclass = { 0 };
HMODULE hinstance = GetModuleHandleW(0);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WindowProc;
wndclass.hInstance = hinstance;
wndclass.hIcon = 0;
wndclass.lpszClassName = L"qqllk";
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wndclass); //注册窗口
HWND hwnd = CreateWindowW(
L"qqllk", TEXT("qqllk助手"),
WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU, 0,
0, 100, 100,
0, 0, hinstance, 0);
ShowWindow(hwnd, 5);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.lParam;
}
void funA()
{
HANDLE ht = CreateThread(0, 0, DoCreateDialog, 0, 0, 0);
}
/*
思路一 : 指南针 配合清除函数
思路二 : 查找×××函数
1.根据ce 搜索到减少道具数值的地方
2.跟出减少道具数值函数
3.来到 调用减少道具数值函数的地方
4. 查找是谁调用的减少道具数值函数
5.即可找到关键点 道具分发函数 f0-fb 间
6.可以通过该函数调用多个道具
*/
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static bool Onec = 0;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
if (Onec == 0)
{
funA();
}
Onec = 1;
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
转载于:https://blog.51cto.com/haidragon/2121880