XCTF-攻防世界CTF平台-Reverse逆向类——59、mfc逆向-200(MFC编程逆向)

先查看程序信息:
在这里插入图片描述

Windows 32 位GUI程序,符合题目中MFC编程的程序,被加了VMProtect。
运行程序:
在这里插入图片描述

用xspy查看程序控件信息:
在这里插入图片描述

获得程序窗口句柄:00170E52
类名:944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b
再观察程序的消息处理函数:
在这里插入图片描述

接受到以下消息:
WM_SYSCOMMAND(0x112,274):当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息;
WM_PAINT(0xf,15): 要求一个窗口重画自己;
0x0464:用户自定义的消息;
WM_QUERYDRAGICON(0x37,55):此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标;
之后调用相应的函数。
我们看到程序自定义了一个消息0x0464(1124),所以我们用代码给程序发送一个该消息,观察它接受到这个消息之后会调用函数做什么处理:
SendMessage.cpp

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
    //获取窗口句柄
    HWND hwnd = ::FindWindowA(NULL, "Flag就在控件里");
    if (hwnd)
    {
        //向指定句柄程序发送一条消息0x464
        SendMessage(hwnd, 0x464, NULL, NULL);
    }else{
        printf("没有找到接收窗口");
    }
    system("pause");
    return 0;
}

其中

LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);
参数:
  hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口;
  wMsg用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量;
  wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄;
  lParam通常是一个指向内存中数据的指针。由于WParm、lParam和Pointer都是32位的,因此,它们之间可以相互转换 返回值:返回值指定消息处理的结果,依赖于所发送的消息。

也可以直接用软件给程序发送消息:
在这里插入图片描述

之后我们的程序就调用函数显示了{I am a Des key}:
在这里插入图片描述

说明它是一个DES算法的密钥,我们开始看到类名:944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b,就是一个64位密文与DES算法输出的密文位数相等,所以我们利用密钥将密文解密:
在这里插入图片描述

得到明文:thIs_Is_real_kEy_hahaaa,就是flag。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先关于 [评价可免费] 的严重声明: 一、评价=评论加评价(评星星); 二、评价必须是下载完了该资源后的评价,没下载就评论无效; 三、如果正确评价了,返还积分可能需要等等,系统需要反应下。呵呵 评论时记得要评分。然后会返回给你花费的分再加1分.理论上有十分就可以下载完所有的资源了。一般人我不告诉他。 MFC 程序逆向 – 消息篇(上) 作者:szdbg Email:[email protected] 前言: 记得前一段时间,我刚接触软件破解和逆向这一行时,对于一些软件不知从何处跟踪按钮消息,试了好多方法,就是断 不下来,在系统模块中经常转得晕头转向,而一无所获。 MFC 程序是一种常见型的程序,我静下心来,潜心研究了一下MFC 消息流程。弄清原委之后,一切豁然开朗,发现跟 踪MFC 程序和消息处理原来是如此。。。,跟踪按钮事件处理也由此变得特别简单。 于是,我将这些研究整理成文,以备后忘。并希望大家有所帮助,失误之处,请高手指正。 的确, .Net之的程序必定是大势所趋,不过,就目前来说,MFC程序在软件市场还是占有重要的一席之地,所以,了解它,对于逆向和破解此程序还是很有必要的. MFC之所以显的复杂,就在于它隐藏了它的消息的处理机制,可以说, 程序员基本上不需要懂得它的消息处理过程,就可以写出一套满足应用的软件来.这有好有坏,好的是大大简化了程序员写程序的过程,坏的一方面是,给一般程序员留下了一个迷团: 我只知道这样做,而不知道为什么这样做.心里老是觉得不踏实.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值