-
-
[旧帖] [求助]菜鸟的第一个提问:用ReadFileA和狗通讯吗?这狗该如何破解? 0.00雪花
-
发表于: 2008-5-5 15:47 3963
-
整个半个月了,就是不明白这个软件为什么用ReadFileA,而不用DeviceIOControl调用?
CreateFileA的一个参数是“\\.\RNBODRV0”,是彩虹狗哪个版本呢?(手上没有狗)
(所装驱动是RainbowSSD5.39.2.exe,有三个文件如下:
C:\WINXP\system32\drivers\sentinel.sys
C:\WINXP\system32\rnbovdd.dll
C:\Program Files\Rainbow Technologies\Sentinel System Driver\sntnlusb.sys)
加密部分是在一个核心模块dll中,它调用ReadFile读取0x400字节,而且每次不同,其中有几个字节作为标志数据,数据不对程序就运行不起来,强制修改之总会有异常。
想着直接用高级语言读数据看看,但返回值总为0,如下:
#include <windows.h>
#include <stdio.h>
#include <Winioctl.h>
void Test();
void main()
{
HANDLE hFile = CreateFile("\\\\.\\RNBODRV0", // 为普通文件,比如c:\\report.txt时一切正常
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
DWORD dwError = GetLastError();
if (dwError==ERROR_SUCCESS && hFile!=INVALID_HANDLE_VALUE)
{
BYTE inBuffer[0x400]={0};
DWORD nBytesRead;
DWORD nBytesToRead=0x400;
// 参数错误?错误代码总为87
BOOL bResult = ReadFile(
hFile, (LPVOID)inBuffer, nBytesToRead, (LPDWORD)&nBytesRead, (LPOVERLAPPED)NULL) ;
if (!bResult)
{
switch(dwError = GetLastError()) {
case ERROR_HANDLE_EOF:
break;
case ERROR_IO_PENDING:
break;
default:
dwError = dwError;
break;
}
printf("GetLastError returned %u\n", dwError);
}
else
{
printf("Read %u\n", nBytesRead);
}
// 改用汇编也是读不到数据
LPDWORD pBytesRead = &nBytesRead;
LPVOID pBuffer = &inBuffer;
_asm
{
push 0;
push pBytesRead;
push 0x400;
push pBuffer;
push hFile;
CALL DWORD PTR DS:[ReadFile];
}
}
if (hFile)
{
CloseHandle(hFile);
}
Test();
}
void Test()
{
TCHAR file[]="\\\\.\\RNBODRV0";
//BYTE inBuffer[0x400]={0};
BYTE* inBuffer = new BYTE[0x400];
DWORD nBytesRead;
LPVOID pFile = file;
LPVOID pBuffer = inBuffer;
LPDWORD pBytesRead = &nBytesRead;
_asm
{
push 0;
push 0x80;
push 3;
push 0;
push 3;
push 0xC0000000;
push pFile;
call DWORD PTR DS:[CreateFile];
push 0;
push pBytesRead;
push 0x400;
push pBuffer;
push eax;
CALL DWORD PTR DS:[ReadFile];
}
delete[] inBuffer;
}
看了论坛中一些无狗破解的案例,但好象我这个并没有什么eax之类的关键密码,不知道如何下手了,高手帮忙点拨下。
CreateFileA的一个参数是“\\.\RNBODRV0”,是彩虹狗哪个版本呢?(手上没有狗)
(所装驱动是RainbowSSD5.39.2.exe,有三个文件如下:
C:\WINXP\system32\drivers\sentinel.sys
C:\WINXP\system32\rnbovdd.dll
C:\Program Files\Rainbow Technologies\Sentinel System Driver\sntnlusb.sys)
加密部分是在一个核心模块dll中,它调用ReadFile读取0x400字节,而且每次不同,其中有几个字节作为标志数据,数据不对程序就运行不起来,强制修改之总会有异常。
想着直接用高级语言读数据看看,但返回值总为0,如下:
#include <windows.h>
#include <stdio.h>
#include <Winioctl.h>
void Test();
void main()
{
HANDLE hFile = CreateFile("\\\\.\\RNBODRV0", // 为普通文件,比如c:\\report.txt时一切正常
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
DWORD dwError = GetLastError();
if (dwError==ERROR_SUCCESS && hFile!=INVALID_HANDLE_VALUE)
{
BYTE inBuffer[0x400]={0};
DWORD nBytesRead;
DWORD nBytesToRead=0x400;
// 参数错误?错误代码总为87
BOOL bResult = ReadFile(
hFile, (LPVOID)inBuffer, nBytesToRead, (LPDWORD)&nBytesRead, (LPOVERLAPPED)NULL) ;
if (!bResult)
{
switch(dwError = GetLastError()) {
case ERROR_HANDLE_EOF:
break;
case ERROR_IO_PENDING:
break;
default:
dwError = dwError;
break;
}
printf("GetLastError returned %u\n", dwError);
}
else
{
printf("Read %u\n", nBytesRead);
}
// 改用汇编也是读不到数据
LPDWORD pBytesRead = &nBytesRead;
LPVOID pBuffer = &inBuffer;
_asm
{
push 0;
push pBytesRead;
push 0x400;
push pBuffer;
push hFile;
CALL DWORD PTR DS:[ReadFile];
}
}
if (hFile)
{
CloseHandle(hFile);
}
Test();
}
void Test()
{
TCHAR file[]="\\\\.\\RNBODRV0";
//BYTE inBuffer[0x400]={0};
BYTE* inBuffer = new BYTE[0x400];
DWORD nBytesRead;
LPVOID pFile = file;
LPVOID pBuffer = inBuffer;
LPDWORD pBytesRead = &nBytesRead;
_asm
{
push 0;
push 0x80;
push 3;
push 0;
push 3;
push 0xC0000000;
push pFile;
call DWORD PTR DS:[CreateFile];
push 0;
push pBytesRead;
push 0x400;
push pBuffer;
push eax;
CALL DWORD PTR DS:[ReadFile];
}
delete[] inBuffer;
}
看了论坛中一些无狗破解的案例,但好象我这个并没有什么eax之类的关键密码,不知道如何下手了,高手帮忙点拨下。
赞赏
看原图
赞赏
雪币:
留言: