在 运行 时间解密函数并使用它 QT c++
decrypt function at run time and use it QT c++
我是 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++ 一样精确 ...
post 脚本。
有趣的是,在同一件事上,保持重要功能加密的最合法方法是什么(加密的原因是 DRM)?
合法我的意思是杀毒软件不会因为我保护自己而错误地将我标记为病毒。
PS2
如果我通过网络传递一个加密函数(比如,我将构建一个服务器客户端模式,客户端从服务器请求它需要的函数 运行 并且服务器将它发送给它,如果已通过)如何排列符号才能使功能不崩溃?
PS3
QT中如何关闭DEP和ASLR防御? (我认为这样我就可以执行PS 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++) {
// ...
}
}
我在您的示例中看不到任何特定于 Qt 的内容。即使是 Qt 函数调用也只是一个调用。所以我猜你在两个例子中都有未定义的行为,但只有第二个崩溃了。
我看不出有任何理由让编译器和链接器保持函数顺序。例如 GCC 允许您为每个函数指定代码段。所以你可以在可执行文件中重新排序而不用在 cpp 中重新排序。
我认为您需要一些特定于编译器的东西才能使其工作。
我是 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++ 一样精确 ...
post 脚本。
有趣的是,在同一件事上,保持重要功能加密的最合法方法是什么(加密的原因是 DRM)?
合法我的意思是杀毒软件不会因为我保护自己而错误地将我标记为病毒。
PS2
如果我通过网络传递一个加密函数(比如,我将构建一个服务器客户端模式,客户端从服务器请求它需要的函数 运行 并且服务器将它发送给它,如果已通过)如何排列符号才能使功能不崩溃?
PS3
QT中如何关闭DEP和ASLR防御? (我认为这样我就可以执行PS 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++) {
// ...
}
}
我在您的示例中看不到任何特定于 Qt 的内容。即使是 Qt 函数调用也只是一个调用。所以我猜你在两个例子中都有未定义的行为,但只有第二个崩溃了。
我看不出有任何理由让编译器和链接器保持函数顺序。例如 GCC 允许您为每个函数指定代码段。所以你可以在可执行文件中重新排序而不用在 cpp 中重新排序。
我认为您需要一些特定于编译器的东西才能使其工作。