C ++ Base64字符串“Z2V0UGFzc3dvcmQ =”作为函数名

时间:2014-02-02 18:00:00

标签: c++ dll encryption

关于我的一些快速信息 我是自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尝试使用MALCHO.dll加载名为LoadLibraryA的dll,然后尝试执行一个名为Z2V0UGFzc3dvcmQ=的函数。

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

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

通过分析该标本的另一部分,我能够获得解密所需的密码。

因此需要“仅”dll编码才能达到crackme的结尾:)

在解密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;
 }
}

提前致谢

MasDie

1 个答案:

答案 0 :(得分:0)

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

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