好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 qzhsjz 于 2020-7-31 09:23 编辑
原帖:https://www.52pojie.cn/thread-1233355-1-1.html
我是这个帖的楼主。
没人能做出来的原因我也大概能理解,因为这个程序所有的绘图都是直通显卡的,事件机制都是内部实现的,一点系统控件都没用,所以没法找系统控件的断点,也没法找系统事件的断点。
如果找绘图或者最外层窗口事件的断点再跟进去,又太多太烦,虽然无壳无花,但是由于库很重,整个exe有18M,静态分析也不太现实。
虽然算法很简单,或者说根本就没有算法,只是一个字符串判等。但过于简单的算法和过于庞大的库之间就形成了掩护,在没有很多人分析过这个库的情况下,想通过特征来找算法也很难。其实这也就是我设计这个CrackMe的初衷。
那么,如果我们现实中遇到了像这样的程序(比如一些使用DirectUI技术的程序或者游戏),我们应该如何入手分析呢?我想听听各位大佬的意见。
附上程序源代码:(界面库使用了轮子哥的GacUI:https://github.com/vczh-libraries/GacUI)
[C++] 纯文本查看 复制代码 #define GAC_HEADER_USE_NAMESPACE
#include <GacUI.h>
void GuiMain()
{
auto window = new GuiWindow(theme::ThemeName::Window);
window->SetText(L"SimpleCrackMe");
window->SetClientSize(Size(480, 320));
window->GetBoundsComposition()->SetPreferredMinSize(Size(480, 320));
window->MoveToScreenCenter();
auto StackLayOut = new GuiStackComposition();
StackLayOut->SetDirection(GuiStackComposition::Vertical);
StackLayOut->SetExtraMargin([&]() { ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(10); __vwsn_temp__.top = static_cast<::vl::vint>(10); __vwsn_temp__.right = static_cast<::vl::vint>(10); __vwsn_temp__.bottom = static_cast<::vl::vint>(10); return __vwsn_temp__; }());
StackLayOut->SetPadding(static_cast<::vl::vint>(5));
StackLayOut->SetAlignmentToParent([&]() { ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
auto label = new GuiLabel(theme::ThemeName::Label);
label->SetText(L"验证结果:");
{
FontProperties font;
font.fontFamily = L"Segoe UI";
font.size = 32;
font.antialias = true;
label->SetFont(font);
}
auto labelitem = new GuiStackItemComposition();
labelitem->AddChild(label->GetBoundsComposition());
StackLayOut->AddChild(labelitem);
auto textbox = new GuiSinglelineTextBox(theme::ThemeName::SinglelineTextBox);
auto textboxitem = new GuiStackItemComposition();
auto textboxbound = textbox->GetBoundsComposition();
textboxbound->SetPreferredMinSize([&]() { ::vl::presentation::Size __vwsn_temp__; __vwsn_temp__.x = static_cast<::vl::vint>(40); __vwsn_temp__.y = static_cast<::vl::vint>(40); return __vwsn_temp__; }());
textboxbound->SetAlignmentToParent([&]() { ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
textboxitem->AddChild(textboxbound);
StackLayOut->AddChild(textboxitem);
auto btnValidate = new GuiButton(theme::ThemeName::Button);
btnValidate->SetText(L"执行验证");
btnValidate->Clicked.AttachLambda([=](auto, auto) {
const wchar_t TruePassword[] = "这里是这个CrackMe的密码,我先不公布,以防有人还要玩";
const wchar_t* result = nullptr;
if (textbox->GetText() == TruePassword)
{
const wchar_t a[] = {L'验', L'证', L'结', L'果', L':', L'验', L'证', L'通', L'过', 0};
result = a;
}
else
{
const wchar_t a[] = { L'验', L'证', L'结', L'果', L':', L'验', L'证', L'不', L'通', L'过', 0};
result = a;
}
label->SetText(result);
});
auto btnValidatebound = btnValidate->GetBoundsComposition();
auto btnValidateitem = new GuiStackItemComposition();
btnValidatebound->SetPreferredMinSize([&]() { ::vl::presentation::Size __vwsn_temp__; __vwsn_temp__.x = static_cast<::vl::vint>(40); __vwsn_temp__.y = static_cast<::vl::vint>(40); return __vwsn_temp__; }());
btnValidatebound->SetAlignmentToParent([&]() { ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
btnValidateitem->AddChild(btnValidatebound);
StackLayOut->AddChild(btnValidateitem);
window->GetContainerComposition()->AddChild(StackLayOut);
GetApplication()->Run(window);
delete window;
}
是的,只有这一点,剩下全是库,甚至连main函数都是库里的,库经过一个初始化过程以后才调用我的GuiMain函数。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|