事出有因必出妖
又是一个小朋友按耐不住寂寞,下载了一个App,欣赏完爱情动作片后起了与主角切磋的念想,结果被人偷师,拍下武器使用照片,要求付费删除,师可忍父不可忍。
App名称叫《逍遥阁》,收到的时候已经临近中午,简单的让找个IP,这有何难,估计是为了取证啥的,上机抓个包,轻轻松松IP到手,日ping一下,抓个同服务器ip的域名,10几个域名都是活的,日常喽一眼,嗯~兄小弟的眼光属实不怎么样,当然了大家想看的话我先帮大家去鉴定一波。
待反馈!!!
根据小弟弟的反馈,沿着它的路线进入一个被诈骗的房间(卡着不动,刷新·还是卡着不动)。
抛开事实不谈,为啥不让我进?
越不让进越要进,先给你反编译一下,看看你肚子里有啥。
核心逻辑全在MainActivity
里面hhhh
,一点多的都没有(除了一些工具类)
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和端口。扫描一下,服务器上没什么有用信息,尝试动态分析。一贯性的上frida;
通过两个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写的解密脚本,改吧改吧就能用,不用啥都自己写,有Ak谁愿意用烧火棍。
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不受法律保护,粗暴地直接进就可以了,打个镜像,拷贝一份资料直接拿下,吃完饭直接送到属地公安机关。
懂不懂技术都下载个反诈App吧,血的教训。
暂无评论内容