长亭百川云 - 文章详情

一次诈骗APP的逆向分析

看雪学苑

49

2024-07-26

一  

  

APP介绍

最开始朋友给我的时候,让我帮他找个ip,我还以为是个取证题目,最后发现,找到的ip和域名都是存活的,嘶,那就有意思啦。

拿到手发现就6M多,我想,这怎么可能能luo聊,和朋友沟通发现,这只是在luo聊软件中推广的软件,封面做得就很low,甚至连APP icon都不愿意放一个,名称叫《羞密基地》。

怎么越看越像一个CTF题目呢,好劣质的感觉。

最开始没仔细看反编译结果前我还以为真能进去呢,还要了当时被诈骗的房间号,结果发现一直卡在那,感觉不对劲,又回去仔细看了看。

二  

  

逆向分析

核心逻辑全在MainActivity里面,一点多的都没有(除了一些工具类)。

if (ActivityCompat.checkSelfPermission(this, "android.permission.SEND\_SMS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ\_SMS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ\_PHONE\_NUMBERS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ\_PHONE\_STATE") != 0) {  
            showUserInfo("App所需基本权限, \\n请允许,未允许将无法提供服务!");  
            return;  
        }

要了一堆基本用不到的权限,符合我对诈骗APP的固有印象。

然后事情就开始离谱了起来。

这么多参数,看不得看死,直接抓包吧,本来我是觉得没什么的,一抓包给我吓了一跳。

这里通过静态分析可以看出,走的全是http,甚至不用配置证书。

这里两个外网服务器,下载文件下来之后,发现就是简单的base64,没有额外加密,就能拿到ip和端口。扫描一下ip,从服务器上没看出什么有用信息,就尝试动态分析呗。

最开始还是一贯性的想上frida,但是抓包明显更简单,那就fiddler吧。

基本逻辑和分析得一样,通过两个txt文件拿到真实服务器的地址,其中108是用来记录post参数的,之前图中的device、phone number等数据。

149这个ip是用来上传手机中的照片的,会导致敏感信息的泄露。最开始我是忽略了这部分的,post参数确实太显眼了一点。

从fiddler中dump出数据,上010恢复成jpg格式我才发现事情的不对劲。虽然这是专门做逆向root过的机器,但是上面还是有一些照片!唉,所以说,淹死的都是会水的。

三  

  

伪造请求

知道了整体逻辑,接下来就是逆他自己的加密算法了。

每个post的参数都经过了AESUtils.encryptBase64()加密了一次,对称密码,直接看看他代码怎么写的。

顾名思义,AES、Base64,真就只有这两个算法。

唯一上的保护就是密钥了。

虽然这保护和没保护也没什么区别就是了。

那就直接找密钥呗,没什么说的。

import java.io.IOException;  
import java.nio.charset.StandardCharsets;  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;  
import java.lang.String;  
public class Main {  
    public static byte\[\] subBytes(byte\[\] src, int begin, int count) {  
        byte\[\] bs = new byte\[count\];  
        for (int i = begin; i < begin + count; i++) {  
            bs\[i - begin\] = src\[i\];  
        }  
        return bs;  
    }  
    public static byte\[\] GetKeySeed(String seed, int keylen) throws NoSuchAlgorithmException {  
        MessageDigest md = MessageDigest.getInstance("SHA1");  
        MessageDigest rd = MessageDigest.getInstance("SHA1");  
        byte\[\] keyst = md.digest(seed.getBytes(StandardCharsets.UTF\_8));  
        return subBytes(rd.digest(keyst), 0, keylen);  
    }  
    public static void  main(String\[\] args) throws IOException, NoSuchAlgorithmException {  
        String KeyPrivate = "kGfIzsWnQBvW";  
        String SaltPrivate = "3s1Zj1hvDi90";  
        byte\[\] arr =new byte\[16\];  
        arr=GetKeySeed(KeyPrivate + SaltPrivate, 16);  
        for (int i = 0; i < arr.length; i++) {  
             System.out.printf("0x%02X,", arr\[i\] & 0xFF);  
        }  
        System.out.println("\\n"+arr.length);  
    }  
}

python写出解密脚本:

aeskeyarr=\[0x4C,0x2C,0x00,0xA9,0x80,0x35,0x96,0x36,0x78,0x7A,0x45,0xD3,0xC9,0xB1,0x1E,0x2E,\]  
aeskey=b""  
#aeskey=0x4C2C00A980359636787A45D3C9B11E2E  
for i in aeskeyarr:  
    aeskey+=bytes(\[i\])  
from Crypto.Cipher import AES  
import base64  
def add\_to\_16(value):  
    while len(value) % 16 != 0:  
        value += '\\5'  
    return str.encode(value)  # 返回bytes  
def enc(text):  
    text = add\_to\_16(text)  
    aes = AES.new(aeskey,AES.MODE\_ECB)  
    en\_text = base64.b64encode(aes.encrypt(text))  
    return en\_text.decode()  
def dec(text):  
    text=text.encode()  
    aes = AES.new(aeskey, AES.MODE\_ECB)  
    tmp=base64.b64decode(text)  
    en\_text = aes.decrypt(tmp)  
    return en\_text.decode()

找到加密逻辑伪造请求就简单了,直接post就行了,反正是诈骗APP,想怎么来就怎么来。

看雪ID:touful

https://bbs.kanxue.com/user-home-974558.htm

*本文为看雪论坛优秀文章,由 touful 原创,转载请注明来自看雪社区



# 往期推荐

1、UnrealEngine POLYGON 全逆向笔记

2、inlinehook心得分享

3、PWN入门-2-LibC取物-Ret2LibC

4、HITCON CTF 2024 re AntiVirus wp clamav bytecode signature逆向

5、House of orange的进一步利用(house of orange+)

点击阅读原文查看更多

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2