破解某PDF转换器产品
本文章纯属出于作者自己对技术的探索,绝不用于商业用途(虽然网上已经能够下载到注册机了)
软件功能就不多说了,PDF转换成WORD格式,对于学生党来说也算是神器了吧,那么我们今天就用自己的办法来获得这款神器的使用权。
下图是注册界面,软件会给我们提供一个机器码,那么可以推测,注册码就是根据机器码加密而成的了。
很遗憾OD并不能对这款软件进行调试,还好我们有另一个神器———IDA,先分析一下.exe文件,函数比较多。。一时找不到下手点。那我们先尝试输入一个错误的注册码,弹出了一个提示框
点确定后自动连接了如下网址:
tj.sjhfrj.com/redirect/ver1/pdfconverter/buy/6.5/Setup_xjpdf2word/1797259983
我们可以从这个网址上下手,在IDA里浏览一下字符串,看到了几个关键字符串,我们可以选择任何一个来查看它的交叉引用。
然后我们定位到了registerCodeEnter()函数中来,其上层函数如下图,那么这个registerCodeEnter()十有八九就是我们点击注册之后进入的函数了。
在registerCodeEnter()函数中我们看到了一个字符串判断的函数,如果判断不相等则跳到含有字符串”tj.sjhfrj.com/redirect/ver1/pdfconverter/buy/6.5/Setup_xjpdf2word”的函数中,所以我们有理由怀疑这个判断所调用的两个字符串就是真注册码与我们所输入的注册码,get_text得到的当然是我们输入的注册码,那么在PDFConvert.bllBase.dll中的get_reg_code(string)函数就是生成注册码的关键函数了(它调用的参数是string类型,初步猜测是机器码,返回值也是String类型,应该就是注册码)。
让我们来分析PDFConvert.bllBase.dll
为了使加密算法更直观,我把对整个get_reg_code函数的分析提取了出来:
.method public hidebysig instance string get_reg_code([opt] string machine_code) { .param [1] = string("") .maxstack 3 .locals init (int64 V0, string V1, int32 V2) ldarg.1 ldsfld string [mscorlib]System.String::Empty call bool [mscorlib]System.String::op_Equality(string, string) brfalse.s loc_1025 ldarg.0 call instance string PDFConvert.bllBase.reg::get_machine_code() starg.s 1 // 得到机器码(string型) loc_1025: ldarg.1 call int64 [mscorlib]System.Convert::ToInt64(string) stloc.0 // 把机器码转化成int64型的整数,保存到变量v0中 ldstr asc_20CE // "" stloc.1 ldc.i4.0 stloc.2 // 初始化一个int变量v2为0,作为计数器使用 br.s loc_1069 // 将计数器的值与0x64比较 loc_1036: ldloc.0 ldc.i4.2 conv.i8 mul // v0 = v0*2 stloc.0 ldloca.s 0 call instance string [mscorlib]System.Int64::ToString() stloc.1 // 把变量v0转化成字符串保存在v1中, ldloc.1 callvirt instance int32 [mscorlib]System.String::get_Length() ldc.i4.s 0xC // 获取v1长度与0xc比较 bgt.s loc_1056 ldloc.1 call int64 [mscorlib]System.Convert::ToInt64(string) stloc.0 br.s loc_1065 loc_1056: ldloc.1 ldc.i4.0 ldc.i4.s 0xC callvirt instance string [mscorlib]System.String::Substring(int32, int32) call int64 [mscorlib]System.Convert::ToInt64(string) stloc.0 // 如果v1长度大于0xc,则截取其前8位转换成int64型保存在v0中 loc_1065: // CODE XREF: PDFConvert.bllBase.reg__get_reg_code+44j ldloc.2 ldc.i4.1 add // v2++ stloc.2 loc_1069: ldloc.2 // 将计数器的值与0x64比较 ldc.i4.s 0x64 blt.s loc_1036 // 如果比0x64小,则进入循环 ldloca.s 0 call instance string [mscorlib]System.Int64::ToString() ret } |
然后我们需要尝试这用c++把源码还原出来,其中的大数操作真真的让人很头疼。
QWORD CtextDlg::encode(CString code) { QWORD m_code = 0; QWORD m_temp= 0; CString tmp; for (int i = 0; i < 0x64; i++) { tmp = code.Right(8); code = code.Left(code.GetLength() - 8); m_temp = _tcstoul(tmp, NULL, 10); m_code = _tcstoul(code, NULL, 10); m_code = m_code * 100000000 + m_temp; m_code *= 2; code.Format(L"%d", m_code / 100000000); code.AppendFormat(L"%08d", m_code % 100000000); int j = code.GetLength(); if (j>12) { code = code.Mid(0,12); } } tmp = code.Right(8); code = code.Left(code.GetLength() - 8); m_temp = _tcstoul(tmp, NULL, 10); m_code = _tcstoul(code, NULL, 10); m_code = m_code * 100000000 + m_temp; return m_code; } |
至此,注册机就算是出炉啦,让我们试一试效果
Perfect!可以开开心心的使用啦!
破解某PDF转换器产品的更多相关文章
- .NET破解之迅捷PDF转换器(续)
在以前的博文<.NET破解之迅捷PDF转换器>中使用了暴力破解的方法,现在软件版本从5.0升级到6.3,所以也尝试用新的方法. 方法一:暴力破解法 如往常一样,查找搜索到关键的函数,即Is ...
- 破解加密PDF文件pdfcrack
破解加密PDF文件pdfcrack PDF是常见的文档格式.它允许用户设置双重密码来保护文档.第一重是用户密码(user password),当打开PDF文档,输入该密码.第二重是所有者密码(ow ...
- .NET破解之PDFdo转换器
无意中看到一个PDF转换器,叫PDFdo,看起了功能挺多的,于是想把它破了. 下载 官网:http://www.pdfdo.com/ 安装 安装后,只有一个exe应用程序,如果是.NET 程序应该有很 ...
- PDF转WORD工具推荐:迅捷PDF转换器6.8版
迅捷PDF转换器是一款功能强大的pdf转换成word转换器软件.它不仅支持pdf转换成word,word转pdf,还可以实现excel,ppt,jpg与pdf文件的一键式转换.有了它,你可以很轻松转换 ...
- (分享)多功能 PDF转换器v3.0版本
转换的效果非常不错,值得使用.破解成功的截图:这个程序必须随便输入注册码注册,不然会有水印的. 这是程序主界面了 正在测试pdf转word过程,转换结果个人感觉非常不错,跟原版pdf的格式非常接近,个 ...
- .NET破解之PDF编辑器
本教程只能用于学习研究,不可进行任何商业用途.如有使用,请购买正版,尊重他人劳动成果和知识产权! 第一效果团队(1XG Team)组建于2004年,并长期致力于WINDOWS平台应用软件开发,产品主要 ...
- Windows:打印为PDF(PDF转换器)
造冰箱的大熊猫@cnblogs 2019/4/17 文中图片可通过点击鼠标右键查看大图 Windows下实现PDF打印的几个办法: 1.Foxit Reader(福昕PDF浏览器) 安装Foxit R ...
- 利用ARCHPR明文破解获取PDF
我们经常下载一些rar或zip压缩文件,解压时有时发现要密码,而密码多是为了推广而设置的网址等,如果不知道密码,可 以去来源网站上寻找或在压缩文件的注释中查看. 而并非所有都是如此,例如,网上有些人, ...
- 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
随机推荐
- centos卸载mysql
1.查看系统安装mysql rpm -qa|grep -i mysql 2.卸载 rpm -ev --nodeps mysql-community-release-el7-5.noarch 3.查询剩 ...
- CF786B Legacy
思路 线段树优化建图 基本思想就是要把一个区间连边拆成log个节点连边, 然后一颗入线段树,一颗出线段树,出线段树都由子节点向父节点连边(可以从子区间出发),入线段树从父节点向子节点连边(可以到达子区 ...
- setTimeout setInterval 计时器
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 返回值:返回一个 ID(数字),可以将这个ID传递给 clearTimeout() 来取消执行. 案例: 点击按钮开始,停止时 ...
- 20175317 《Java程序设计》第六周学习总结
20175317 <Java程序设计>第六周学习总结 教材学习内容总结 第六周我学习了教材第七章与第十章的内容,了解了内部类.异常类与输入输出流的知识,学到了以下内容: 什么是内部类 如何 ...
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!
Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...
- Ctrl+Alt+Down/Up 按键冲突
I mapped Ctrl-Alt-Up/Down to open web-browser and email client but it didn't take effect. Ctrl-Alt-U ...
- hbase之认识
进入HBase客户端命令操作界面 $ bin/hbase shell 查看帮助命令 hbase(main):001:0> help 查看当前数据库中有哪些表 h ...
- Python生产者producer和consumer消费者案例写法,含有多线程,包含队列queue、JoinableQueue队列的用法
import timeimport random import queuefrom multiprocessing import Process,Queue 案例一:def consumer(q,na ...
- python webdriver api-对启动的火狐浏览器添加配置
Webdriver启用的火狐不带插件,可以自已进行配置 先找到火狐的安装路径 C:\Program Files\Mozilla Firefox 步骤说明 在CMD中使用cd命令进入firefox.ex ...
- jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别
基础概念 jdbc(Java DataBase Connectivity)是java连接数据库操作的原生接口.JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型.作为A ...