0%

【Linux技术分享】ida修改dll并进行保存

ida修改目标dll

问题描述

使用ida修改pb工具开发的一款应用中的打印模块,该应用会在打印中会弹出 “1 of 1 ….”对话框,已知该字符串通过”set_window_text”函数实现对话框显示

问题解决

  1. 该应用使用pb进行开发,根据学习PowerBuilder发现在 PowerBuilder 中,打印功能通常由 DataWindow 模块处理。pbdwe90.dll 是与 DataWindow 相关的一个核心动态链接库,负责 DataWindow 的渲染和数据处理。打印操作会通过 DataWindow 进行,因为 DataWindow 提供了格式化数据、生成报表和处理打印的功能。

  2. 通过ida打开该dll文件,弹出选择界面,该界面是选择不同架构类型处理器,由于不同架构处理器对其指令集有不同,我这里选择Metapc,通用性x86架构进行打开

图3

  1. 根据wine下日志发现调用set_window_text函数附近是调用StartDocW,在该dll中调用打印函数较少,根据这个调用找到其中上下文

图4

  1. 从ida下打开导入表,找到StartDoc函数

图5
图111
5. 双击该函数,右键点击Jump to xref to operand

  1. 键盘按键f5,生成反汇编窗口中的函数对应的伪代码
    图7

  2. 根据对伪代码学习,发现其调用SetDlgItemTextA函数,比较像是弹窗中的文本内容,这边在wine中增加该函数日志

图8

  1. 发现函数中的字符串内容与弹窗的内容一致,为set_window_text函数中的内容
    图9

  2. SetDlgItemTextA函数为设置文本框内容,第一个参数为窗口句柄,在伪代码中找到创建该句柄位置
    图10

  3. 该对话框在if判断中进行窗口创建,目前准备修改if判断让其无法进入判断。首先将该语句变成指令汇编

  4. 找到该if判断语句地址,该汇编为cmp->jnz,意思为比较若不为0则跳转
    图15

  5. 修改很简单,将其判断改反即可,把jnz修改为jz,修改完如下图
    图12
    图13

  6. 将其修改的patch进行保存即可

图16

方案验证

将修改的dll替换至容器进行打印,对话框在打印过程中未显示,set_window_text函数也为调用,修改成功