在运行时解密函数并使用它QT c ++

时间:2017-09-06 12:54:04

标签: qt antivirus drm

我是QT的新手,我正在尝试创建一个加密函数。 总的来说,你在C / C ++中做的是:

  • 将指针指向功能
  • 制作功能页面rwx
  • 加密(对于我在同一程序中加密和解密的示例)
  • 解密并运行

C中的简单代码将大致如下:

    void TestFunction()
{
    printf("\nmsgbox test encrypted func\n");
}
// use this as a end label
void FunctionStub() { return; }

void XorBlock(DWORD dwStartAddress, DWORD dwSize)
{
    char * addr = (char *)dwStartAddress;
    for (int i = 0; i< dwSize; i++)
    {
        addr[i] ^= 0xff;
    }
}

DWORD GetFuncSize(DWORD* Function, DWORD* StubFunction)
{
    DWORD dwFunctionSize = 0, dwOldProtect;
    DWORD *fnA = NULL, *fnB = NULL;

    fnA = (DWORD *)Function;
    fnB = (DWORD *)StubFunction;
    dwFunctionSize = (fnB - fnA);
    VirtualProtect(fnA, dwFunctionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect); // make function page read write execute permission
    return dwFunctionSize;
}



int main()
{

    DWORD dwFuncSize = GetFuncSize((DWORD*)&TestFunction, (DWORD*)&FunctionStub);
    printf("use func");
    TestFunction();
    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR encrypt the function
    printf("after enc");
    //TestFunction(); // If you try to run the encrypted function you will get Access Violation Exception.

    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR decrypt the function
    printf("after\n");
    TestFunction(); // Fine here

    getchar();
}

当我尝试在QT中运行这样的示例时,我得到运行时错误。

以下是QT中的代码:

    void TestFunction()
{
    QMessageBox::information(0, "Test", "msgbox test encrypted func");
}
void FunctionStub() { return; }

void XorBlock(DWORD dwStartAddress, DWORD dwSize)
{
    char * addr = (char *)dwStartAddress;
    for (int i = 0; i< dwSize; i++)
    {
        addr[i] ^= 0xff;                // here i get seg. fault
    }
}

DWORD GetFuncSize(DWORD* Function, DWORD* StubFunction)
{
    DWORD dwFunctionSize = 0, dwOldProtect;
    DWORD *fnA = NULL, *fnB = NULL;

    fnA = (DWORD *)Function;
    fnB = (DWORD *)StubFunction;
    dwFunctionSize = (fnB - fnA);
    VirtualProtect(fnA, dwFunctionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect); // Need to modify our privileges to the memory

    QMessageBox::information(0, "Test", "change func to read write execute ");
    return dwFunctionSize;
}




void check_enc_function()
{

    DWORD dwFuncSize = GetFuncSize((DWORD*)&TestFunction, (DWORD*)&FunctionStub);
    QMessageBox::information(0, "Test", "use func");
    TestFunction();
    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR encrypt the function -> @@@ i get seg fault in here @@@
    QMessageBox::information(0, "Test", "after enc");


    TestFunction(); // If you try to run the encrypted function you will get Access Violation Exception.

    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR decrypt the function
    QMessageBox::information(0, "Test", "after dec");
    TestFunction(); // Fine here

    getchar();
}

为什么会发生这种情况? QT应该像标准C ++一样精确......

发布Scriptum。

有趣的是,在同一事项中,保持重要功能加密的最合法方式是什么(加密的原因是DRM)?

合法地说,我的意思是反病毒不会错误地将我标记为病毒,因为我为自己辩护。

PS2

如果我通过网络传递加密函数(比方说,我将构建一个服务器客户端架构,客户端要求从服务器运行它需要的功能,如果它被批准,服务器会将其发送给它)我安排符号,以便功能不崩溃?

PS3

如何在QT中关闭DEP和ASLR防御? (在我看来,我可以执行PS 2.我必须取消它们)

由于 阳子

2 个答案:

答案 0 :(得分:2)

该示例是我系统上未定义的行为。

代码中的第一个主要问题是:

void TestFunction() { /* ... */ }
void FunctionStub() { return; }

您认为编译器会在FunctionStub之后放置TestFunction而不进行任何填充。我编译了您的示例,FunctionStub在我的案例中高于TestFunction,导致dwFunctionSize为负。

dwFunctionSize = (fnB - fnA);

TestFunction located at @ 0xa11d90
FunctionStub located at @ 0xa11b50
dwFunctionSize = -0x240

同样在XorBlock中

addr[i] ^= 0xff;

什么都不做。

我假设你想用XorBlock写入内存位置以对整个TestFunction进行异或。

你可以这样做:

void XorBlock(DWORD dwStartAddress, DWORD dwSize)
{
    DWORD dwEndAddress = dwStartAddress + dwSize;
    for(DWORD i = dwStartAddress; i < dwEndAddress; i++) {
        // ...
    }
}

答案 1 :(得分:1)

我在示例中看不到任何特定于Qt的内容。即使它的Qt函数调用它只是一个电话。所以我猜你在两个例子中都有未定义的行为,但只有第二个崩溃。

我看不出编译器和链接器保持功能顺序的任何原因。例如,GCC允许您为每个函数指定代码部分。因此,您可以在可执行文件中重新排序,而无需在cpp中重新排序。

我认为你需要一些编译器特定的东西来使它工作。