关于我的一些快速信息 我是自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
答案 0 :(得分:0)
您不能将=
用作C ++中名称的一部分,但GetProcAddress
是一个操作系统功能,它不关心您使用的语言。它只是字符串匹配,也不是很花哨。它真的只关心\0
,因为它终止了字符串。因此,如果您通过Z2V0UGFzc3dvcmQ=\0
,它将查找名为Z2V0UGFzc3dvcmQ=\0
的导出。
LINK.EXE
的链接器定义文件的语法不允许您添加这样的名称,但GetProcAddress不关心谁将名称放在导出表中。最简单的解决方案可能是添加Z2V0UGFzc3dvcmQ_\0
,然后覆盖_