【发布时间】: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