当前位置:   article > 正文

unidbg实现淘宝请求参数算法,实现脱离模拟器/手机请求淘宝、闲鱼_unidbg x-sign

unidbg x-sign
本篇文章仅适用于学习。

最近一直在研究阿里系的请求问题,原来一直都是hook请求端口,虽然和很多人的hook参数生成x-sign不一样,可以说更稳定一些。但总归是脱离不了安卓环境——或者用模拟器,或者用真机。

对于逆向来说,非常的没有档次,没有逼格。

相对于直接逆向x-sign的算法而言,用unidbg调用so文件的难度要小很多。由易入难,unidbg这时候势在必行了。

但是,随着研究的深入,相关的学习资料越来越少,unidbg和直接逆向学习的资料,虽然有一些,但对于问题的深入,原理的解析,以及具体API方法的使用,可以说是少之又少。鱼和渔的问题,越来越尖锐了。

已经研究了差不多几个月,总感觉临门一脚了,程序调试也没有完全通过。虽然越挫越勇,会继续研究,但还是感觉得慢慢来,研究、学习,本身也是一场永远止境的修行。

下面的代码面向的是mtop6.5.27, 代码还存在不少问题,并不能直接使用。

  1. import android.content.Context;
  2. import com.github.unidbg.AndroidEmulator;
  3. import com.github.unidbg.Emulator;
  4. import com.github.unidbg.Module;
  5. import com.github.unidbg.arm.HookStatus;
  6. import com.github.unidbg.file.FileResult;
  7. import com.github.unidbg.file.IOResolver;
  8. import com.github.unidbg.file.linux.AndroidFileIO;
  9. import com.github.unidbg.hook.HookContext;
  10. import com.github.unidbg.hook.ReplaceCallback;
  11. import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
  12. import com.github.unidbg.linux.android.AndroidResolver;
  13. import com.github.unidbg.linux.android.dvm.*;
  14. import com.github.unidbg.linux.android.dvm.array.ByteArray;
  15. import com.github.unidbg.linux.android.dvm.jni.ProxyDvmObject;
  16. import com.github.unidbg.memory.Memory;
  17. import com.github.unidbg.pointer.UnidbgPointer;
  18. import com.github.unidbg.spi.SyscallHandler;
  19. import com.taobao.tao.TaobaoApplication;
  20. import org.json.JSONObject;
  21. import java.io.File;
  22. import java.io.IOException;
  23. import java.util.HashMap;
  24. import java.util.LinkedHashMap;
  25. import java.util.Map;
  26. public class TaoBao extends AbstractJni implements IOResolver<AndroidFileIO> {
  27. private final AndroidEmulator emulator;
  28. private final VM vm;
  29. private final Context context;
  30. private final JSONObject data;
  31. private long slot;
  32. // private int num = 0;
  33. private TaoBao(File apk) throws Exception{
  34. emulator = AndroidEmulatorBuilder.for32Bit()
  35. .setRootDir(new File("D:\\DesktopTemp\\tb\\rootfs"))
  36. .build();
  37. Map<String, Integer> iNode = new LinkedHashMap<>();
  38. iNode.put("/data/system", 671745);
  39. iNode.put("/data/app", 327681);
  40. iNode.put("/sdcard/android", 294915);
  41. iNode.put("/data/user/0/com.taobao.taobao", 655781);
  42. iNode.put("/data/user/0/com.taobao.taobao/files", 655864);
  43. emulator.set("inode", iNode);
  44. emulator.set("uid", 10074);
  45. Memory memory = emulator.getMemory();
  46. memory.setLibraryResolver(new AndroidResolver(23));
  47. SyscallHandler<AndroidFileIO> handler = emulator.getSyscallHandler();
  48. handler.setVerbose(false);
  49. handler.addIOResolver(this);
  50. vm = emulator.createDalvikVM(apk);
  51. vm.setJni(this);
  52. vm.setVerbose(true);
  53. context = new TaobaoApplication(vm);
  54. data = new JSONObject("{\"Soft_SGTMAGIC\":\"4I1q9PXiORQGtBivoqf4hSwMk9pwm1D8o4NitR+kvgA=\",\"dynamicreid_dynamicreid\":\"d0666b5b6022eb0\",\"dynamicrsid_dynamicrsid\":\"e1a2607877e260b\",\"SgDyUpdate_ac7123c301ca455b\":\"1621600637\",\"LOCAL_DEVICE_INFO_982c1b269b8e023e5aede2421cbf9c48\":\"YKepcS4SY+ADAIS37Xj5c7s+\",\"DynamicData_accs_ssl_key2_https:\\/\\/ossgw.alicdn.com_21646297%[B\":\"nRWwrMQ\\/jz+oOTWkAZ5FOjhnS1k48SqJdb3w3u\\/ImZJMSXQnlxpD8g0Lyi4kEfgHy5Me33VQ8fyLfqHjPk5PXZ3SwQDtSG4Km7fj9RhEav6NeP85kaWorOA8KTx9u9MHnXdbQa4GVOpBTln\\/GKsPje5gRpmCtWUb71auNwVEO\\/s9LUhH\\/HOcH\\/fwdPixaJAi\\/wNKYYlijdORJgVTOwrtSls1DeUr61NyCDUQa0SkVhw6\\/8PI8gdM1JNt8QEcBIemgI0sM4zA3yyRxFTb0wwcu8CpLsBmIqxqZbvHA+2081dfYDIKuKguH9vYy4s\\/q++odPRvTB25RuEfvXWW\\/+IPtScYQXMx9\\/MG4RW7t80WR0+DOWZXHtkpVlPhTDcU9P2fI4bcQdRSTOIcaI6uFmnOdmb5b9QdtwU3qXgSOuBTh2Bdd6yTeyydRLChBzlWRtcZm6+tYgHOTJIWRNoDg8CxEw==\",\"llc-local_2c3c7f544c159842\":\"1621600921\",\"llc-local_abv2\":\"his:0\",\"llc-local_tcv2\":\"source:0,0,0\"}");
  55. }
  56. public static void main(String[] args) throws Exception {
  57. TaoBao taobao = new TaoBao(new File("D:\\DesktopTemp\\tb\\tb.apk"));
  58. AndroidEmulator emulator = taobao.emulator;
  59. String methodSign = "doCommandNative(I[Ljava/lang/Object;)Ljava/lang/Object;";
  60. DvmClass targetClass = taobao.vm.resolveClass("com/taobao/wireless/security/adapter/JNICLibrary");
  61. DalvikModule main = taobao.vm.loadLibrary("sgmainso-6.5.25", true);
  62. main.callJNI_OnLoad(emulator);
  63. targetClass.callStaticJniMethodObject(emulator, methodSign,
  64. 10101, ProxyDvmObject.createObject(taobao.vm, new Object[]{
  65. taobao.context, 3, "", "/data/user/0/com.taobao.taobao/app_SGLib", ""
  66. }));
  67. targetClass.callStaticJniMethodObject(emulator, methodSign,
  68. 10102, ProxyDvmObject.createObject(taobao.vm, new Object[]{
  69. "main", "6.5.25", "/data/app/com.taobao.taobao-1/lib/arm/libsgmainso-6.5.25.so"
  70. }));
  71. DalvikModule security = taobao.vm.loadLibrary("sgsecuritybodyso-6.5.33", true);
  72. security.callJNI_OnLoad(emulator);
  73. targetClass.callStaticJniMethodObject(emulator, methodSign,
  74. 10102, ProxyDvmObject.createObject(taobao.vm, new Object[]{
  75. "securitybody", "6.5.33", "/data/app/com.taobao.taobao-1/lib/arm/libsgsecuritybodyso-6.5.33.so"
  76. }));
  77. DalvikModule middletier = taobao.vm.loadLibrary("sgmiddletierso-6.5.27", true);
  78. middletier.callJNI_OnLoad(emulator);
  79. targetClass.callStaticJniMethodObject(emulator, methodSign,
  80. 10102, ProxyDvmObject.createObject(taobao.vm, new Object[]{
  81. "middletier", "6.5.27", "/data/app/com.taobao.taobao-1/lib/arm/libsgmiddletierso-6.5.27.so"
  82. }));
  83. taobao.loadTest3Hook(middletier.getModule());
  84. DvmObject<?> dvmObject1 = targetClass.callStaticJniMethodObject(emulator, methodSign,
  85. 70102, ProxyDvmObject.createObject(taobao.vm, new Object[]{
  86. "丢失", "丢失",
  87. false, 0, "mtop.alibaba.cro.umid.networksdk.savewb", "pageName=com.taobao.tao.welcome.Welcome&pageId=", null, null, null, "r_6"
  88. }));
  89. System.out.println(dvmObject1.getValue().toString());
  90. try {
  91. emulator.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. @Override
  97. public DvmObject<?> newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
  98. switch (signature) {
  99. case "java/lang/Integer-><init>(I)V":
  100. return ProxyDvmObject.createObject(vm, varArg.getIntArg(0));
  101. case "java/lang/Long-><init>(J)V":
  102. return ProxyDvmObject.createObject(vm, varArg.getLongArg(0));
  103. case "java/util/HashMap-><init>(I)V":
  104. return ProxyDvmObject.createObject(vm, new HashMap<>());
  105. }
  106. return super.newObject(vm, dvmClass, signature, varArg);
  107. }
  108. @Override
  109. public int getStaticIntField(BaseVM vm, DvmClass dvmClass, String signature) {
  110. if ("android/os/Build$VERSION->SDK_INT:I".equals(signature)) {
  111. return 23;
  112. }
  113. return super.getStaticIntField(vm, dvmClass, signature);
  114. }
  115. @Override
  116. public long getStaticLongField(BaseVM vm, DvmClass dvmClass, String signature) {
  117. if ("com/alibaba/wireless/security/framework/SGPluginExtras->slot:J".equals(signature)) {
  118. return slot;
  119. }
  120. return super.getStaticLongField(vm, dvmClass, signature);
  121. }
  122. @Override
  123. public DvmObject<?> getObjectField(BaseVM vm, DvmObject<?> dvmObject, String signature) {
  124. if ("android/content/pm/ApplicationInfo->nativeLibraryDir:Ljava/lang/String;".equals(signature)) {
  125. return new StringObject(vm, "/data/app/com.taobao.taobao-1/lib/arm");
  126. } else if ("android/content/pm/ApplicationInfo->sourceDir:Ljava/lang/String;".equals(signature)) {
  127. return new StringObject(vm, this.context.getPackageCodePath());
  128. }
  129. return super.getObjectField(vm, dvmObject, signature);
  130. }
  131. @Override
  132. public void setStaticLongField(BaseVM vm, DvmClass dvmClass, String signature, long value) {
  133. if ("com/alibaba/wireless/security/framework/SGPluginExtras->slot:J".equals(signature)) {
  134. slot = value;
  135. return;
  136. }
  137. super.setStaticLongField(vm, dvmClass, signature, value);
  138. }
  139. @Override
  140. public DvmObject<?> callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
  141. switch (signature) {
  142. case "com/alibaba/wireless/security/securitybody/SecurityGuardSecurityBodyPlugin->getPluginClassLoader()Ljava/lang/ClassLoader;":
  143. return vm.resolveClass("dalvik/system/PathClassLoader").newObject(this.getClass().getClassLoader());
  144. case "java/net/NetworkInterface->getNetworkInterfaces()Ljava/util/Enumeration;":
  145. try {
  146. return Context.getNetworkInterfaces(vm);
  147. } catch (Exception e) {
  148. e.printStackTrace();
  149. }
  150. return null;
  151. }
  152. return super.callStaticObjectMethod(vm, dvmClass, signature, varArg);
  153. }
  154. @Override
  155. public void callStaticVoidMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
  156. switch (signature) {
  157. case "com/alibaba/wireless/security/open/edgecomputing/ECMiscInfo->registerAppLifeCyCleCallBack()V":
  158. case "com/alibaba/wireless/security/securitybody/LifeCycle->setAccessibilityDelegateToView()V":
  159. return;
  160. }
  161. super.callStaticVoidMethod(vm, dvmClass, signature, varArg);
  162. }
  163. @Override
  164. public int callStaticIntMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
  165. switch (signature) {
  166. case "com/taobao/wireless/security/adapter/common/SPUtility2->saveToFileUnifiedForNative(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I":
  167. return 2;
  168. case "com/alibaba/wireless/security/framework/utils/UserTrackMethodJniBridge->utAvaiable()I":
  169. case "com/uc/crashsdk/JNIBridge->registerInfoCallback(Ljava/lang/String;IJI)I":
  170. return 1;
  171. case "android/provider/Settings$Secure->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I":
  172. return context.getInt(varArg.getObjectArg(1).getValue().toString(), varArg.getIntArg(2));
  173. }
  174. return super.callStaticIntMethod(vm, dvmClass, signature, varArg);
  175. }
  176. @Override
  177. public boolean callBooleanMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
  178. switch (signature) {
  179. case "java/lang/Boolean->booleanValue()Z":
  180. return (Boolean) dvmObject.getValue();
  181. case "android/view/accessibility/AccessibilityManager->isEnabled()Z":
  182. case "android/view/accessibility/AccessibilityManager->isTouchExplorationEnabled()Z":
  183. return false;
  184. case "java/util/Enumeration->hasMoreElements()Z":
  185. return ((Enumeration) dvmObject).hasMoreElements();
  186. case "java/net/NetworkInterface->isUp()Z":
  187. return ((Context.mNetworkInterface) dvmObject.getValue()).isUp();
  188. }
  189. return super.callBooleanMethod(vm, dvmObject, signature, varArg);
  190. }
  191. @Override
  192. public void callVoidMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
  193. if ("com/taobao/dp/util/CallbackHelper->onUpdated(IILjava/lang/String;)V".equals(signature)) {
  194. return;
  195. }
  196. super.callVoidMethod(vm, dvmObject, signature, varArg);
  197. }
  198. @Override
  199. public int callIntMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
  200. if ("java/lang/Integer->intValue()I".equals(signature)) {
  201. return (Integer) dvmObject.getValue();
  202. } else if ("android/telephony/TelephonyManager->getSimState()I".equals(signature)) {
  203. return ((Context) dvmObject.getValue()).getSimState();
  204. }
  205. return super.callIntMethod(vm, dvmObject, signature, varArg);
  206. }
  207. @Override
  208. public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
  209. switch (signature) {
  210. case "java/lang/String->getBytes()[B":
  211. return new ByteArray(vm, ((String) dvmObject.getValue()).getBytes());
  212. case "com/taobao/tao/TaobaoApplication->getPackageCodePath()Ljava/lang/String;":
  213. return new StringObject(vm, ((Context) dvmObject.getValue()).getPackageCodePath());
  214. case "com/taobao/tao/TaobaoApplication->getFilesDir()Ljava/io/File;":
  215. case "android/content/Context->getFilesDir()Ljava/io/File;":
  216. return ProxyDvmObject.createObject(vm, ((Context) dvmObject.getValue()).getFilesDir());
  217. case "java/io/File->getAbsolutePath()Ljava/lang/String;":
  218. return new StringObject(vm, ((File) dvmObject.getValue()).getPath().replace('\\', '/'));
  219. case "com/taobao/tao/TaobaoApplication->getApplicationInfo()Landroid/content/pm/ApplicationInfo;":
  220. return super.callObjectMethod(vm, dvmObject,
  221. "android/content/Context->getApplicationInfo()Landroid/content/pm/ApplicationInfo;", varArg);
  222. case "android/content/Context->getSystemService(Ljava/lang/String;)Ljava/lang/Object;":
  223. return ((TaobaoApplication) dvmObject.getValue()).getSystemService(varArg.getObjectArg(0).getValue().toString());
  224. case "dalvik/system/PathClassLoader->findClass(Ljava/lang/String;)Ljava/lang/Class;":
  225. return vm.resolveClass(varArg.getObjectArg(0).getValue().toString());
  226. case "java/util/Enumeration->nextElement()Ljava/lang/Object;":
  227. return ((Enumeration) dvmObject).nextElement();
  228. case "android/content/Context->getContentResolver()Landroid/content/ContentResolver;":
  229. return ((Context) dvmObject.getValue()).getContentResolver();
  230. case "java/net/NetworkInterface->getName()Ljava/lang/String;":
  231. return new StringObject(vm, ((Context.mNetworkInterface) dvmObject.getValue()).getName());
  232. case "java/lang/Thread->getStackTrace()[Ljava/lang/StackTraceElement;":
  233. return ProxyDvmObject.createObject(vm, ((Thread) dvmObject.getValue()).getStackTrace());
  234. case "java/lang/StackTraceElement->toString()Ljava/lang/String;":
  235. return new StringObject(vm, ((StackTraceElement) dvmObject.getValue()).toString());
  236. case "java/util/HashMap->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;":
  237. return ProxyDvmObject.createObject(vm, ((HashMap<Object, Object>) dvmObject.getValue())
  238. .put(varArg.getObjectArg(0).getValue(), varArg.getObjectArg(1).getValue()));
  239. }
  240. return super.callObjectMethod(vm, dvmObject, signature, varArg);
  241. }
  242. @Override
  243. public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
  244. switch (signature) {
  245. case "android/content/Context->getClassLoader()Ljava/lang/ClassLoader;":
  246. return ProxyDvmObject.createObject(vm, this.getClass().getClassLoader());
  247. case "android/content/Context->getPackageResourcePath()Ljava/lang/String;":
  248. return ProxyDvmObject.createObject(vm, ((Context) dvmObject.getValue()).getPackageResourcePath());
  249. case "android/content/Context->getFilesDir()Ljava/io/File;":
  250. return ProxyDvmObject.createObject(vm, ((Context) dvmObject.getValue()).getFilesDir());
  251. case "java/io/File->getPath()Ljava/lang/String;":
  252. return ProxyDvmObject.createObject(vm, ((File) dvmObject.getValue()).getPath().replace('\\', '/'));
  253. }
  254. return super.callObjectMethodV(vm, dvmObject, signature, vaList);
  255. }
  256. @Override
  257. public FileResult<AndroidFileIO> resolve(Emulator<AndroidFileIO> emulator, String pathname, int oflags) {
  258. switch (pathname) {
  259. case "/data/app/com.taobao.taobao-1/base.apk":
  260. case "/data/user/0/com.taobao.taobao/files/sg_oc.lock":
  261. case "/data/user/0/com.taobao.taobao/files/ab914f43b8296c2c.lock":
  262. case "/data/user/0/com.taobao.taobao/files/0a231bd8575dcf72.txt":
  263. case "/data/user/0/com.taobao.taobao/files/.ba2f9c85.lock":
  264. case "/data/user/0/com.taobao.taobao/files/JX0WDG83P1ZN.txt":
  265. case "/data/user/0/com.taobao.taobao/files/sgFile.lock":
  266. case "/data/user/0/com.taobao.taobao/app_SGLib/SG_INNER_DATA":
  267. return FileResult.success(emulator.getFileSystem().createSimpleFileIO(
  268. new File("D:\\DesktopTemp\\tb\\rootfs", pathname), oflags, pathname));
  269. case "/data/data/com.taobao.taobao/app_SGLib/sec":
  270. case "/data/user/0/com.taobao.taobao/app_SGLib/sec":
  271. case "/data/user/0/com.taobao.taobao/app_SGLib/lvmreport":
  272. return FileResult.success(emulator.getFileSystem().createDirectoryFileIO(
  273. new File("D:\\DesktopTemp\\tb\\rootfs", pathname), oflags, pathname));
  274. default:
  275. return null;
  276. }
  277. }
  278. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/158465
推荐阅读
相关标签
  

闽ICP备14008679号