【问题标题】:How can i see contents of buffer and compare with dll file?如何查看缓冲区的内容并与 dll 文件进行比较?
【发布时间】:2017-01-14 13:01:54
【问题描述】:

我尝试用 nativeApi 编写 dll 注入器。出于这个原因,我写了这段代码。 NtReadFile 函数读取了一些内容,但除了 FileReadBuffer 的第一个值之外,我什么也看不到。另外,我对 dll 如何查看缓冲区一无所知。

(1)如何比较缓冲区和dll文件?

(2)如何确保代码运行正确。

(3)请告诉我我在代码中的错误。

bool Injector::initiationDll(const std::string& dllPath)
{
    if (!isDllExist(dllPath))
    {
        printf("Dll not found!\n");
        return false;
    }
    else
    {
        printf("LibraryPath: %s\n", dllPath);

        NTSTATUS status; HANDLE lFile;

        OBJECT_ATTRIBUTES objAttribs = { 0 }; UNICODE_STRING unicodeString;
        std::string dllPathWithprefix = "\\??\\" + dllPath;

        std::wstring wString = std::wstring(dllPathWithprefix.begin(), dllPathWithprefix.end()); PCWSTR toPcwstr = wString.c_str();
        RtlInitUnicodeString(&unicodeString, toPcwstr);
        InitializeObjectAttributes(&objAttribs, &unicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);
        objAttribs.Attributes = 0;

        const int allocSize = 2048;
        LARGE_INTEGER largeInteger;
        largeInteger.QuadPart = allocSize;

        IO_STATUS_BLOCK ioStatusBlock;

        status = NtCreateFile(
            &lFile,
            GENERIC_READ | FILE_READ_DATA | SYNCHRONIZE,
            &objAttribs,
            &ioStatusBlock,
            &largeInteger,
            FILE_ATTRIBUTE_NORMAL,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            FILE_OPEN,
            FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
            NULL,
            0);

        if (!NT_SUCCESS(status)) {
            printf("CreateFile failed..\n");
            return false;
        }
        else {
            printf("Library Handle : %p\n", lFile);

            DWORD fileSize = getDllSize(dllPath);

            if (fileSize == 0)
            {
                printf("File size is zero.\n");
                return false;
            }
            else
            {
                printf("File size : %d byte.\n", fileSize);

                PVOID FileReadBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

                if (!FileReadBuffer)
                {
                    printf("\nError: Unable to allocate memory(%d)\n", GetLastError());

                    status = NtClose(lFile);
                    return false;
                }
                else {
                    printf("Allocate %d byte for buffer.\n", fileSize);

                    status = NtReadFile(
                        lFile,
                        NULL,
                        NULL,
                        NULL,
                        &ioStatusBlock,
                        FileReadBuffer,
                        sizeof(FileReadBuffer),
                        0, // ByteOffset
                        NULL);

                    if (!NT_SUCCESS(status))
                    {
                        printf("Unable to read the dll...  : %d\n", GetLastError());
                        return false;
                    }
                    else {
                        status = NtClose(lFile);
                        for (int i = 0; i < sizeof(fileSize); i++)
                        {
                            //wprintf(L"%p   :   %s\n", FileReadBuffer, FileReadBuffer);
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • @πάνταῥεῖ 你的 [edit] 东西不知何故坏了。
  • @BaummitAugen 它不能以通用方式 IIRC 穿上

标签: c++ visual-c++ inject dll-injection nt-native-api


【解决方案1】:
status = NtReadFile(
                        lFile,
                        NULL,
                        NULL,
                        NULL,
                        &ioStatusBlock,
                        FileReadBuffer,
                        sizeof(FileReadBuffer), // !!!!!
                        0, // ByteOffset
                        NULL);

所以你只读取 sizeof(FileReadBuffer) - 4 或 8 个字节。我认为你使用了我来自here 的建议

【讨论】:

  • 谢谢 :) 我想读取 4 字节 x 4 字节直到文件结束 :D 现在 ioStatusBlock.information=113664
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多