吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 68587|回复: 209
收起左侧

[原创] 通达OA2017 10.12.180305版(目前最新)破解方法初探

    [复制链接]
willydong 发表于 2018-4-10 12:02
本帖最后由 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文件来完成,尤其是其中的核心注册信息函数:
[Asm] 纯文本查看 复制代码
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
其中的数字就代表了不同的权限限制,如果没注册,数值比较小,那么,我们直接将其赋值为需要的值返回即可。
[Asm] 纯文本查看 复制代码
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[0], $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步新增的区段地址。

4、生成新的文件,利用小程序检测注册信息反馈情况,完美,具体如下图。
5、检查软件注册情况,完美:

注意,这个破解只修改了OfficeTask.exe文件来绕过加密狗,然后通过注册机生成的注册文件来注册,不需要修改任何的php代码(上面修改php是因为那时还没来52不会用od,呵呵),与网上售卖的破解版本有本质区别!
总结通达的注册过程大致如下:
Map2.png
所以,破解版总共就
改了2个文件:OfficeTask.exe(服务)和tech.dat(公钥);
增加了2个文件:tdkey.dat(密文)和2.php(修改公司名等字段)。

见:通达OA2017 10.12.180305(目前最新)破解版 - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn  https://www.52pojie.cn/thread-724979-1-1.html
6、发帖,吃水不忘挖井人,感谢52。

特别说明:这里的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、其实,如果真正看懂了我上面的方法并进行了实践,相信大家拿到人家的缓存锁文件后就会触类旁通,当然,有兴趣的也可以和我私下交流技术。再次申明,本人不靠这破解收一分钱,纯学习探讨而已。

免费评分

参与人数 52威望 +1 吾爱币 +64 热心值 +49 收起 理由
laohucai + 1 + 1 谢谢@Thanks!
放下 + 1 感谢分享
soxo + 1 + 1 谢谢@Thanks!
独来读网 + 1 + 1 谢谢@Thanks!
hurrylai + 1 + 1 我很赞同!
xiajing10000 + 1 + 1 我很赞同!
jojo198365 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
andyzgs + 1 + 1 鼓励转贴优秀软件安全工具和文档!
airwu + 1 + 1 谢谢@Thanks!
happynocn + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yuhuibar + 1 + 1 用心讨论,共获提升!
神奇的网站 + 1 用心讨论,共获提升!
zlgc01 + 1 + 1 我很赞同!
mrhs + 2 + 1 用心讨论,共获提升!
吖骢 + 1 + 1 发成品出来研究一下!
kinwarm123 + 1 + 1 热心回复!
qqwwerty12 + 1 + 1 热心回复!
陪你到以后、 + 1 + 1 谢谢@Thanks!
a5606495 + 1 + 1 谢谢@Thanks!
WLYZ + 1 + 1 路过加分
一叶微风 + 1 + 1 谢谢@Thanks!
gjianbo + 1 + 1 谢谢@Thanks!
别了丶 + 1 + 1 热心回复!
晚安说给自己听 + 2 + 1 厉害了,至少这种钻研精神值得我们去学习
lopes1975 + 1 + 1 谢谢@Thanks!
paxj168 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
reetin + 1 + 1 谢谢@Thanks!
mogoyu + 1 + 1 赚翻了,一大早捡了10几万&amp;amp;#128578;
李小木 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zeknight + 1 + 1 鼓励转贴优秀软件安全工具和文档!
fr33m4n + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
120529659 + 2 + 1 谢谢@Thanks!
baolinguo + 1 + 1 我很赞同!
江风山月 + 1 + 1 我很赞同!
qqqzse + 1 + 1 我很赞同!
rox + 1 + 1 我很赞同!
微笑着走过 -1 请问174楼在那里?
动物凶猛 + 2 + 1 谢谢了
youyudewo99 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
vince991 + 1 + 1 用心讨论,共获提升!
shaunkelly + 1 + 1 厉害了我的哥
kilkilo502 + 1 + 1 我很赞同!
zhristtt + 1 + 1 用心讨论,共获提升!
xinkui + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhaojunkai + 1 + 1 先膜拜一番,然后继续默默学习,,,,
Ctrui + 2 + 1 谢谢@Thanks!
tianyou + 1 + 1 热心回复!
rent8158669 + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhangxhc + 1 + 1 请问174楼在那里?
maloneshaw + 1 + 1 谢谢@Thanks!
redapple2015 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cwb6357123 发表于 2019-11-23 13:02
cwb6357123 发表于 2019-11-22 19:20
td_authcode算法解不出来,求大牛指点一下!@willydong @iori97 @andyzgs

找到一篇文章,https://blog.csdn.net/xiaofei0859/article/details/50828166 讲的就是这个
 楼主| willydong 发表于 2018-4-11 09:46
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
qq6227575 发表于 2018-4-10 15:50
tfjzfoy 发表于 2018-4-10 15:59
谢谢分享,学习了。
2205 发表于 2018-4-10 16:24
又要懂PHP,又要懂加密算法,还要懂VC,还要懂汇编。还要会OD。难度几颗星???服
mynameislyy 发表于 2018-4-10 16:46
哪里来的174楼?  差评
speedsnail 发表于 2018-4-10 16:50
大神,174楼呢
葫芦小金刚 发表于 2018-4-10 16:55
发个成品出来啊
Hmily 发表于 2018-4-10 18:02
@willydong 成品可以单独发到原创区。
chenyw 发表于 2018-4-10 18:02
很牛B,为你点赞.
Griz2ly 发表于 2018-4-10 18:07
看来现在搞安全需要Web、逆向、密码学都要会了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-28 17:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表