【问题标题】:C++ Base64 String "Z2V0UGFzc3dvcmQ=" as function nameC++ Base64字符串“Z2V0UGFzc3dvcmQ=”作为函数名
【发布时间】:2014-02-02 17:59:59
【问题描述】:

一些关于我的快速信息 我从 2008 年开始成为 MalwareResearcher,从 2013 年开始成为 C++/MASM 开发人员。我使用恶意软件样本和 CrackMe 提高和测试我的技能。

我找到了一个非常不错的,但被困在编码部分:(

来自crackme的代码片段:

MOV EAX,004260AC                               ; ASCII "TUFMQ0hPLkRMTA=="
CALL 00407B10
JMP SHORT 004049FB
XOR EAX,EAX
MOV DWORD PTR SS:[LOCAL.1],-1
TEST EAX,EAX
JZ 00404AC3
MOV EAX,DWORD PTR DS:[EAX]
PUSH EAX                                       ; /FileName
CALL DWORD PTR DS:[<&kernel32.LoadLibraryA>]   ; \KERNEL32.LoadLibraryA
TEST EAX,EAX
JZ 00404AC3
PUSH 004260C0                                  ; /Procname = "Z2V0UGFzc3dvcmQ="
PUSH EAX                                       ; |hModule
CALL DWORD PTR DS:[<&kernel32.GetProcAddress>] ; \KERNEL32.GetProcAddress

crackme 尝试用LoadLibraryA 加载一个名为MALCHO.dll 的dll,然后尝试执行一个名为Z2V0UGFzc3dvcmQ= 的函数。

之后,它使用从 dll 函数 Z2V0UGFzc3dvcmQ= 收集的密码解密其资源之一。

作为crackme的一部分,我似乎必须制作这个dll。

通过分析这个标本的另一部分,我得到了解密所需的密码。

所以“只”需要 dll 编码才能到达破解程序的结尾:)

在将TUFMQ0hPLkRMTA==解密为MALCHO.dll时,它的函数名Z2V0UGFzc3dvcmQ=似乎没有解密为getPassword

我现在不知道如何在 c++ 中使用 base64 编码的字符串作为函数名。

由于Z2V0UGFzc3dvcmQ= 中的= 出现语法错误:(

我的MALCHO.dll 来源:

MALCHO.h:

#ifdef MALCHODLL_EXPORTS
#define MALCHOFUNCSDLL_API __declspec(dllexport) 
#else
#define MALCHOFUNCSDLL_API __declspec(dllimport) 
#endif

namespace MALCHO
{
    //This class is exported from the MalchoFuncsDll.dll
    class MalchoFuncs
    {
    public:
        // Returns password
        static MALCHOFUNCSDLL_API char* Z2V0UGFzc3dvcmQ=(char* p);
    };
}

MALCHO.cpp

#include "stdafx.h"
#include "MALCHO.h"


namespace MALCHO
{
 char* MalchoFuncs::Z2V0UGFzc3dvcmQ=(char* p)
 {
    char* pw = "Yes I did it!";
    return pw;
 }
}

提前致谢

马斯迪

【问题讨论】:

  • 尝试链接器定义文件,或直接编辑 PE 导出表。
  • 如果允许,也可以修补加载 dll 的可执行文件
  • @Ben Voigt 我认为需要编辑crackme的导入表而不是导出表?!在我的情况下,链接器定义文件会是什么样子?
  • @Paranaix 修补不是一个选项:/
  • @user3263309:不,crackme使用GetProcAddress,不使用导入表。

标签: c++ dll encryption


【解决方案1】:

您不能在 C++ 中使用 = 作为名称的一部分,但 GetProcAddress 是一个操作系统函数,它不关心您使用的语言。它只是进行字符串匹配,也不是很花哨。它真的只关心\0,因为它会终止字符串。因此,如果您通过 Z2V0UGFzc3dvcmQ=\0,它将查找名为 Z2V0UGFzc3dvcmQ=\0 的导出。

LINK.EXE 的链接器定义文件的语法不允许您添加这样的名称,但 GetProcAddress 并不关心是谁将名称放入导出表中。最简单的解决方案可能是添加Z2V0UGFzc3dvcmQ_\0,然后覆盖_

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 2010-12-06
    • 1970-01-01
    • 2017-12-11
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2020-11-01
    相关资源
    最近更新 更多