#include "stdafx.h"
#include <atlstr.h>
#pragma data_seg(".Share")
HWND g_hMainWnd=NULL;//主窗口句柄;
HHOOK hhkHook=NULL; //鼠标钩子句柄;
HINSTANCE hInstDll=NULL;//本dll实例句柄;
DWORD g_dwHookPid=-1;//要HOOK的进程的PID
BOOL g_bIsFirstLoad=TRUE;//判断是否是第一次加载本dll
DWORD callTemp[6]={0,0,0,0,0,0<span style="color:#ff0000;">};//这个空间是全局的,不然的话点击选怪完毕后 会有别的代码来修改这里为0 所以会提示某个内存地址不可读取的错误 就是因为你的这个数组如果是局部的 随着注入结束 也结束 空间不存在
//注意:点击选怪call ce搜到的存储怪物id的内存地址 查看修改此地址的代码 完后od转到此地址 ctrl+f9 看到的call基本就是点击选怪call 但是参数两个 一个是用来存储怪物id等信息的内存地址 一个就是存放着点击后怪物id等信息(但是这个地址处的数据一直在变动 只有当点击的时候 才会被别的call或什么地方 经过计算点击的鼠标位置和怪物的位置 最后算出点到的怪物的怪物id等信息 完后存放到临时的那个地址处 你ce查看哪里修改了这个地址的代码 会发现怎么也找不到 只能搜到一堆call 和一群混淆视线的mov之类的无用指令 如果要自动运行 就必须先知道要攻击的怪物的ID等信息 所以你找哪里把怪物id存放到那个地址里 不是白费功夫吗 )
#pragma data_seg()
#pragma comment(linker, "/section:.Share,rws")
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
hInstDll=GetModuleHandle(0);//这行不能少
g_bIsFirstLoad = FALSE;
MessageBox(NULL,L"注入成功",L"信息",MB_ICONINFORMATION);
callTemp[4] = 0x34;
callTemp[5] = 0x80003214;//怪物id
callTemp[3] =(DWORD) &callTemp[5] ;
__asm
{
mov ecx,0x16C2B068;//用来存储怪物id等信息的内存地址
lea eax,callTemp; //必须lea 不能直接mov
push eax;
mov edx,0x0046DE60;//鼠标点击 的选怪call 必须先传给edx 再call edx
call edx;
}
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}