TA的每日心情 | 擦汗 2020-4-5 13:10 |
---|
签到天数: 1112 天 [LV.10]以坛为家III
|
本帖最后由 ph1378 于 2014-7-31 14:24 编辑
lgd(花忆容作品)通达OA破解教程 (送给OA爱好者) *********
破解前期工作:
1、官方网站下载通达安装程序并安装;
2、复制webroot至其他位置;
3、使用黑刀dezender反编复制到其他位置的webroot目录;
破解:
1、登入oa系统,进入注册页面,查看注册页面的源文件提交信息的文件为inc/reg_submit.php。
2、查看反编后的reg_submit.php文件内容。
reg_submit.php内容分析:
if ( $ATTACHMENT_NAME != "tdkey5.dat" )
{
message( _( "注册失败" ), _( "注册文件名错误" ), "error", $BUTTON_BACK );;
exit( );
}
要求上传的注册文件名必须是tdkey5.dat,就是要求制作注册时,生成的注册文件最好是tdkey5.dat,不使用的话,后面也要手动改为tdkey5.dat。(2013adv版为tdkey7.dat)
$RESULT = get_reg_info( $REGISTER_CODE, $REG_INFO );
if ( $RESULT !== TRUE )
{
message( _( "注册失败" ), $RESULT, "error", $BUTTON_BACK );
exit( );
}
关键所在,从授权文件中验证注册信息,不为true则注册文件错误。那这个函数的内容在哪呢?我们看到这个文件就只包含了一个文件
include_once( "inc/td_core.php" );
我们要从 "inc/td_core.php" 文件中查看以上函数体的具体内容。
td_core.php中get_reg_info()函数的内容为:
function get_reg_info( $REG_CODE, &$REG_INFO )
{
global $ROOT_PATH;
if ( strlen( $REG_CODE ) != 256 )
{
return _( "注册文件无效" );
}
$DAT = @file_get_contents( $ROOT_PATH."inc/tech.dat" );
if ( $DAT === FALSE )
{
return _( "读取数据文件错误" );
}
$DAT = td_authcode( $DAT, "DECODE", "b173b62a58d93b332c36116ff7df9d2b" );
if ( strlen( $DAT ) < 3000 )
{
return _( "数据文件无效" );
}
if ( !function_exists( "openssl_pkey_get_public" ) )
{
return _( "请联系管理员安装openssl扩展库" );
}
$KEY = openssl_pkey_get_public( $DAT );
if ( $KEY === FALSE )
{
return _( "解析数据文件失败" );
}
$REG_CODE = pack( "H*", $REG_CODE );
$RESULT = openssl_public_decrypt( $REG_CODE, $REG_INFO, $KEY );
if ( $RESULT === FALSE )
{
return _( "注册文件无效,请重新获取注册文件" );
}
return TRUE;)
}
我们来看这个函数,主要使用的是php的系统函数openssl函数,这些函数包含在php的扩展中,要在php.ini设置打开,相关内容,
请自行参考php支持openssl的相关资料。
$DAT = td_authcode( $DAT, "DECODE", "b173b62a58d93b332c36116ff7df9d2b" );
这个语句实际是将"inc/tech.dat" 的内容解码后报存在$DAT(注意php是大小写敏感的)中,大家可以用echo语句输出变量的内容!
查看一下文件的真实内容,我们看到这个文件实际就是一个cer证书,加密方式是rsa,我们在往下看;
$KEY = openssl_pkey_get_public( $DAT );
这个是从上面的证书中获取rsa公钥的内容"
$REG_CODE = pack( "H*", $REG_CODE );
$RESULT = openssl_public_decrypt( $REG_CODE, $REG_INFO, $KEY );
这两句,上面那句是对$REG_CODE 的内容做个转换包装一下,相应的反包装函数是unpack,具体用法请参考相关函数说明;
下面这句是用$key解密$REG_CODE,解密后的内容存放在$REG_INFO中,函数参考php手册,就是进行rsa解码。
至此我们可以看出2011版的2010版的注册文件加密实际变化不大,2010版是直接用自己写的rsa函数进行,rsa加、解密,2011、2013版是用的openssl扩展中的函数进行rsa加、解密。)
那么下一步我们只要能够造个注册文件能够进行rsa解码就可以了,当然解码后的内容也有要求,我们在下一讲中继续。
现在我们有两个思路:
1.修改td_core.php文件中的get_reg_info()函数体的内容,直接按要求返回需要的结果。
2.不修改td_core.php文件中的内容,使用官方原文件,那我们就根据get_reg_info()函数的内容造注册机来达到通过注册的目的。自120416后的破解采用的是第一种方案,其他人的破解也基本是采用这一方案;从2010版起的原破解采取是第二种方案。
优缺点:
第一种方案:这种方法基本是在dezend文件的基础上进行的,修改td_core.php具有很强的灵活性,破解也相对简单,但Dezend的文件不是完全正确,需要人工修改,这样就需要对td_core.php的代码进行检查,同时也要进行大量的测试,后期工作量大,bug的几率也大。
第二种方案:这种方法不改变原系统代码,具有良好的系统稳定性,保持了原汁原味,bug基本都是官方存在的,后期测试量小,但需要投入大量精力编写相应的注册机,系统注册算法改变后还要重新进行编写,前期的工作量比较大。
所有具体哪种方法好,就看各人的看法了。
**********
2013ADV(0416版)
TD_core.php下内容:
function get_reg_info( $REG_CODE, &$REG_INFO )
{
if ( strlen( $REG_CODE ) == 256 )
{
$KEY_FILE = MYOA_ROOT_PATH."inc/tech.dat";
}
else if ( strlen( $REG_CODE ) == 300 && stristr( PHP_OS, "Linux" ) )
{
$KEY_FILE = MYOA_ROOT_PATH."inc/tech_box.dat";
}
else
{
return _( "注册文件无效" );
}
$KEY = "";
$RESULT = tdrsa_get_public_key_from_file( $KEY_FILE, "c8fc2dbb8b55442c0a18a8cb495fd338", $KEY );
if ( $RESULT !== TRUE || !is_resource( $KEY ) )
{
return $RESULT;
}
$REG_CODE = pack( "H*", substr( $REG_CODE, 0, 256 ) );
$RESULT = tdrsa_public_decrypt( $REG_CODE, $REG_INFO, $KEY );
if ( $RESULT !== TRUE || $REG_INFO == "" )
{
return _( "注册文件无效,请重新获取注册文件" );
}
return TRUE;
}
****7.21.140627
function get_reg_info( $REG_CODE, &$REG_INFO )
{
if ( strlen( $REG_CODE ) == 256 )
{
$KEY_FILE = MYOA_ROOT_PATH."inc/tech.dat";
}
else if ( strlen( $REG_CODE ) == 300 && stristr( PHP_OS, "Linux" ) )
{
$KEY_FILE = MYOA_ROOT_PATH."inc/tech_box.dat";
}
else
{
return _( "注册文件无效" );
}
$KEY = "";
$RESULT = tdrsa_get_public_key_from_file( $KEY_FILE, "c8fc2dbb8b55442c0a18a8cb495fd338", $KEY );
if ( $RESULT !== TRUE || !is_resource( $KEY ) )
{
return $RESULT;
}
$REG_CODE = pack( "H*", substr( $REG_CODE, 0, 256 ) );
$RESULT = tdrsa_public_decrypt( $REG_CODE, $REG_INFO, $KEY );
if ( $RESULT !== TRUE || $REG_INFO == "" )
{
return _( "注册文件无效,请重新获取注册文件" );
}
return TRUE;
}
|
|