从龙之谷双开领悟出的——HOOK API

news/2024/11/24 13:33:06/

第一部分——限制程序多开方法

这里有一篇文章讲得很详细了,http://wenku.baidu.com/view/ac9d0215a2161479171128af.html

龙之谷使用的是互斥体方法,何为互斥体?自己丰衣足食吧!


第二部分——验证龙之谷限制多开的方法

如何验证?

先打开一个游戏,不管之

我们要解决的是如何顺利打开第二个游戏,用OD慢慢分析就行


这里说明龙之谷运行的程序是DragonNext.exe而不是dnlauncher.exe



打开OD,在命令行输入bp CreateMutexA,给这个API下断




接着用OD打开DragonNext.exe



果然,程序在调用CreateMutexA的时候被断了下来




再跟踪一下看有什么发现没



到这里,相信大多数读者已经知道如何解除双开限制了吧


第三部分——介绍解除“互斥体限制双开”的几种方法

第一种:关闭互斥体对象。运行一个游戏,打开XueTr

查看龙之谷的进程句柄



找到如下图红框中的这个对象,关闭之,就可以打开第二个游戏了




第二种:使游戏跳过互斥体检测

可以使用HOOK API的手段进行跳过,可以HOOKCreateMutexA,同时也可以HOOK GetLastError。



第四部分——编程实现程序多开

今天我要讲的是利用HOOK API技术实现多开,至于关闭互斥体对象的方法,大家自己参考这篇文章的方法试试

http://www.cnblogs.com/Y4ng/archive/2012/09/06/EnumProcessHandle_EnumMutex.html



实现API的HOOK有两种方法,第一种是修改IAT表;另一种是修改API入口函数前的机器码成jmp,使程序跳转到自定义的函数处。

至于两种方式谁优谁劣,萝卜青菜,各有所爱吧,我今天要讲的是第一种方法的实现,这里有第二种方法实现的文章,大家自己琢磨琢磨。http://bbs.csdn.net/topics/310177841


PE结构的模块(exe/dll/...),有一个IAT表,保存着该模块使用到的API函数的地址,在默认的隐式API调用时,会先跳转到该IAT表中查找API的具体的函数地址,在跳转到具体的地址执行该API。


理解了IAT,就知道如何下手了,看代码吧

#include <windows.h>
#include <process.h>
PIMAGE_DOS_HEADER			pDosHeader;
PIMAGE_NT_HEADERS			pNTHeaders;
PIMAGE_OPTIONAL_HEADER		pOptHeader;
PIMAGE_IMPORT_DESCRIPTOR	pImportDescriptor;
PIMAGE_THUNK_DATA			pThunkData;
PIMAGE_IMPORT_BY_NAME		pImportByName;
HMODULE						hMod;
DWORD WINAPI MyGetLastError();
DWORD * addr	= (DWORD *)GetLastError;		//原函数的入口地址
DWORD * myaddr	= (DWORD *)MyGetLastError;		//自定义函数入口地址
void ThreadProc(void *param);//线程函数
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
if(fdwReason==DLL_PROCESS_ATTACH)     
_beginthread(ThreadProc,0,NULL);     
return TRUE; 
}
void ThreadProc(void *param)
{
hMod = GetModuleHandle(NULL);	//获取自身实例句柄
pDosHeader = (PIMAGE_DOS_HEADER)hMod;
pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hMod + pDosHeader->e_lfanew);
pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders->OptionalHeader);
pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress);
while(pImportDescriptor->FirstThunk)//遍历ITA表
{
char * dllname = (char *)((BYTE *)hMod + pImportDescriptor->Name);
pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hMod + pImportDescriptor->OriginalFirstThunk);
int num = 1;
while(pThunkData->u1.Function)
{
PDWORD lpAddr  = (DWORD *)((BYTE *)hMod + (DWORD)pImportDescriptor->FirstThunk) +(num-1);
//找到要HOOK的API
if((*lpAddr) == (int)addr)
{
//远程注入自己的函数
DWORD dwOLD;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(lpAddr,&mbi,sizeof(mbi));
VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOLD);
WriteProcessMemory(GetCurrentProcess(), 
lpAddr, &myaddr, sizeof(DWORD), NULL);
VirtualProtect(lpAddr,sizeof(DWORD),dwOLD,0);
break;
}
num++;
pThunkData++;
}
pImportDescriptor++;
}
}
//自定义函数体
DWORD WINAPI MyGetLastError()
{
//这个地方可以写出对这个API函数的处理代码
//对于互斥体对象限制双开的,例如“龙之谷”,则对返回错误信息进行设置为0,
//0表示没有错误,也就表示CreateMutexA调用成功
return  0;
}


要控制别的进程,只能通过远程线程,把DLL注入要目标进程。至于注入器的代码我就不贴了,一起打包发到下载区吧,里边都有注释。
插图显示不全,看不清楚的,把图片另存为。

点击下载源码

 

同样的道理,封包截取工具等,也可以使用HOOK API技术去实现。亲爱的读者们,何不为自己打造一款属于自己的软件呢?微笑



http://www.ppmy.cn/news/278295.html

相关文章

【其他】微信双开、多开的几种方法

微信的应用越来越广泛&#xff0c;不仅在工作、生活、社交等等都有众多的使用者&#xff0c;而现在一个人有两个三个手机号都是很平常的事情&#xff0c;为了避免来回切换和带多个手机出门&#xff0c;多开似乎是很好的选择 工具/原料 多个微信号 电脑、智能手机 方法/步骤 …

双开助手多开分身版 v5.1.8

类型&#xff1a;系统工具 版本&#xff1a;v5.1.8 大小&#xff1a;6.1M 更新&#xff1a;2019/3/6 语言&#xff1a;简体 等级&#xff1a; 平台&#xff1a;安卓, 4.0以上 下载地址&#xff1a; 双开助手多开分身版 v5.1.8&#xff08;1&#xff09; 双开助手多开分身版 v5.…

微信分身,微信多开,微信双开

2016-07-08 更新 由于公司放弃该方案哪就不压箱底了&#xff0c;开源造福人类&#xff0c;呵呵 先说一下实现双开&#xff08;多开&#xff09;的几种方案 静态修改APK包名&#xff0c;然后重打包 作为厂商肯定不推荐这个方式拉&#xff0c;可能存在法律风险 动态修改APK包名 对…

Flatpickr教程:使用JavaScript快速创建一个自定义日期选择器

部分数据来源&#xff1a;ChatGPT 引言 如果您是一个网站开发者&#xff0c;想为自己的网站添加方便易用的日期选择对话框&#xff0c;那么Flatpickr日期选择对话框可能正好符合您的需要。在这篇文章中&#xff0c;我们将详细介绍如何使用Flatpickr日期选择对话框&#xff0c…

068:cesium lookAtTransform围绕一个固定点上下左右旋转查看

第068个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中查看一个固定的点的情况,从上下左右不同的维度进行查看。这里面使用lookAtTransform这个操作函数。lookAtTransform(transform, offset),这里的offset偏移量可以是笛卡尔坐标或航向/俯仰/范围。 直接复制下面…

计算机网络第三章——数据链路层(上)

提示&#xff1a;节物风光不相待。桑田碧海须臾改 文章目录 前言3.1.1 数据链路层功能数据链路层功能概述 3.2.1 封装成帧和透明传输封装成帧透明传输组帧的四种方式字符计数法字符填充法零比特填充法违规编码法 3.3.1 差错控制&#xff08;检错编码&#xff09;奇偶校验码CRC循…

c++学习——多态

多态 **多态的语法****多态的底层原理图****多态案1——计算机类****纯虚函数和抽象类****多态案例2——饮品****虚析构和纯虚析构****多态案例3—— 电脑组装** 多态是C面向对象三大特性之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态&#xff0c;复用函数名 动…

【X240 QQ视频对方听不到声音】解决方法

【X240 QQ视频对方听不到声音】解决方法&#xff1a; win7为例&#xff1a; 右键点击右下角的“小喇叭”图标&#xff0c;点击“录音设备”&#xff0c;显示如下图&#xff1a; 点击&#xff0c;上图中的“麦克风”&#xff0c;再点击右下角的“属性”按钮&#xff0c;显示如下…