某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);
}