前言

“一款QT开发的国外软件,大概率是没有做中文支持的,所以你汉化中,不论怎么设置编码都一定是乱码。面对这个问题,你去互联网上找答案,答案却大多是复制粘贴的开发中解决乱码的文章,可是我们是要逆向中解决,于是吾爱破解、汉化新世纪等找过来,盘搜搜个遍,发现基本不是资源过期就是驴唇不对马嘴的抄袭贴,所以我来发一篇干货,同时网盘中上传本期视频片源,可供收藏传播。给那些遇到这个坎过不去,又找不到有用资料的提供帮助!”

准备

【环境和工具】

  • win7/xp虚拟机环境

  • pdf2any原版安装程序(qt开发的国外程序,不支持中文,无源码)

  • ollydbg

  • Radialix 3

  • 010editor

  • qt-win-opensource-4.8.2-mingw.exe(相当于QT库支持,核心部件)

  • qt-creator-opensource-windows-x86-3.3.0.exe(相当于编辑器而已)

  • MinGW.rar(编译调试环境)

  • 最后三个是QT开发环境,搭建起来有利于学习,当然如果你不想玩QT开发那其实只用装第一个就行了,里面有QT各种库函数的源码,遇到相应程序浏览源码即可

【学习层次】

  • 生搬硬套,能解决大部分QT汉化中乱码问题

  • 搞懂搞透,举一反三

实战图文

一.某QT程序汉化中遇乱码

  • QT开发的国外软件

  • 不论怎么搞,都是乱码

  • 例如汉化下图中的标题registration

乱码

二.逆向分析寻找原因

1.OD中定位标题字符串

程序载入OD,定位"registration",并查看,程序中都有那些位置会调用这个字符串,如图

发现有三个地方调用了这个字符串地址,全部下断点

2.运行观察

断点下好后,运行程序,观察调用字符串的逻辑流程,发现下的三个断点中有两个在程序启动会被调用,调用的目的分别是作为两个QT库函数的参数,如下图

3.正向查阅相关函数源码

这里多说一句,玩逆向不只光玩逆向,一直强调逆向是一种思维,逆向破解的逆向就是开发,活用开发资料,逆向破解中往往事半功倍。

安装QT后就可以看QT各种库函数的源码和资料,如果你想更深入的了解,给吃透的话,最好的方式莫过于自己开发,自己逆向分析。具体QT环境的搭建可以参阅下面链接

https://wenku.baidu.com/view/4e7d7f415a8102d276a22f88

开始寻找目标函数源码,everything搜两个函数类命,QCoreApplication和QMetaObject,如下图

打开源码,阅读相关函数,源码如下

QCoreApplication::translate函数定义,发现核心参数就是这个枚举类型,当枚举类型为0的时候中文是乱码,当是1的时候中文没问题

QMetaObjcet::tr函数实现,发现这个函数的实质其实是以枚举类型参数为0去调用QCoreApplication::translate

4.逆向中验证上面的正向源码

从新载入OD,重新运行,根据上面正向查阅的源码资料观察相应的两个库函数在逆向中的体现,如下图

可见,两个函数其实最终调用的都是第一个函数,而核心关键点就是枚举类型参数的值,那么我们在第一个库函数入口【6A2B5818】下断点动态运行一下,堆栈中观察参数的变化,如下动图

5.总结所有线索

  • 标题字符串Registration被函数QCoreApplication::translate作为参数

  • 标题字符串Registration被函数QMetaObeject::tr作为参数

  • 两个函数核心都是QCoreApplication函数

  • QCoreApplication控制中文乱码核心参数是枚举类型,值0乱码,1是utf-8支持中文

  • QMetaObeject::tr调用的QCoreApplication::translate关键枚举类型是0,所以标题最后是不支持中文的,导致一汉化产生乱码

、修改QT库QTCore4.dll解决问题

其实上面的分析如果已经完全搞懂了,其实就已经知道怎么解决了,而且解决方法有很多,但是都并不能保证所有程序的通用性,毕竟一个开发一个样,这次他用这个库函数,没准下次他用另外一个,所以吃透后,具体问题具体分析才是任何武功中的“无招胜有招”!针对于这个案例,解决的思路就至少有以下三种

  • 程序领空修改,让其调用的QMetaObeject::tr更换为QMetaObeject::trUtf8(阅读源码就会发现有这个函数,为什么此案例他没调用这个,因为是国外软件,他压根没想支持中文,所以他用的是tr而不是trutf8),这样修改的好处,可以相对保证汉化者的劳动成果,毕竟修改的地方可能会多,而且只在程序领空修改,但通用性差,换个程序百分百没用

  • 修改库函数QMetaObeject::tr,让他调用QCoreApplication::translate时,枚举参数设置成1,也就是压根用逆向的方式把QMetaObeject::tr函数改成了QMetaObeject::trUtf8,好处通用性较强。

  • 修改QCoreApplication::translate内部逻辑,让枚举类型为0时,也按为1的流程逻辑走(最常见的爆破套路),有点通用性很强,极大程度适用很多QT程序汉化乱码问题

两种标红的方法都是修改QT库函数,所以最终体现是修改了QTcore4.dll这个文件,方法分别如下

方法1

方法2

修改后,生成新的qtcore4.dll文件,替换原版qtcore4.dll就会发现,再去汉化此软件,乱码问题已经解决了。我们依然以汉化题目为示例,OD中修改数据(如果你是大量汉化工作就别用OD了否则累死哦),注意要是utf-8的内存编码形式,关于编码常识可以在公众号内回复“编码”阅读,也可以点此链接 编码常识 ,修改标题registration为“测试”,“测试”的utf-8内存编码模式16进制数据是E6 B5 8B E8 AF 95 ,转换方法如下,有兴趣的也可以自己写工具

notepad++写入内容,转码

010editor查看16进制内容

OD改字符串

乱码解决

行业干货-如何逆向解决QT程序汉化中乱码问题的更多相关文章

  1. 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)

    Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...

  2. 解决Qt程序在Linux下无法输入中文的办法

    解决Qt程序在Linux下无法输入中文的办法 一位网友问我怎样在Linux的Qt的应用程序中输入中文,我一開始认为不是什么问题,可是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...

  3. 【Qt开发】解决Qt程序在Linux下无法输入中文的办法

    解决Qt程序在Linux下无法输入中文的办法 一位网友问我如何在Linux的Qt的应用程序中输入中文,我一开始觉得不是什么问题,但是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...

  4. 解决Qt程序在Linux下无法输入中文的办法(与下文连接)

    在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...

  5. DotNet程序汉化过程--SnippetCompiler准确定位

    开篇前言 上一篇简单介绍了一下怎么汉化.Net程序,但那也仅仅是最基础的工作,要想汉化好一款软件基础我们得做扎实了,但是对于一些需要技巧的也不能不会啊,这一篇就介绍一下怎么准确定位字符串. 主要使用工 ...

  6. DotNet程序汉化过程--SnippetCompiler简单解说

    SnippetCompiler介绍 平时要验证一段C#代码或者写一个算法,就得打开庞大的VS新建一个解决方案,占用了硬盘空间不说还费时费力.SnippetCompiler这个工具就可以在这里帮到我们了 ...

  7. webstorm汉化后乱码现象解决

    本人之前使用的编辑器是sublime,今天换成webstrom,汉化时出现乱码现象,一开始我以为是没安装完整所以重装了好几遍,后来百度后才知道是webstrom字体类型的问题,具体解决方法如图,点击最 ...

  8. 解决Affter Effect汉化版(cc2015之后的版本)中出现表达式错误的一种常用方法

    解决Affter Effect出现表达式错误的一种常用方法 问题:汉化版的AE中,使用模板会出现表达式错误之类的提示,可能会导致某些设置或者效果失效 解决办法: 方法一.将配置文件中的zh_CN 改为 ...

  9. DotNet程序汉化过程--SnippetCompiler奇葩的字符串

    开篇前言 汉化的过程总会遇到各种各样的问题,让人抓狂,这一篇我就来讲解一下一个特殊的单词的汉化以及我的“艰辛历程”. 起因介绍 在SnippetCompiler有这么一个奇葩的字符串“查找>&g ...

随机推荐

  1. shell中>/dev/null 2>&1

    本文转自http://www.kissyu.org/ 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬 ...

  2. 【Beta Scrum】冲刺!4/5

    1. 今日完成情况 人员 学号 分工 是否完成 完成情况 胡武成 031502610 完成登录注册api,协助web端完成api Y 基本逻辑写完,短信部分还在修改中,预计明天早上便能完成 郭剑南 0 ...

  3. 阿里八八β阶段Scrum(5/5)

    今日进度 陈裕鹏: 简单信息抽取编码完成 叶文滔: 处理了信息抽取编码的一些BUG,修复了日程界面不会自动更新添加的日程的BUG,修改了原先测试用的TAG以及数据分析部分数据计算数值错误的问题 王国超 ...

  4. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  5. poi对excel的基本读写操作

    最近简单的弄了下poi对excel的应用,为方便自己以后的使用就把一些基本操作记录下来,其他更复杂的操作可以等以后有需求的时候再来深入了解一番! 写操作: /** * * 层次结构就是workbook ...

  6. jquery计算时间差(天、时、分、秒)并使用定时器实时获取

    类似网站抢购需求,会有个时间倒计时的展示(天.时.分.秒) 要拿到最终时间与当前时间对比,算出时间差并用定时器以秒的方式执行 实现代码: $(document).ready(function(){ r ...

  7. linux命令之 df file fsck fuser

    有非常多人说,网上非常多知识点都有了.为什么你还要在自己的博客中反复这些东西呢? 我想说的是.别人写的东西是别人理解的东西,同一时候也是别人学习过程的总结,对于自己来说.自己写自己的博客最基本的目的就 ...

  8. ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序;ASP.NET WebForm和MVC总体请求流程图

    ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序 1.BeginRequest  開始处理请求 2.AuthenticateRequest 授权验证请求 ...

  9. Iris框架源码阅读和分析

    iris包结构简介 iris包含了很多包,下面这些是分析过程中接触到的东西. 能力有限,多多包涵,欢迎联系QQ:2922530320 一起交流 context包包含: Context (接口) con ...

  10. Linux下 XordDos(BillGates)木马查杀记录

    最近朋友的一台服务器突然网络异常,cpu占用率暴表,登录上去一查,cpu占用300% 左右,流量异常,经过看查进程,获取信息最终确认为中了dos木马,经过几天的研究,基本上已经清除,以下是清理记录. ...