问题描述
我有一个带有 2 个标签的 C++ 程序。这些标签之间的代码在二进制文件中加密(使用 3rd 方工具),然后在运行时解密。解密代码如下所示:
int a = 0xBAD,b = 0xC0DE;
std::cin >> a >> b;
int c = static_cast<int>(pow(a,pow(b,b))) % static_cast<int>(pow(a,b));
switch (c)
{
case 0:
std::cout << "c = " << 0 << std::endl;
break;
case 1:
std::cout << "c = " << 1 << std::endl;
break;
case 2:
std::cout << "c = " << 2 << std::endl;
break;
case 3:
std::cout << "c = " << 3 << std::endl;
break;
default:
std::cout << "c = " << c << std::endl;
}
_end:
解密过程如下:我调用 VirtualAlloc
分配一个具有 PAGE_EXECUTE_READWRITE 权限的新内存缓冲区。然后我将加密的部分复制到这个缓冲区并解密。之后我只是调用这个缓冲区。
__asm
{
lea eax,begin
lea edx,_begin
mov dword ptr[eax],edx
lea eax,end
lea edx,_end
mov dword ptr[eax],edx
}
LPVOID ptr = VirtualAlloc(NULL,end - begin,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
memcpy(ptr,begin,end - begin);
//decryption here
((void(*)(void))ptr)();
问题在于 std::cin
和 std::cout
调用具有接近 call
的相对偏移量,这使得该偏移量在我尝试执行的新分配的内存块中绝对不正确。
问题是如何计算解密代码的正确偏移量并在那里使用它?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)