伙计们,我是一名Web程序员,但我是反向工程的新手。.

因此,有一个名为InstaMessage的android应用,我想对客户的反向工程与服务器的连接,以便我可以在计算机上模拟它并查看其中有什么命令,也许可以稍微玩一下,然后进一步创建一些脚本来充当用户的操作

监视流量,查看流量的方向和端口,尝试从那里开始。

我知道这是一个广泛的问题,所以如果您能给我一些从哪里开始的提示,这会很有帮助。

谢谢

评论

您是否尝试过反编译应用程序?如果不是,那可能是一个好的开始,而不是尝试监视网络流量。

#1 楼

我是使用很多Android应用程序完成此操作的,所以我将分享我所学到的知识。

当考虑嗅探流量时,想到的第一件事是“我将根除Android设备,在上面运行tcpdump,我就完成了。”这适用于简单的事情,但是很快变得非常混乱。而且,如果应用程序使用SSL(例如现有应用程序的99%),那就更糟了。

使用代理

大多数应用程序都使用HTTP / HTTPS与服务器进行通信。嗅探此类流量的最简单方法是使用嗅探代理(也称为调试代理)。常见的是查尔斯和提琴手。我使用Charles,所以我将向您展示如何使用它,但是Fiddler应该是类似的。

首先,您需要计算机和Android设备位于同一LAN上。启动Charles后,它将自动开始代理您计算机的流量。您可能不希望这样做,因此请从代理->代理设置...-> Windows禁用它。现在,将您的Android网络设置指向将您的计算机用作HTTP代理(Charles默认端口为8888)。 Charles将向您显示设备中的所有HTTP流量。

如果需要SSL(HTTPS)代理,则必须在设备上安装Charles证书。 Android要求您具有受保护的(至少是模式)锁屏才能安装外部证书。您可以在Charles的安装路径的doc /目录中找到证书,也可以从设备浏览器访问http://www.charlesproxy.com/getssl/。然后,在Charles中,转到代理->代理设置...-> SSL,启用SSL代理并添加要代理的主机(或仅添加*来代理所有内容)。

非- HTTP(S)通信

HTTP调试代理将覆盖大多数应用程序。如果应用程序不使用HTTP(S),事情会变得更加复杂。您可能需要研究Charles的SOCKS代理功能,以及如何在设备上配置SOCKS代理。如果那还不够,那么您真的想突破诸如tcpdump / Wireshark之​​类的工具。您可以设置伪造的DNS,欺骗设备的ARP,使用嗅探VPN等。有很多解决方法。如果您要模拟服务器而不是客户端,则伪造的DNS也很好。

SSL证书检查

处理SSL时,大多数应用程序都信任OS信任的内容。由于您可以在Android上安装外部证书,因此很好。很少,该应用程序会针对嵌入式CA根目录检查服务器证书。可以通过以下几种方法来绕过此操作:


使用apktool和smali之类的工具,将自己的证书注入到应用程序中,以替换原始证书;
编写一个xposed模块钩住数据发送/接收方法,以嗅探解密的消息;
编写一个绕过钩住证书检查例程的xposed模块,绕过它。

我将使用第一个或最后一个。

反编译

在某些时候,您必须查看应用程序代码。可能是使用专有的二进制协议,可能是对流量进行了加密或压缩,也许您无法理解某些值。我建议尝试使用多个反编译器/引擎。它们不是完美的,很多时候一个方法在另一个失败的情况下效果很好。美德十工作室是一个很好的起点。然后,我总是从APK中提取classes.dex文件(这只是一个ZIP文件),并通过dex2jar运行它。然后,我通过JD-GUI(JD-Core引擎)和SecureTeam Java Decompiler(Procyon引擎)运行生成的JAR。而且,jadx可以直接面向DEX,而无需dex2jar。

InstaMessage

我检查了您要撤消的应用程序。它使用标准的HTTPS通信,可使用Charles或Fiddler轻松嗅探。服务器具有各种GET端点,并且客户端发送一个以base64编码的data字段。这是二进制数据,我没有真正研究过,但是前70%在所有请求中都是相同的,因此我怀疑它是某种会话令牌。最后一部分随请求而变化,但是整个字段的熵都很高,因此我认为它是压缩的或加密的。我会尝试反编译应用程序,看看发生了什么。另一方面,服务器响应是纯JSON。

#2 楼

如果您仍然想自己模拟服务器,那么我将从服务器开始,该服务器只打印出要输入的任何连接数据,然后将我的android指向那里。比监视流量并过滤掉所有无关的东西要快得多,容易得多。

评论


该应用程序是二进制的。我如何将其指向我自己的服务器?

– raphadko
15年8月21日在6:16

那你的问题还不清楚。您说过要模拟连接,所以我假设您要模拟服务器。因此,您只想模拟客户端而不是服务器端?

– Devolus
15年8月21日在7:04



似乎他没有(他自己的)服务器,想首先分析连接,然后编写一个客户端来模拟与服务器的连接。

–贡特拉姆·布洛姆(Guntram Blohm)
15年8月21日在9:47