DuiLib逆向分析の按钮事件定位
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逆向分析の按钮事件定位的更多相关文章
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...
- 逆向实战干货,快速定位自动捡阳光Call,或者标志
逆向实战干货,快速定位自动捡阳光Call,或者标志 注意: 关于CE和OD的使用,这里不再多说,快速定位,默认大家已经有了CE基础,或者OD基础. 第一种方法,找Call 第一步,打开CE,搜索阳光值 ...
- Android逆向分析(2) APK的打包与安装背后的故事
前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...
- Android逆向分析(2) APK的打包与安装
http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...
- 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序
0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...
- Android无需权限显示悬浮窗, 兼谈逆向分析app
前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- asp.net中父子页面通过gridview中的按钮事件进行回传值的问题
这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来: 问题描述: 父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会 ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
随机推荐
- 3组-Alpha冲刺-2/6
一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 在校内外进行了数据采集,采集了多场景的数据,并进行了帧分割. 展 ...
- [bzoj5417]你的名字
先考虑l=1,r=|s|的部分分,需要求出t每一个前缀的不是s子串的最长后缀,记作pp[k],有以下限制:1.pp[pos[k]]<len(pos[k]表示k的某一个结束位置),因为不能被匹配 ...
- [bzoj4943]蚯蚓排队
询问相当于要求长度为k的公共子串个数,很容易联想到hash,由于询问是对全局的,因此对全局开一个hash的桶对于合并/删除操作,将中间新产生/需要删除的字符串暴力修改即可,单次复杂度最坏为$o(k^{ ...
- Linux学习 - 树莓派4b的U-Boot的初识
Linux学习 - 树莓派4b的U-Boot的初识 初识U-Boot 学习书籍:<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.1> 章节:第三十章 学习内容: 书中介绍u ...
- Java设计模式之(十二)——观察者模式
1.什么是观察者模式? Define a one-to-many dependency between objects so that when one object changes state, a ...
- Vue 中使用 TypeScript axios 使用方式
Vue 中使用 TypeScript axios 使用方式 方式一 import axios from 'axios'; Vue.prototype.$axios = axios; // 在 .vue ...
- RSA,DSA,ECDSA,EdDSA和Ed25519的区别
RSA,DSA,ECDSA,EdDSA和Ed25519的区别 用过ssh的朋友都知道,ssh key的类型有很多种,比如dsa.rsa. ecdsa.ed25519等,那这么多种类型,我们要如何选择呢 ...
- perl 数组快速去除重复元素
这里记录两种perl数组去重的办法,一种利用哈希(hash),一种直接利用perl自带的模块List::MoreUtils内部的函数uniq. 一.利用hash去重 示例代码如下: 1 #!/usr/ ...
- SQL-关联表查询(连表查询)
0.例如:select * from T1,T2 where T1.a=T2.a 1.连表查询 <=> join(inner join)内连接查询 数据源: Persion表: ...
- Python中类的各式方法介绍
本文类的方法介绍包括类方法.属性方法.静态方法.修改属性方法等内置装饰器装饰的方法,以及类的一些特殊成员方法 1. 类的特殊成员方法 1.1 构造方法 # -*- coding:utf-8 -*- # ...