DuiLib逆向分析の按钮事件定位

0x00 前言

记录自己学习Duilib逆向分析的笔记。

DuiLib介绍

DuiLib官方介绍,Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联网公司普遍接受,广泛应用于包括IM、视频客户端、股票行情软件、导航软件、手机辅助软件、安全软件等多个行业的众多pc客户端软件。Duilib还在不断的发展中,在文档、例子、动画、渲染引擎等多个方面将持续改进。

DirectUI介绍,直接在父窗口上绘图,构建易于扩展的界面。(DirectUI意为直接在父窗口上绘图(Paint on parent dc directly)。即子窗口不以窗口句柄 的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上。)

Duilib是一个自绘控件界面库,可以很方便的构建高效,绚丽的,非常易于扩展的界面。

国外如微软,国内如腾讯百度等公司的客户端产品多采用这种方式来组织界面,从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。

DuiLib安装

安装DuiLib推荐用C++库管理器vcpkg来安装,这东西我感觉类似Python的pip。可以很方便的安装管理第三方库

vcpkg官方安装教程,安装vcpkg非常简单,就如下几条命令就搞定:

git clone https://github.com/microsoft/vcpkg
#将vcpkg目录添加到环境变量
RefreshEnv.cmd #更新环境变量
bootstarp-vcpkg.bat #vcpkg初始化相关文件
vcpkg integrate install #配置到VS相关环境中
vcpkg search [库名] #搜索相关第三方库
vcpkg install [库名] #安装第三方库

安装DuiLib库:

vcpkg install DuiLib #安装DuiLib库

DuiLib Hello,World!

装好了库后,我们来写第一个DuiLib程序,经典的Hello,World!

//DuiLib库头文件
#include <DuiLib/UILib.h>
//命名空间
using namespace DuiLib; //重写Windows窗口类,继承自->CWindow -> INotifyUI
class CDuilibWnd : public CWindowWnd,public INotifyUI
{ public:
//虚函数
virtual LPCTSTR GetWindowClassName() const {return _T("DuiWnd");}//窗口类
//重写响应消息
virtual void Notify(TNotifyUI& msg)
{
if(msg.sType == _T("click"))
{
if(msg.pSender->GetName() == _T("Hello_btn"))
{
MessageBoxA(NULL,"Hello,World!","Dui逆向の按钮事件定位",MB_OK);
}
}
}
//重写消息处理
virtual LRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam)//回调函数
{
LRESULT lRes = 0;
if(uMsg == WM_CREATE)
{
m_PaintManager.Init(m_hWnd);
//利用XML布局生成界面
CDialogBuilder builder;
CControlUI* pRoot = builder.Create(_T("duilib.xml"),0,NULL,&m_PaintManager);
ASSERT(pRoot && "Failed to parse XML");
m_PaintManager.AttachDialog(pRoot);
//用于处理消息
m_PaintManager.AddNotifier(this);
return lRes;
}
if(m_PaintManager.MessageHandler(uMsg,wParam,lParam,lRes)) return lRes;
return __super::HandleMessage(uMsg,wParam,lParam);
} protected:
CPaintManagerUI m_PaintManager;
}
int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);//绑定窗口句柄
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());//加载XML
//创建并显示窗口
CDuilibWnd duilibWnd;
duilibWnd.Create(NULL,_T("Dui逆向の按钮事件定位"),UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
duilibWnd.ShowModal();//监听消息
return 0;
}

duilib.xml 界面布局文件

<?xml version="1.0" encoding="UTF-8"?>
<Window size="320,100">
<HorizontalLayout bkcolor="#FFFFFFFF">
<Button name="Hello_btn" text="按钮" height="40" width="80" bordersize="1,1,1,1" bordercolor="#0079DE" padding="111,10,0,0"/>
</HorizontalLayout>
</Window>

编译生成后的界面如下,并且点击按钮后触发了事件:

Duilib逆向分析之定位按钮事件

碎碎念

所以我觉得做逆向开发,不能盲目的一开始就去看OD,去IDA F5反编译,而是应该擅长利用搜索引擎去学习了解相关:框架、库、模型、开发等知识,有了这些知识后逆向就如鱼得水。

第一步:获取xml布局文件

首先切入点是从duilib.xml文件开始,所以我们在逆向Duilib相关程序时候应该先拿到他的布局文件。

而在我们的demo中duilib.xml是在本地的,而在源码中可以看到builder.Create来加载使用duilib.xml

如果xml在本地的话则很简单直接找到路径即可,但是常规逆向分析中基本都是在内存中的,那这种要如何获取到他的xml布局文件呢?

思路还是一样,先定位到这个builder.Create函数,然后跟进去一步步调试,看堆栈信息,看经过哪一句汇编代码或Call后出现xml内容。

第二步:按钮事件分金点穴

当我们拿到布局后,找到对应按钮的名称,例子中的按钮对应的名称是Hello_btn,然后去调试软件中搜索相关字符串Hello_btn

并且下上断点。

当我们点击按钮后,成功的断到如下位置:

断点断到后,查看上下文中的汇编就已经很明显了,在je下面 (je那一句是判断当前btn按钮事件是否是Hello_btn的按钮事件),对应的源码就是:

if(msg.pSender->GetName() == _T("Hello_btn"))
{
MessageBoxA(NULL,"Hello,World!","Dui逆向の按钮事件定位",MB_OK);
}

感谢观看我的笔记,如有问题请指出谢谢。

逆向、PWN学习交流

DuiLib逆向分析の按钮事件定位的更多相关文章

  1. Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

    之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...

  2. 逆向实战干货,快速定位自动捡阳光Call,或者标志

    逆向实战干货,快速定位自动捡阳光Call,或者标志 注意: 关于CE和OD的使用,这里不再多说,快速定位,默认大家已经有了CE基础,或者OD基础. 第一种方法,找Call 第一步,打开CE,搜索阳光值 ...

  3. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  4. Android逆向分析(2) APK的打包与安装

    http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...

  5. 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序

    0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...

  6. Android无需权限显示悬浮窗, 兼谈逆向分析app

    前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...

  7. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  8. asp.net中父子页面通过gridview中的按钮事件进行回传值的问题

    这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来: 问题描述: 父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会 ...

  9. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

随机推荐

  1. 大一C语言学习笔记(3)---对于程序员来说,学历和能力,到底哪个重要?

    在高考失利后,我合理地萎靡一段时间,振作起来之后选择了我憧憬了10年的计算机专业---软件工程.但由于分数受限,也是选择了二本普通院校黑科技(我当然爱她,我的母校),而因为学历上的自卑,让我有了想考研 ...

  2. CF264BGood Sequences

    CF264BGood Sequences 题面 大意 寻找最长递增字串,使得相邻两个数不互质. 思路 动态规划思想,ans记录当前的数以下标i为约数答案,使得需要填进去的数肯定与前一个数不互质.在开始 ...

  3. [loj3524]钥匙

    由于到达关系具有传递性,可以考虑不断将若干个可以相互到达的点缩点,并且当两个点只能单向到达时,能到达另一个点的点一定不是最小值 由此,我们来考虑dfs,即不断从一个节点开始,遍历其可以到达的点,当发现 ...

  4. [bzoj3123]森林

    首先对于询问操作可以使用可持久化线段树来维护,对于连边操作对于两颗树中选取较小的树暴力练到另一个点上,点数可以用并查集然后只修改根的点数即可. 1 #include<bits/stdc++.h& ...

  5. 第04章_MySQL运算符详解

    第04章_运算符 1. 算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+).减(-).乘(*).除(/)和取模(%)运算. 1.加法与减法运算符 ...

  6. javascript-初级-day03自定义属性

    day01-自定义属性应用 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type ...

  7. C#使用Thrift作为RPC框架入门(三)之三层架构

    前言 这是我们讲解Thrift框架的第三篇文章,前两篇我们讲了Thrift作为RPC框架的基本用法以及架构的设计.为了我们更好的使用和理解Thrift框架,接下来,我们将来学习一下Thrift框架提供 ...

  8. SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(2)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节我们将继续讲解避免链路信息丢失做的设计,主要针对获取到现有 Span 之后,如 ...

  9. keepalived+nginx安装

    安装keepalived+nginx做为公司服务器前端高可用反向代理安装nginx 1.yum install -y pcre pcre-devel gcc-c++ zlib zlib-devel o ...

  10. Mybatis批量添加、更新小结

    虽然是很基础的东西,不过难免会忘记,所以写个笔记巩固一下,顺便分享. 实体类: @Data public class EventOrder { ​ private Long id; ​ private ...