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. CCCC-exercise

    CCCC-exercise 1.L1 总结L1 1-27里面我觉得有东西可以总结的题目 贴了部分的代码 L1-006(20) 一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 ...

  2. part 36 AngularJS route reload

    In this video we will discuss angular route service reload() method. This method is useful when you ...

  3. Github webhooks 自动部署博客文章,使用总结【含视频】

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/VtTHUfyiITNSoGy052jkXQ 沉淀.分享.成长,让自己和他人都能 ...

  4. linux安装python3.6.1

    Linux下安装Python3.6和第三方库   如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!! ...

  5. <C#任务导引教程>练习十

    /*83,使用接口完成多继承问题 简化版*/using System;interface ITeacher{    string Name    {        get;        set;   ...

  6. [cf1486F]Pairs of Paths

    以1为根建树,先将所有路径挂在lca上,再分两类讨论: 1.lca相同,此时我们仅关心于lca上不经过第$a$和$b$个儿子路径数,容斥一下,即所有路径-经过$a$的-经过$b$的+经过$a$和$b$ ...

  7. ICCV2021 | SOTR:使用transformer分割物体

    ​前言 本文介绍了现有实例分割方法的一些缺陷,以及transformer用于实例分割的困难,提出了一个基于transformer的高质量实例分割模型SOTR. 经实验表明,SOTR不仅为实例分割提供了 ...

  8. DataGrid首次进入页面时,不加载任何数据[转]

    首次不加载数据问题,必须搞明白如何才能不加载数据.根据Easu UI的官方API: http://www.jeasyui.com/documentation/ 仔细观察DataGrid的事件当中有一个 ...

  9. MySQL数据库从入门到放弃(目录)

    目录 MySQL数据库从入门到放弃 推荐阅读 MySQL数据库从入门到放弃 193 数据库基础 194 初识MySQL 195 Windows安装MySQL 196 Linux安装MySQL 197 ...

  10. MySQL的B+树索引和hash索引的区别

    简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构:索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询一次,如果不使用索引 ...