Java 如何确定某个方法是否被钩住(=充当层的第三方方法,用于破解应用程序)

Java 如何确定某个方法是否被钩住(=充当层的第三方方法,用于破解应用程序),java,android,obfuscation,decompiling,Java,Android,Obfuscation,Decompiling,有几种工具可以反编译APK dex文件并插入各种挂钩 例如,如果要检查安装程序包名,需要调用函数PackageManager.getInstallerName() 现在,就我而言,它们将反射替换为方法,然后调用实际方法或发送一些伪造的结果 这有一个巨大的优势,即无论您是以本机方式调用该方法还是使用反射调用该方法 在这种特殊情况下,getInstallerName()将始终返回com.google.android.feedback 可在此处找到此类挂钩的一些源代码: 有没有办法检测这些钩子?您可以

有几种工具可以反编译APK dex文件并插入各种挂钩

例如,如果要检查安装程序包名,需要调用函数
PackageManager.getInstallerName()

现在,就我而言,它们将反射替换为方法,然后调用实际方法或发送一些伪造的结果

这有一个巨大的优势,即无论您是以本机方式调用该方法还是使用反射调用该方法

在这种特殊情况下,
getInstallerName()
将始终返回
com.google.android.feedback

可在此处找到此类挂钩的一些源代码:


有没有办法检测这些钩子?

您可以对已知的原始apk和可疑的盗版版本运行md5 sum,并对两者进行比较。这只能保证可疑的篡改版本被修改,但不能告诉您修改的准确程度。

另一件你可能会做的事情,虽然我自己没有尝试过,但看起来很有希望,就是在理论上你可以搜索类名,比如Smailhook,然后找出它们是否存在。这些想法至少应该为您指明正确的调查方向,但它们可能不涵盖所有基础。

编辑:如果您想在运行时完成类似的操作(我不知道您会这么做——我以为您指的是您怀疑的某个应用程序的特定副本,脱机),您可以尝试类似的方法。类似的东西或其他类加载器方法应该有助于搜索正在查找的.dex文件中的类,并且可以捕获
知道一切都很顺利。如果发现一个类与您要查找的名称同名,您可以随心所欲地处理它——终止该程序,点击一个背后有欺诈应用数据库的Web服务,等等。

您可以对已知的原始apk和怀疑的盗版版本运行md5 sum,并将两者进行比较。这只能保证可疑的篡改版本被修改,但不能告诉您修改的准确程度。

另一件你可能会做的事情,虽然我自己没有尝试过,但看起来很有希望,就是在理论上你可以搜索类名,比如Smailhook,然后找出它们是否存在。这些想法至少应该为您指明正确的调查方向,但它们可能不涵盖所有基础。

编辑:如果您想在运行时完成类似的操作(我不知道您会这么做——我以为您指的是您怀疑的某个应用程序的特定副本,脱机),您可以尝试类似的方法。类似的东西或其他类加载器方法应该有助于搜索正在查找的.dex文件中的类,并且可以捕获
知道一切都很顺利。如果发现一个类与您要查找的名称同名,您可以根据自己的意愿进行处理——终止该程序,点击背后有欺诈应用数据库的Web服务,等等。

谢谢您的回答。显然,不可能对APK进行md5sum(只要存储了sum,sum就会改变),唯一的方法就是对classes.dex进行crc。此外,运行时使用dex2jar的成本太高。有没有一种方法可以简单地检查smali类的类?我还需要一种更通用的方法,不仅仅是这个工具。啊,我不明白你想在运行时这样做:)这会改变很多事情。我将编辑我的响应,
Class.forName()
是一种很好的方法,但是该类没有插入到DEX中,只是修改字节码。这意味着,没有其他方法。对,只是注意到了这一点。让我再看一看,但我在想一些想法,如果我今天有时间的话,我可能会尝试反射,我会发布我的结果,如果我能找到任何半结论性的东西…所以我看了一些反射的东西,没有得到任何好的想法,但我确实又开始考虑MD5求和解决方案。我同意,如果您要将新的金额重新保存到.apk文件中,它将不起作用。但是,如果您要将legit.apk的MD5存储在服务器上的数据库中,而不是存储在.apk文件中,在启动应用程序时比较MD5,那么这仍然是一个可行的解决方案。感谢您的回答。显然,不可能对APK进行md5sum(只要存储了sum,sum就会改变),唯一的方法就是对classes.dex进行crc。此外,运行时使用dex2jar的成本太高。有没有一种方法可以简单地检查smali类的类?我还需要一种更通用的方法,不仅仅是这个工具。啊,我不明白你想在运行时这样做:)这会改变很多事情。我将编辑我的响应,
Class.forName()
是一种很好的方法,但是该类没有插入到DEX中,只是修改字节码。这意味着,没有其他方法。对,只是注意到了这一点。让我再看一看,但我在想一些想法,如果我今天有时间的话,我可能会尝试反射,我会发布我的结果,如果我能找到任何半结论性的东西…所以我看了一些反射的东西,没有得到任何好的想法,但我确实又开始考虑MD5求和解决方案。我同意,如果您要将新的金额重新保存到.apk文件中,它将不起作用。但是,如果您要将legit.apk的MD5存储在服务器上的数据库中,而不是存储在.apk文件中,在该文件中它也可能被欺骗,并在应用程序启动时比较MD5,那么这仍然是一个可行的解决方案