首页
社区
课程
招聘
[旧帖] [求助]菜鸟的第一个提问:用ReadFileA和狗通讯吗?这狗该如何破解? 0.00雪花
发表于: 2008-5-5 15:47 3963

[旧帖] [求助]菜鸟的第一个提问:用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之类的关键密码,不知道如何下手了,高手帮忙点拨下。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//