最近逐渐遇到一些对IAT32ASRarm32、64(Linux)框架以外的各种框架的reprogram逆向分析。题目虽然不难,但确实让人耳目一新。而这会不会是题主释放的一个信号,代表着未来重题的新方向?以认真严谨的态度,我觉得应该总结一下。QTFramework程序逆向简介Qt是Qt公司于1991年开发的跨平台C++图形用户界面应用程序开发框架,可用于开发GUI程序以及非GUI程序,如控制台工具和服务器.Qt是一个面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))和一些宏,Qt易于扩展并允许真正的组件编程。另一方面,QT实现了对iOS、Android和WP的全面支持,它为应用程序开发人员提供了创建最先进的图形用户界面所需的所有功能。Qt框架仍然被广泛使用。为了给大家一个直观的概念,我在电脑上用Everything搜索了qt5core.dll。部分结果如下图所示:QT对象树Qt提供了一种机制,可以自动、有效地组织和管理继承自QObject的Qt对象的机制就是对象树。如图所示,QObject对象只有一个父对象,但可以有多个子对象。这样排列会形成一个对象树结构,最上层是父对象,最下面是子对象,最下面是孙对象,依次类推。当父对象被销毁时,子对象列表中的所有对象都会被销毁,当子对象被销毁时,会自动从父对象的子对象列表中删除。那么Qt为什么要这样设计呢?很简单,方便内存管理。当我们创建一个QObject对象时,我们提供了一个父对象,那么我们创建的QObject对象会自动添加到其父对象的children()列表中。这种机制在GUI程序开发过程中非常实用。值得注意的是,如果在构造时将父对象设置为NULL,那么当前实例将没有父对象,Qt也不会自动销毁该实例。Tips:QWidget的运行过程QWidget也是QObject的子类,所以父类机制没有区别。但是在实际使用中,QWidget及其派生类的内存管理稍微复杂一些。例如QWidget的关闭过程中,首先用户点击关闭按钮触发close()槽,默认的QCloseEvent会隐藏该widget,即触发hide()槽。也就是说,widget的关闭实际上是隐藏了它,并没有释放内存。虽然我们有时会重写closeEvent,但是widget不会手动释放。解决方法:需要设置Qt::WA_DeleteOnClose属性,关闭后会调用widget的析构函数。tips2:对象树模型的问题俗话说百密终疏一疏。对象树模型特殊的解构规则很可能注定了它会爆出逻辑漏洞。看下面的程序:#include#includeintmain(intargc,char*argv[]){QApplicationa(argc,argv);QPushButtonbtn("按钮");QWidget小部件;btn.setParent(&widget);widget.show();returna.exec();}运行结果:关闭widget后程序崩溃,为什么没有正常结束程序会崩溃?通过上面的学习,我们知道C++规定了销毁的顺序应该按照它们创建的顺序的倒序。而当我们先创建子对象,再创建父对象时,根据自动销毁的原理,当我们销毁父对象时,父对象也会自动销毁。这时候子对象已经销毁了,但是代码还在继续执行。按顺序,需要再次销毁子对象。这时候子对象的析构函数被第二次调用。两次调用析构函数在C++中是不允许的,最终导致程序崩溃。避免问题的解决方法:先创建父对象再创建子类对象,创建子对象时指定父对象;尝试在堆上创建子对象;QT程序的特殊机制--signal/slot先看官方介绍:Signals/slots是Qt框架引以为豪的机制之一。所谓信号槽,其实就是观察者模式。当一个事件发生时,例如,一个按钮检测到它被点击,它发送一个信号。这种发射是无目的的,类似于广播。如果一个对象对这个信号感兴趣,它就会使用connect函数,也就是说,将它要处理的信号绑定到它自己的一个函数(称为槽)来处理信号。也就是说,当信号发出后,连接的槽函数会自动回调。这类似于观察者模式:当感兴趣的事件发生时,会自动触发一个动作。(这里要提一下,Qt的信号槽是使用附加处理实现的,不是GoF经典观察者模式的实现。)Qt使用信号(Signal)和槽(Slot)机制进行对象间的通信。信号和槽可以通过QObject对象的connet函数关联起来。我们可以使用emit(Qt定义的语句)发出一个信号,与该信号关联的槽会接收到该信号进行处理。QT5信号槽写法#include#includeintmain(intargc,char*argv[]){QApplicationapp(argc,argv);QPushButton按钮("退出");QObject::connect(&button,&QPushButton::clicked,&app,&QApplication::quit);按钮.显示();returnapp.exec();}QT4写法intmain(intargc,char*argv[]){QApplicationa(argc,argv);QPushButton*button=newQPushButton("退出");连接(按钮,信号(点击()),&a,插槽(退出()));按钮->显示();返回a.exec();}关键函数connectconnect()函数最常用的一般形式:connect(sender,signal,receiver,slot);参数:sender:发送信号的对象signal:发送对象发送的信号receiver:接收信号的对象slot:receive对象接收到信号后需要调用的函数signal/slot的特殊属性1.一个信号可以连接到多个槽。如果是这样的话,这些slot会依次被调用,只是它们的调用顺序不一样。定。2.多个信号可以连接到一个插槽。只要发出任何信号,槽就会被调用。3.一个信号可以连接到另一个信号。当发送第一个信号时,发送第二个信号。除此之外,这种信号-信号形式和信号-时隙形式没有区别。4.Slotscanbeunlinked这种情况并不会经常发生,因为当一个对象被删除时,Qt会自动取消所有连接到这个对象的slots。5、使用Lambda表达式在使用Qt5时,所有能够支持Qt5的编译器都支持Lambda表达式。我们的代码可以这样写:QObject::connect(&newspaper,static_cast(constQString&)>(&Newspaper::newPaper),[=](constQString&name){/*Yourcodehere.*/});在连接信号和槽时,可以使用Lambda表达式处理槽函数。6、信号槽要求信号和槽的参数一致。所谓一致性,就是参数类型一致。如果不一致,则允许槽函数的参数少于信号的参数。即便如此,插槽函数中存在的那些参数的顺序必须与信号的前几个一致。这是因为在槽函数中可以选择忽略来自信号的数据(即槽函数的参数比信号少),但是信号根本没有这个数据,一定不能用在槽函数。[GKCTF2021]QQQQTvirtualbox打包的QT程序。奇怪的主要功能....奇怪的关键功能。前向引用无法分析,main函数的代码很奇怪……找不到关键函数调用。只能用曲线救国,通过字符串搜索找到密文,再通过对照定位到关键函数。一次base58加密、解密:mfc框架逆向mfc框架介绍老规矩,先看官方解释:MFC库是一个用于开发Windows应用程序的C++接口。MFC提供了一个面向对象的框架,采用面向对象的技术,将大部分WindowsAPI封装成C++类,以类成员函数的形式提供给程序开发人员。简单来说,MFC是一个面向对象的windows应用程序开发框架。它的突出特点是封装了大部分windowsAPI,供开发者使用。MFC程序的运行过程分为以下四个步骤:使用全局应用程序对象theApp启动应用程序。调用全局应用对象的构造函数,从而调用基类(CWinApp)的构造函数,完成应用的一些初始化工作,保存应用对象的指针。输入WinMain函数。在AfxWinMain函数中获取子类的指针,利用该指针实现以上三个功能,从而完成窗口的创建和注册。进入消息循环直到WM_QUIT。如何逆向mfc程序如何逆向mfc程序?一个非常朴实的问题(雾)。下面介绍两种常用的方法。程序初始化函数下找到断点AfxOleInit(COM初始化)AfxEnableControlContainer(Ole初始化)AfxGetModuleState(获取模块状态)CoInitialize(COM初始化API)GdiplusStartup(GDI+初始化)SetUnhandledExceptionFilter(拦截异常处理)Enable3dControls()CWinApp()使用工具mfc用于程序逆向分析,前人开发了一些非常好用的小工具。站在巨人的肩膀上,掌握工具的使用,可以大大提高mfc程序的分析效率。常用工具:彗星助手xspyResourceHacker[HDCTF2019]MFC首先通过彗星助手获取窗口信息(关键是句柄)。得到:944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b一大串密文:然后用xspy扫描mfc窗口的每一帧。扫描到一个特殊的onMsg,0464,为什么特殊,因为它是唯一没有被系统函数包裹的参数。这里多说一句,xspy的使用方法是把小放大镜拖放到mfc窗口中(因为无知,双击小放大镜半天没反应就跳了)。接下来,我们使用彗星助手将0464(记得转换成十进制的1124)传给mfc盒子。这样就得到了deskey,找一个des解密网站解密得到flag。参考链接https://www.52pojie.cn/thread-497018-1-1.htmlhttps://blog.csdn.net/liujiandu101/article/details/84390269https://blog.csdn.net/baidu_41388533/article/details/111292441https://blog.csdn.net/qq_34139994/article/details/105391611https://www.52pojie.cn/thread-65091-1-1.html