通达OA2017 10.12.180305版(目前最新)破解方法初探
本帖最后由 willydong 于 2018-10-20 22:55 编辑0x00 通达OA简介
详见 http://www.tongda2000.com/oa/MYOA2017/
此处不再赘述
该OA在国内算得上最主流的OA平台之一,在淘宝到处有破解版本售卖,但总觉得破解得不够彻底、修改得乱七八糟,或者说大多拼凑起来的,修改的文件也与最新版不够匹配。所以,自己动手,丰衣足食。
此文主要讲思想,具体细节可能有省略,毕竟要对新手(当然,我自己也是新手)全部说明白估计一天的直播也讲不完。
整个过程涉及的技术主要有:
1、php文件解密
2、php中公用的rsa算法及其应用
3、php中pack、json_encode、base64_encode、json等方法的正、反向处理
4、基于PHP的mysql数据库操作、文件操作,navicat软件使用
5、openssl软件在公钥、私钥生成中的应用
6、od、Stud_PE的使用
7、VC编程基础知识
……等等
0x01 第一部分,主要集中在php文件的破解
1、php文件解密。通达OA属于一款windows服务+php文件配合的OA系统,首先查看其php文件,发现为标准zend加密,所以,用SeayDzend或DeZend_Tool解密之。
2、找到注册文件,分析核心思想。走读代码,发现所有的验证都通过inc/td_core.php文件来完成,尤其是其中的核心注册信息函数:
function get_reg_info($REG_CODE, &$REG_INFO)
{
if (256 <= strlen($REG_CODE)) {
$KEY_FILE = MYOA_ROOT_PATH . "inc/tech.dat";
}
else {
return _("注册文件无效");
}
$KEY = "";
$RESULT = tdrsa_get_public_key_from_file($KEY_FILE, "e7309293ede93aa43d23d93f6b6df350", $KEY);
if (($RESULT !== true) || !is_resource($KEY)) {
return $RESULT;
}
$REG_CODE = pack("H*", $REG_CODE);
$RESULT = tdrsa_public_decrypt($REG_CODE, $REG_INFO, $KEY);
if (($RESULT !== true) || ($REG_INFO == "")) {
return _("注册文件无效,请重新获取注册文件");
}
return true;
}
从代码不难发现,系统要从inc/tech.dat文件中读取内容,然后利用tdrsa_get_public_key_from_file函数将其还原为$KEY。
$KEY是什么呢?走读tdrsa_get_public_key_from_file发现,$KEY是一个RSA验证过程的“公钥”。
接下来的过程就比较好猜了,利用公钥,解析$REG_CODE这个加密文本,解密得到注册信息文本$REG_INFO。
接下来,可以从2个方面来进行破解。
3、破解方法一,直接改写get_reg_info函数,无论加密文本和公钥是什么都不管,直接返回需要的注册字符串。
在php中return true;之前增加echo语句,打印$REG_INFO的内容,发现其格式大致为:
北京NB总公司*TD20G-20180305-9999**0*0*999*123456789abcdefghijk*999*999*B44F9FFA72*999*999*999*999*999*999*999*999*999
其中的数字就代表了不同的权限限制,如果没注册,数值比较小,那么,我们直接将其赋值为需要的值返回即可。
function get_reg_info($REG_CODE, &$REG_INFO)
{
$REG_INFO="北京NB总公司*TD20G-20180305-9999**0*0*999*123456789abcdefghijk*999*999*B44F9FFA72*999*999*999*999*999*999*999*999*999";
return true;
}
4、破解方法二,考虑到破解php文件后难免会存在对某些代码的破坏,所以最安全的方法还是研究注册码,从公钥和$REG_CODE这个加密文本的角度入手。
跑了一圈发现系统注册思路为:
a)从注册文件tech.dat获取“公钥”加密串,用tdrsa_get_public_key_from_file函数将其解密为rsa算法可识别的公钥。
b) 从数据库version表“CODE”字段获取upnack后的权限字符串,用pack算法将其还原。
c) 在tdrsa_public_decrypt函数中,用openssl_public_decrypt算法,利用a步获得的公钥解密b步获得的权限字符串,得到形如"***0*0*999*123456789abcdefghijk*999*999*999*0*999*999*999*999*999*999*999"的明文权限串。
所以,如果不修改代码,就需要做一个注册机,来生成满足要求的权限字符串。
但是我们没有私钥(关于私钥和公钥,请自学RSA加解密算法),怎么办?
只好曲线救国,自制私钥和公钥,开始。
a)下一个openssl软件(请自学参数设置过程),得到一组公钥和私钥。
b)利用公钥和php自带的openssl_public_encrypt算法,将我们需要的明文权限串进行加密,相当于逆向上面的c步。
c)将加密后的字串利用unpack算法进一步处理,将其结果拷贝到数据库version表“CODE”字段,相当于逆向上面的b步。
d)分析tdrsa_get_public_key_from_file算法,用php写一个逆向算法,命名为tdrsa_set_public_key_to_file,将a步得到的私钥进行加密处理,将结果存储为tech.dat,相当于逆向上面的b步。
上述步骤涉及到许多参数和细节,估计够写几个版面的了,此处不再赘述,有兴趣的再详细交流。
OK,基本上不影响使用了,对于新安装的最新版通达OA(目前为20180305版本),使用方法如下:
1、防止注册码验证不通过:将tech.dat文件复制到inc文件夹下,里面包含了公钥信息。
2、防止注册文件信息与数据库中信息不一致:将version表中的SN字段改写为:TD20G-20180305-9999;将unit表中的UNIT_NAME字段改写为:北京NB总公司
3、取消itask验证:修改inc/reg_submit.php文件,注释掉itask返回的验证(第140/141行)
//message_reg("", _("注册失败"), $result, $BUTTON_BACK);
//exit();
4、将c步得到的加密字串存入文件tdkey10.dat,在软件注册页面导入注册文件tdkey10.dat,正常注册通过。
到这里,实现的效果为:
a.软件名称会显示为集团版,
b.软件注册会显示为已注册,
c.已注册可选组件会显示所有组件。
但其余的还是和未注册的显示一样,主要原因是“系统信息”页面中的信息除了上面abc3项外,其余的来自OfficeTask服务的端口返回值(之前还不会破解exe文件),但目前经测试发现已经不影响使用了。
5、为了更加美观,直接修改general/system/reg_view/index.php,只需要在$REG_ARRAY = explode("*", $REG_INFO);(第161行)前加一句:
$REG_INFO ="北京NB总公司*TD20G-20180305-9999**0*0*999*123456789abcdefghijk*999*999*B44F9FFA72*999*999*999*999*999*999*999*999*999";
这主要是替换掉OfficeTask服务的返回值为我们需要的值。
6、为了修改移动Office编辑点数限制的显示,在sys_para表中找到PARA_NAME为NTKO_ACTIVITION_CODE的字段,将其PARA_VALUE修改为:W3siQU5EUk9JRF9DT1VOVCI6OTk5OSwiSU9TX0NPVU5UIjo5OTk5LCJFWFBJUkVEX0RBVEUiOiIwMDAwLTAwLTAwIn1d
这一个加密串的由来?分析注册信息显示页面对应的index.php,发现移动Office编辑点数限制信息来自于NTKO_ACTIVITION_CODE字段,对其进行了base64_decode和json_decode解密,那么反过来,我们将需要的字符串”Android:9999,iOS:9999 (永久)“先后进行json_encode和base64_encode即可得到,这里也不赘述了。
OK,大功告成。
总结一下:
1、如果不需要体验注册过程,第3、4步可以不做,直接将tdkey10.dat中的注册信息复制到version表中的CODE字段即可。
2、对系统文件只修改了用于显示系统信息的1个php文件,如果不介意显示问题,甚至可以不修改。
但是,但是,不会破解exe文件的话,始终算不上完美?!!!!!
但苦于不会exe文件破解,卡住了。
0x02 第二部分,主要是在52pojie的帮助下破解exe服务程序(因为不熟悉,这部分之前走了很多弯路,最后简化如下,原来思路正确才是最关键的)
1、利用OD加载OfficeTask.exe,搜索,找到核心注册字符串,形如%s*%s*%d....的格式化字符串,有过VC编程经验的话,不难猜测系统会通过该串利用strformat函数来生成注册字符串,有2个办法进行处理,一是修改每一个参数的值为需要的值,但是总共19个参数,比较麻烦,之前长时间卡在这里了。第二个办法,不管参数是什么,直接改写”格式化字符串“,令其不匹配参数,直接写成需要的权限字符串。
2、新增区段(这一步要感谢52pojie入门教程第三课中关于“弹窗”方法给我的启发),直接利用ascII码写入字符串,其目的是无论什么情况下,都返回最大注册权限的字符串,形如"北京NB总公司*TD20G-20180305-9999**0*0*999*123456789abcdefghijk*999*999*B44F9FFA72*999*999*999*999*999*999*999*999*999"
3、将push格式化字符串的位置,修改为push第2步新增的区段地址。
http://bbs.sunwy.org/data/attachment/forum/201804/09/180326wtzcojtcmfhohj77.png
4、生成新的文件,利用小程序检测注册信息反馈情况,完美,具体如下图。
5、检查软件注册情况,完美:
http://bbs.sunwy.org/data/attachment/forum/201803/27/001404ob99uhm77vmw7vtl.png
注意,这个破解只修改了OfficeTask.exe文件来绕过加密狗,然后通过注册机生成的注册文件来注册,不需要修改任何的php代码(上面修改php是因为那时还没来52不会用od,呵呵),与网上售卖的破解版本有本质区别!
总结通达的注册过程大致如下:
所以,破解版总共就
改了2个文件:OfficeTask.exe(服务)和tech.dat(公钥);
增加了2个文件:tdkey.dat(密文)和2.php(修改公司名等字段)。
见:通达OA2017 10.12.180305(目前最新)破解版 - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cnhttps://www.52pojie.cn/thread-724979-1-1.html
6、发帖,吃水不忘挖井人,感谢52。
https://attach.52pojie.cn/forum/201804/09/195216ympxbhq4pp1ppzb6.png
特别说明:这里的174楼是我在其他地方的帖子,发的早一些所以楼层高一点。关于作品,里面有半成品,最终版考虑版权问题没有放上去,毕竟人家10几大万的产品:)
需要说明的是,因为是注册机,而且是修改exe文件模拟usb狗来强制修改授权,按照系统的设计思想,单位名是绑定的(北京NB总公司,当然可以通过上面步骤修改为任何单位名。想要不绑定也可以,修改php,之前的半成品就是那样来的),其他都完美注册。想拿去测试的也行,等我再测试一下。
上面用od的过程其实还遗漏了一点,那就是绕过usb key的检测,就一个jmp而已,大家有兴趣可以自己琢磨。
【大侠们留步指教】
1、OfficeTask.exe本来是加载为服务在运行的。而在od分析OfficeTask.exe这个文件的时候,每次使用F9都会启动一些线程然后程序就退出了,所以我只能修改一点,就重启服务看一看效果,以致于无法进行过程跟踪,有什么办法?
2、对OfficeTask.exe目前采用的暴力方法,现在能用,但是暂时还不知道有没有绕不过的坎。从分析来看,软件可以接受授权文件和加密狗两种方式注册(如果有谁买过的可以分享一下经验),不知道有没有办法追踪到其注册逻辑或者方法?进一步实现完美破解?
以上疑问,大侠们不吝赐教。谢谢!
2018-10-20补充:
1、结合前期的学习和摸索,参考了其他人发布的“缓存锁RockeyCache.dat+注册文件tdkey10.dat+公钥tech.dat”的三板斧破解大法,彻底搞定了零修改破解通达OA2017全系列,个人认为是除了虚拟狗外目前最佳的破解方式。
2、但受人之托,就不再把此次破解方法公布出来了,免得断了前期辛苦努力的破解工作者的财路。
3、其实,如果真正看懂了我上面的方法并进行了实践,相信大家拿到人家的缓存锁文件后就会触类旁通,当然,有兴趣的也可以和我私下交流技术。再次申明,本人不靠这破解收一分钱,纯学习探讨而已。 cwb6357123 发表于 2019-11-22 19:20
td_authcode算法解不出来,求大牛指点一下!@willydong @iori97 @andyzgs
找到一篇文章,https://blog.csdn.net/xiaofei0859/article/details/50828166 讲的就是这个 linfengtai2008 发表于 2018-4-10 19:40
大佬,通达的OA用户名密码加密规则是什么,能反编译吗
确切的说,不行,只能单向。
php中常用的密码处理方法为crypt()
比如,通达的密码在存储前会作如下处理:
$PASS1 = crypt($PASS1);
检查密码是否正确时会作如下处理:
if (crypt($PASS0, $PASSWORD) != $PASSWORD) {
Message(_("错误"), _("输入的原密码错误!"));
所以,你懂的。
具体可以参考下文:
https://www.2cto.com/shouce/w3school/php/func_string_crypt.asp.html 这才是高手,大神,喜欢。。 谢谢分享,学习了。 又要懂PHP,又要懂加密算法,还要懂VC,还要懂汇编。还要会OD。难度几颗星???服 哪里来的174楼?差评 大神,174楼呢 发个成品出来啊 @willydong 成品可以单独发到原创区。 很牛B,为你点赞. 看来现在搞安全需要Web、逆向、密码学都要会了