发布于:2017-8-4 14:09 | 107270次阅读 作者: 管理员 | 原作者: 鲜槟丞 | 来自: 原创
感谢android组鲜槟丞提供的答题过程 拿到apk,拆包,先把调试打开再说: android:debuggable="true" 然后拖进jeb,java层的逻辑并不复杂,主要是native。 首先是CRegCheck::is_user_name_legal()这个函数,传入的是key,看名字就知道是判断输入的key是否合法的函数。 这个地方经过调试发现是判断key的长度 这个地方经过调试发现是判断由'-'分割后是否有8组CRegCheck::is_num_or_letter是判断字符是否为数字或者在'a'-'f'之间函数,所以写注册机的时候为了满足这一点直接用了md5 出来之后继续分析CRegCheck::get_formula_param函数这个函数是将分割的key通过某种运算生成一个数字。这里可以直接静态分析出运算方法。 rsa 这一部分比较复杂 程序首先把key作为参数传入了get_rsa_key_seed来生成随机数种子 具体就是把key按'-'分割后第一组和第五组运算,第二组和第六组运算,具体的算法静态就可以分析出来。 然后程序用这个种子初始化了一个RSA类。 获取质数的方式比较暴力,依照特定的算法每次从种子生成一个数模10作为位数, 还有就是这个地方,随便跟一个计算的函数可以发现第100位标识了这个大数有几个有效位。 获取完质数之后,就是rsa通常的计算N, e, r, d等数字,比较容易看出来。 之后程序把code传进了CBase64::base64_decode进行解码,跟进去之后发现就是一个魔改的base64算法,只不过索引方法和索引表变了而已。 解码之后,通过调试可以知道,解码之后的第一位标识了输入大数的符号,第二位和第三位联合一起表示大数的位数,然后从这个字符串获取对应的位数。重复这个过程直到遍历完整个序列。生成的大数应该是用链表储存的。 之后对大数进行加密,求出rsa的相关参数之后就比较好逆了。 最后是主要的验证函数is_tangent 这里用arm的lib跟进去发现都是__int64的数据在做运算,在32位的lib中特别难逆,思考了很久,最后突然想到在x64下会不会简单一点,打开之后果然让我很舒服: 这里可以很容易的发现是一个一元二次方程,其中 ax^2 + bx + c = 0 a = xu1 b = (xu2 - b1) c = (xu3 - b2) 第二个等式直接可以推出方程只有一解: xu4 = (b1 - xu2)/2xu1 之后就可以推导出b1 , b2关于xu 1-4的方程。 最后是用py3写的注册机 运行方法 : python3 main.py 程序运行结果: please input your name : name key : b068‐931c‐c450‐442b‐63f5‐b3d2‐76ea‐4297 code : OONPOO0vPiKNO24yWOBoWOiYP2g#O4OWOONOW4BOOOBOP4NWOOgPOiiyW4OyO2GOOiYvO2YWPOBNP4ioP4GoO4OyP4NWOOKOOi O#O40yO2KoO2gOP4iYW4gNPiGPWOOWO4BnP4KOW4ONWOgWO4gyWOK#O4gPPOOWO4BnO2B#W4OPP2K#Oi0yW4NPO4YOO2OOO4OO OOYOOONPWONOP2gWW4ioO2OnW4gOWOOPWOGvOONOO20yP2NNP24OOi0PO4N#OONvP4YOOiY#OO0vO4BYPiNnOiB#O4iPOiNWO2 4OOiYoO4BNPiYNWO0NOiGYO2iNPONyP2YOOiYYP4gOP24WO2NnP24WOiiyP4KyO2YOOiYYOOBoWONWO24oWO0#Pi0#OOKvOiNO OiOWPiiNOiiOO2YnOOgWW4YyW40#OiOWO4OWP2iNW44#P4BYO2BnO24WPO4PP4== 运行成功截图: |
最新评论
发表评论