flash多开

某flash在用户登录后调用 SharedObject.getLocal("browserSO");

把用户KEY信息保存到文件 browserSO.sol

然后不停的读 browserSO.sol 文件,根据读取到的KEY和登录后保存在内存中的KEY进行比较,

如果不一样,说明用户多开了,此时flash会自动退出。。。。

知道了原因,看看怎么解决

首先想到的是HOOK CreateFileW 替换文件路径,这样每个进程保存和读取的文件都不一样,就可以多开了

说干就干,替换文件路径后,发现不行,TrueCreateFileW调用老是返回失败,原因未知。。。

这么说替换文件路径不行,那就换种方式吧:

1、HOOK CreateFileW 保存browserSO.sol的句柄

2、HOOK WriteFile把写到browserSO.sol的数据保存一份

3、HOOK ReadFile返回在HOOK WriteFile保存的browserSO.sol数据

这样就可以确保每个flash进程都是单独读取各自的browserSO.sol文件了,即可以多开了。。。

主要代码如下:

HANDLE WINAPI MyCreateFileW(
	LPCWSTR lpFileName, 
	DWORD dwDesiredAccess, 
	DWORD dwShareMode, 
	LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
	DWORD dwCreationDisposition, 
	DWORD dwFlagsAndAttributes, 
	HANDLE hTemplateFile)
{
	HANDLE hRet = TrueCreateFileW(
		lpFileName,
		dwDesiredAccess,
		dwShareMode,
		lpSecurityAttributes,
		dwCreationDisposition,
		dwFlagsAndAttributes,
		hTemplateFile);
	

	// flash多开
	// SharedObject.getLocal("browserSO");
	// 本想替换lpFileName的路径
	// 替换lpFileName的路径后,发现调用TrueCreateFileW总是失败,
	// 错误码:3 系统找不到指定的路径 实际路径是存在的,比较是自己手动创建的文件
	// 因此只能曲线救国了 
	// 1、保存browserSO.sol的文件句柄
	// 2、WriteFile时拷贝一份数据
	// 3、ReadFile时把在WriteFile中拷贝的数据之间返回给Flash即可
	// 即Flash写什么数据 在读数据时返回写的数据 这样就可以多开了
	if (wcsstr(lpFileName, L"browserSO.sol") != NULL)
	{
		gBrowserSO = hRet;
		//OutputDebugStringA("MyCreateFileW");
	}

	return hRet;
}

 

BOOL WINAPI MyWriteFile(
	HANDLE hFile, 
	LPCVOID lpBuffer, 
	DWORD nNumberOfBytesToWrite, 
	LPDWORD lpNumberOfBytesWritten, 
	LPOVERLAPPED lpOverlapped)
{
	if (hFile == gBrowserSO)
	{
		/*char szLog[1024] = { 0 };
		sprintf(szLog, "hook MyWriteFile nNumberOfBytesToWrite=%d", nNumberOfBytesToWrite);
		OutputDebugStringA(szLog);*/

		memcpy(gDataBrowserSO, lpBuffer, nNumberOfBytesToWrite);
		gDataBrowserSOLen = nNumberOfBytesToWrite;
	}

	return TrueWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
}

BOOL WINAPI MyReadFile(
	HANDLE hFile, 
	LPVOID lpBuffer, 
	DWORD nNumberOfBytesToRead, 
	LPDWORD lpNumberOfBytesRead, 
	LPOVERLAPPED lpOverlapped)
{
	if (hFile == gBrowserSO && gDataBrowserSOLen > 0)
	{
		/*char szLog[1024] = { 0 };
		sprintf(szLog, "hook MyReadFile nNumberOfBytesToRead=%d", nNumberOfBytesToRead);
		OutputDebugStringA(szLog);*/

		memcpy(lpBuffer, gDataBrowserSO, gDataBrowserSOLen);
		if (lpNumberOfBytesRead != NULL)
		{
			*lpNumberOfBytesRead = gDataBrowserSOLen;
		}
		return TRUE;
	}

	return TrueReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值