ida修改目标dll
问题描述
使用ida修改pb工具开发的一款应用中的打印模块,该应用会在打印中会弹出 “1 of 1 ….”对话框,已知该字符串通过”set_window_text”函数实现对话框显示
问题解决
该应用使用pb进行开发,根据学习PowerBuilder发现在 PowerBuilder 中,打印功能通常由 DataWindow 模块处理。pbdwe90.dll 是与 DataWindow 相关的一个核心动态链接库,负责 DataWindow 的渲染和数据处理。打印操作会通过 DataWindow 进行,因为 DataWindow 提供了格式化数据、生成报表和处理打印的功能。
通过ida打开该dll文件,弹出选择界面,该界面是选择不同架构类型处理器,由于不同架构处理器对其指令集有不同,我这里选择Metapc,通用性x86架构进行打开
- 根据wine下日志发现调用set_window_text函数附近是调用StartDocW,在该dll中调用打印函数较少,根据这个调用找到其中上下文
- 从ida下打开导入表,找到StartDoc函数
5. 双击该函数,右键点击Jump to xref to operand
键盘按键f5,生成反汇编窗口中的函数对应的伪代码
根据对伪代码学习,发现其调用
SetDlgItemTextA
函数,比较像是弹窗中的文本内容,这边在wine中增加该函数日志
发现函数中的字符串内容与弹窗的内容一致,为
set_window_text
函数中的内容SetDlgItemTextA函数为设置文本框内容,第一个参数为窗口句柄,在伪代码中找到创建该句柄位置
该对话框在if判断中进行窗口创建,目前准备修改if判断让其无法进入判断。首先将该语句变成指令汇编
找到该if判断语句地址,该汇编为cmp->jnz,意思为比较若不为0则跳转
修改很简单,将其判断改反即可,把jnz修改为jz,修改完如下图
将其修改的patch进行保存即可
方案验证
将修改的dll替换至容器进行打印,对话框在打印过程中未显示,set_window_text函数也为调用,修改成功