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. 关于Thread的interrupt

    关于Thread的interrupt Thread的interrupt方法会引发线程中断. 主要有以下几个作用: 如Object的wait方法,Thread的sleep等等这些能够抛出Interrup ...

  2. 【linux系统】命令学习(六)awk sed grep 与管道的使用

    程序运行环境输入与输出 标准输入0 read a;echo $a 标准输出1 echo cesh 错误输出 ls notr 管道重定向 管道与管道之间可以重定向 管道与文件之间可以重定向 用于写入 将 ...

  3. Java安全之基于Tomcat的Filter型内存马

    Java安全之基于Tomcat的Filter型内存马 写在前面 现在来说,内存马已经是一种很常见的攻击手法了,基本红队项目中对于入口点都是选择打入内存马.而对于内存马的支持也是五花八门,甚至各大公司都 ...

  4. [loj3463]表达式求值

    类似cf582E,先建出表达式树,然后树形dp+离散+min和max卷积的优化,复杂度为$o(nm|E|)$,无法通过 考虑我们仅关心于这$n$个数的大小关系,具体来说,假设给出的数组是$a_{i,j ...

  5. WinRAR下载

    https://www.win-rar.com 垃圾7Z有的解压不了.

  6. ppt的作用

    ppt不重要,使用ppt的场合很重要. 演讲分享,答辩总结,商业竞标,新年计划,年终总结.

  7. while,do...while及for三种循环结构

    循环结构 while循环 while (布尔表达式) { //循环内容 } 只要布尔表达式为true循环就会一直执行 我们大多数情况会让循环停止下来,需要一个让表达式失效的方式来停止循环 while循 ...

  8. char *p、char p[]、字符串的几个题目

    总结一下遇到的关于char *p.char p[]和字符串的题目: 例一:(指针的指针) 1 void getmemory(char **p) 2 { 3 p = (char *)malloc(100 ...

  9. NCBI SRA数据如何进行md5校验?

    下了一些sra数据库中的公共数据,因为pretech和aspera不稳定,稍微大点的文件经常传断,部分文件我只能通过本地下载再上传. 那么问题来了,sra没有md5校验,我怎么知道我数据的完整性,尤其 ...

  10. snakmake 小练习

    最近在学习snakemake 用于生信流程管理,现在用一个snakemake 来完成小任务:将在某一文件夹下的多个bam文件截取一部分,然后建立索引,在提取出fastq序列,最后比对回基因组. 需要两 ...