验证是否已根据给定的源代码构建了APK


10

对于同一个应用程序,我有:

  • 来自应用商店的APK
  • 声称是同一版本的源代码。使用一个非常普通的Gradle构建脚本和结构。

我想检查APK是否真的是从该源代码构建的
如何检查?

笔记:

  • APK不会被混淆。
  • 我没有理由相信任何人的签名。我只相信源代码。
  • 我已经为自己创建了应用程序,但是现在我想知道APK是否正常。
  • 最好使用Linux命令行工具,但是任何工具都可以。

2
我没有尝试过,但是您应该可以使用Apktool来实现:对两个.apk文件进行反向工程,然后对结果目录运行diff。唯一的区别就是签名(由于明显的原因不能匹配)。考虑一下:只需解压缩.apk文件并进行二进制比较就可以做到这一点。当然,两者都需要在编译时使用相同的库版本等:)
Izzy

@Izzy:“ 相同的库版本 ”:API版本写在清单中,而Gradle脚本中的库版本,所以我猜那应该没问题。可以忽略的文件/文件夹列表将是一个很好的答案(对实际命令行而言是一个好办法)。
Nicolas Raoul

1
如果我现在不在家里,请在家里的电脑上可以这样做。但是要使它成为“诚实的答案”,我需要先自己尝试一下:)如果万一我忘记了(在我之前没有其他人做过),请随时给我发送另一个ping(例如在聊天中) 8..10h :)
Izzy

@Izzy该diff方法似乎很简洁...但是,如果应用商店的家伙在编译APK时混淆了APK怎么办?
Grimoire

恕我直言,这就是Apktool发挥作用的地方。您检查链接了吗?还要看看使用它的LibRadar。AFAIR有助于消除混淆(必须这样做,否则LibRadar将很难检测这些库)。
伊兹

Answers:


2

您只能使用可复制的版本进行此操作

“如果给定相同的源代码,构建环境和构建指令,则构建是可复制的,任何一方都可以重新创建所有指定工件的逐位相同副本。”

因此,应用程序开发人员或应用程序商店需要加入才能正常工作。
否则,您唯一的选择是自己构建。

当前正在执行此操作的开发人员的一个示例是Open Whisper Systems:https//github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


很有意思!因此,您确定没有开发人员加入就无法进行比较吗?不幸的是(但可以理解),大多数开源应用程序都没有使用Docker或类似的工具进行构建,它们只是在维护者碰巧运行的任何系统上构建。
Nicolas Raoul

只要由源代码构建应用程序的任何人都可以精确地重新创建其构建环境,就不必成为开发人员。设置这些类型的构建时,依赖可能会非常痛苦。
andDevW '17

“准确地重新创建其构建环境”:可以猜测吗?例如,如果出于某种原因在Mac或Linux上构建会生成不同的APK,我是否可以猜测应用商店的APK是否已在Mac或Linux上构建?
Nicolas Raoul

猜测和得出有意义的结果是不可能的。最终,这将变得更容易实现,并且您将看到越来越多的开源项目正在这样做。
andDevW

1

关于Java和APK的一大优点是您可以将APK完全反编译为Java源代码。

但是,不能保证最终的源代码是相同的。

尝试将生成的源代码与已知修订进行匹配的一种好方法是,检查在存储库中的已知提交之前和之后直接进行了哪些修改,并查看反编译源中是否也存在这些修改。

要反编译,请使用dex2jarJD-Gui

编辑我刚刚注意到您想要Linux工具。我唯一的经验是使用Windows,但是我确信Linux也存在类似的工具。


如果我理解正确,那么您的方法是检查源代码存储库中的最新更改,然后反编译APK,并手动检查在反编译代码中是否也找到了最新更改,对吗?有趣的方法,但这并不能告诉我是否已将回电广告或嵌入式广告添加到APK版本中,对吗?
Nicolas Raoul

1
这是我在办公室使用的一种方法,试图将未知的APK与源版本进行匹配,如果您知道您可以信任开发人员,那么这种方法就足够了。但是正如您所说,一个不值得信任的政党仍然有可能溜进来。我希望有人能提供一个更明确的答案,这对我也很有用。
Mark Ch'Sep

如何自己将源代码编译为APK,然后将其反编译为源代码,然后将其与Play Store APK中反编译的源代码进行比较?有人尝试过吗?
谢尔盖·别洛佐洛夫

1
@SergiyBelozorov对不起,我无法回答这个问题,我不再使用android了,但这听起来是个好主意。
Mark Ch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.