吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|moregolds.com

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 5852|回复: 145
上一主题 下一主题

[Android 原创] 2020年春节红包第四题wp

    [复制链接]
跳转到指定楼层
楼主
梦游枪手 发表于 2020-2-10 03:03 回帖奖励
本帖最后由 梦游枪手 于 2020-2-10 14:50 编辑

准备工具

IDA Pro,GDA,能真机调试的Android机一台

GDA分析

先把apk拉到GDA,找到MainActivity的onClick方法。


主要逻辑代码在so文件里面。

IDA分析调试

直接把libxtian.so丢到IDA分析,但没找到checkSn函数,说明函数是动态注册的。海南11选5_[官网首页]so有混淆,无法静态分析,只能真机调试了,真机调试的步骤网上有很多,这里就略过了。
动态注册Native的函数为RegisterNatives,启动调试,IDA停在JNI_OnLoad函数后,转到 _ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi,下断后运行。


跟随R2寄存器,就能找到checkSn函数的地址了。

重命名为checkSn并下断,在真机那边输入uid和假码,点验证,IDA停在checkSn函数上,说明就是这里了。
现在面对最大的一个问题:混淆。

看起来是一个自写的类似OLLVM的控制流混淆。因为流程混淆有直接操作PC寄存器的代码,所以IDA的F5报废,字符串也都是运行时才会解密,无法下手。

海南11选5_[官网首页]楼主不会去混淆,而且为了这个红包题专门去分析混淆手段也太累了,就想顶着混淆解决。
这时候就可以用IDA的trace功能,用它抓取程序执行过的所有指令,不过这个红包题可以不用抓所有指令,可以使用function tracing,只抓取函数调用。

但不知为何,trace会跑飞,抓取不到所有的函数调用,所以我只好弄了个IDC脚本来单步。

static main(void)
{
    do
    {
        step_over();
        wait_for_next_event(STEP,-1);
    }while(PC!=0xEEDAFC2C);//停在何处
}

注意要设置脚本停止在checkSn函数返回处,设置断点防止跑飞。


IDA停在checkSn后,打开function tracing,跑一次脚本,等停在checkSnretn,按esc后退,找到跑飞处,在下面那句代码下断。清除trace记录后,在checkSn函数头再跑一次。

分析checkSn的函数调用

抓到函数调用后,关闭function tracing,在抓取到的指令上下断,跟踪分析,由于我已经分析过一次了,所以指令上面有注释。


在最后一条BLX上,也就是getpwdlen上下断,停下后步入,注意观察。

R6寄存器存放着GetStringUTFLength函数的地址,说明这里确实是取字符串长度的,至于是uid还pwd用排除法即可。
走出API调用后,回到checkSn继续往下跟,可以找到检查pwd的长度的代码。

pwd长度不足15,所以直接返回了,我们修改下假码,继续抓取海南11选5_[官网首页]鸶龇治黾纯伞

现在看图里的trace也能知道大致流程了,checkSn获取输入的uid和pwd,调用check函数,判断是否pwd符合uid。修改check函数的返回值为1并运行,Toast显示成功,说明正确。
海南11选5_[官网首页]现在把分析目标转到check函数,check函数内也有混淆,修改上面的脚本为PC!=0xEEDAF362并下断,并使用上面的步骤抓取所有函数调用。

分析check函数

我的IDA在check函数无法使用function tracing,app会崩溃,原因未知,所以我只能改成instruction tracing了。抓取的指令太多就不展示出来了,我会放在附件里。
这里说下check函数的分析思路和主要流程。
在trace文件里找出所有BLX,下断步入,如果是调用API,则跟踪出API名,如果是调用so本身的函数,那就直接在LR的地址下断运行。不要忘记记录参数和返回值。
如果对每个调用的内部函数都trace一遍,读代码,我觉得要花太多时间,所以记录参数和返回值,凭经验直接猜算法,如果猜不到再trace指令。
check函数首先调用gettimeofday,然后将timeval除以1800000,也就是30分钟。


然后将uid和结果拼接在一起,算出一个32字节的hash,存放在栈顶地址处。

这个hash算法我没能还原出来,本来以为是sm3,但是验算了几次都不对,跟也跟不出个头绪,就直接过了,还好不影响解出题目。
之后取出hash的17-20位。

与uid拼接到一起,等待最后比较。

接着对pwd进行base64解码,码表是修改过的,图里写的sm3就是上面的hash,忘了改注释。

解码后,再进行RC4解密,key为52pojie2020xtian

逐位异或0x20。


最后与uid+hash比较。

check函数的流程就走完了。

编写注册机

没还原出hash算法,所以不能写出注册机,因为pwd时效只有30分钟。
只能在JNI_OnLoad+43B2处复制对应当前时间的结果,再加密。附python代码一份

import hashlib
from Crypto.Cipher import ARC4
b64table = 'AzSxleoQp02MtvisIZUF8ThRaEL9Nd57qG6DfOkW4JHXmYjwV1Pn3uycrCgbKB-_='
decryptkey = '52pojie2020xtian'

def RC4(data, key):
    rc41 = ARC4.new(key)
    encrypted = rc41.encrypt(data)
    return encrypted

def b64encode(s):
    res = []
    leftover = len(s) % 3
    for i in range(0, len(s) - leftover, 3):
        c2 = ord(s[i])
        c1 = ord(s[i + 1])
        c0 = ord(s[i + 2])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
        res.append(b64table[((c1 & 0x0f) << 2) | ((c0 >> 6) & 0x03)])
        res.append(b64table[c0 & 0x3f])
    i += 3
    if leftover == 1:
        c2 = ord(s[i])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[(c2 & 0x3) << 4])
        res.append(b64table[-1])
        res.append(b64table[-1])
    elif leftover == 2:
        c2 = ord(s[i])
        c1 = ord(s[i + 1])
        res.append(b64table[(c2 >> 2) & 0x3f])
        res.append(b64table[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
        res.append(b64table[(c1 & 0x0f) << 2])
        res.append(b64table[-1])
    return ''.join(res)

def b64decode(s):
    res = []
    end = len(s)
    if s[-1] == b64table[-1]:
        end -= 4
    for i in range(0, end, 4):
        c3, c2, c1, c0 = b64table.index(s[i]), b64table.index(
            s[i + 1]), b64table.index(s[i + 2]), b64table.index(s[i + 3])
        res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
        res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
        res.append(chr(((c1 & 0x03) << 6) | (c0 & 0x03f)))
    if end < len(s):
        if s[-2] == b64table[-1]:
            c3, c2 = b64table.index(s[end]), b64table.index(s[end + 1])
            res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
        else:
            c3, c2, c1 = b64table.index(s[end]), b64table.index(s[end + 1]), b64table.index(s[end + 2])
            res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
            res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
    return ''.join(res)

def wuaiencrypt(message):
    r = ''
    for i in list(message):
        r += chr(ord(i) ^ 0x20)
    r = RC4(r, decryptkey)
    return b64encode(r)

def wuaidecrypt(message):
    c = list(b64decode(message))
    c = list(RC4(b''.join(c), decryptkey))
    for i in range(len(c)):
        c[i] = chr(ord(c[i]) ^ 0x20)
    return ''.join(c)

enc = 'lu_BURGbkz3qtwLXBkYm'
flag = '0325008b4f37de1'

print wuaidecrypt(enc)
print wuaiencrypt(flag)

等大佬解出hash算法再做keygen吧,这个80CB的红包还是不好拿啊。

最后

前两天手贱把trace文件删掉了,今天重新trace check函数,IDA花式崩,花了不少时间。剁手剁手。
附上trace和idb,trc后缀的可以在IDA里加载,另外idb貌似有点问题,附加题目会崩溃,注意一下。
idb和trace.zip (1.48 MB, 下载次数: 34)

免费评分

参与人数 80吾爱币 +291 热心值 +76 收起 理由
15396991846 + 1 我很赞同!
莫千秋 + 1 + 1 谢谢@Thanks!
lynxtang + 1 + 1 谢谢@Thanks!
fandh88 + 1 我很赞同!
Ldcsuki + 1 + 1 谢谢@Thanks!
小哥9527 + 1 + 1 我很赞同!
wwh1004 + 3 + 1 不会安卓
jlzoe + 1 + 1 谢谢@Thanks!
sunbester + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
魔鬼视觉 + 1 + 1 热心回复!
lmjg520 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
habhab + 1 我很赞同!
越简单越好 + 1 + 1 小白不懂
HelloJavaScript + 1 + 1 我很赞同!
青木公 + 1 + 1 谢谢@Thanks!
石碎大胸口 + 1 + 1 我很赞同!
xx666666 + 1 + 1 用心讨论,共获提升!
梁总 + 1 + 1 热心回复!
古或郎 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
烤烟型虾米 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gardenofida + 1 tql
517pojie + 1 + 1 我很赞同!
空灵dashu + 1 + 1 我很赞同!
努力的小和尚 + 1 + 1 我很赞同!
qazqzz + 1 + 1 谢谢@Thanks!
gaosld + 1 + 1 谢谢@Thanks!
叶隽 + 1 用心讨论,共获提升!
星夜启程 + 1 + 1 膜拜大佬
xiaobeis500c + 1 + 1 佩服佩服
何晓 + 1 我很赞同!
虔来学习 + 1 我很赞同!
风清海蓝 + 1 + 1 热心回复!
yixi + 1 + 1 谢谢@Thanks!
jiangfeng810814 + 1 我很赞同!
抱歉、 + 1 用心讨论,共获提升!
Liufei2019 + 1 我很赞同!
水尖尖的下巴 + 1 + 1 谢谢@Thanks!
AssassinQ + 1 + 1 谢谢@Thanks!
快乐交友 + 1 + 1 热心回复!
daniel7785 + 1 用心讨论,共获提升!
秃头毛笔 + 1 + 1 我很赞同!
fantion + 1 + 1 我很赞同!
cnngtc + 3 + 1 凝视大佬
wujiakang + 1 + 1 膜拜大佬
meanwhile + 1 + 1 我很赞同!
iBristlecone + 1 + 1 大佬大佬
ffcc0077 + 1 我很赞同!
开心糖 + 2 + 1 膜拜大佬
yechen123 + 3 + 1 我很赞同!
Dreace + 1 + 1 用心讨论,共获提升!
plasd + 1 + 1 谢谢@Thanks!
solly + 2 + 1 谢谢@Thanks!
CrazyNut + 3 + 1 来了来了 来膜拜大佬了
oauth + 1 + 1 我很赞同!
独行风云 + 1 + 1 膜拜大佬
maoyu + 1 + 1 热心回复!
skywilling + 2 + 1 用心讨论,共获提升!
深天深天 + 1 + 1 膜拜大佬!
LibertyCola + 1 + 1 热心回复!
XhyEax + 3 + 1 谢谢@Thanks!
snowfox + 1 + 1 谢谢@Thanks!
lzc090 + 3 + 1 谢谢@Thanks!
昨夜星辰恰似你 + 2 + 1 老哥牛逼
kaoyange + 1 + 1 Android大神,好厉害呀呀呀
nws0507 + 1 + 1 tql
生有涯知无涯 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
996579747 + 1 + 1 我很赞同!
Hmily + 200 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wangyujie96 + 1 + 1 太强了
二娃 + 2 谢谢@Thanks!
千世樱 + 1 + 1 强强强
1006706246 + 1 + 1 我很赞同!
wmsuper + 3 + 1 谢谢@Thanks!
wtujoxk + 2 + 1 膜拜大佬!
苏紫方璇 + 2 + 1 tql
qwe694698196 + 1 + 1 谢谢@Thanks!
JuncoJet + 1 膜拜大佬,(我没分了
你与明日 + 2 + 1 前排膜拜.!!!!!!
hlrlqy + 2 + 1 谢谢@Thanks!
FleTime + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

推荐
hlrlqy 发表于 2020-2-10 03:31
手撕ollvm的大佬,佩服佩服
这一手trace用的属实惊艳
推荐
Hmily 发表于 2020-2-10 13:10
4#
史迪仔 发表于 2020-2-10 03:15
5#
灰灰。 发表于 2020-2-10 03:34
很强,还从没用过ida的trace
6#
qwesyw2008 发表于 2020-2-10 05:36
看不懂,但是大佬nb
7#
fwmsuper 发表于 2020-2-10 07:55
感谢楼主辛苦分享
8#
李梦洁 发表于 2020-2-10 08:02
感谢楼主辛苦分享
9#
李梦洁 发表于 2020-2-10 08:03
感谢楼主分享
10#
jefel 发表于 2020-2-10 08:17
高手过拆!!
11#
kone153 发表于 2020-2-10 08:45
虽然看不懂,但还是看看多学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2020-2-18 14:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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

页面底部区域 foot.htm