当前位置:   article > 正文

使用360加固宝命令行方式加固_java11 360加固

java11 360加固

使用360加固宝命令行方式加固

将360加固宝安装程序下载之后,解压,然后通过winodws 的dos命令来调用360加固程序,完成登录,设置,加固应用的操作。

优点:可以使用程序控制加固工作,将生成的release包在java工程中进行加固,签名,生成多渠道包等工作,不再使用客户端手动加固应用,防止出错,方便快捷。而且可以将我们创建的一个Release包在java工程中完成一系列操作,直致生成多渠道包。可谓是一键完成线上多个渠道包的创建,不再依赖手动选择加固,签名等,大大节约了我们的时间。

 

360加固宝官网: http://jiagu.360.cn/#/global/index

步骤一:下载加固宝应用,并解压,如下图。

解压后是一个360jiagubao_windows_64文件夹,进入jiagu文件夹如下图。请注意下面两个红框的文件。help.txt和jiagu.jar

 

 

help.txt文件内容如下

    -login <username>             首次使用必须先登录 <360用户名>

        <password>                <登录密码>

    -importsign <keystore_path>         导入签名信息 <密钥路径>

        <keystore_password>             <密钥密码>

        <alias>                 <别名>

        <alias_password>            <别名密码>

    -importmulpkg <mulpkg_filepath>        导入多渠道配置信息,txt格式

    -showsign                查看已配置的签名信息

    -showmulpkg                查看已配置的多渠道信息

    -help                    显示帮助信息

    -config                 配置加固可选项

    ----------------------可选增强服务-------------------------------

        [-crashlog]                【崩溃日志分析】

        [-x86]                    【x86支持】

        [-analyse]                【加固数据分析】

        [-nocert]                【跳过签名校验】

    ----------------------高级加固选项-------------------------------

        [-vmp]                    【全VMP保护】

        [-data]                    【本地数据文件保护】

        [-assets]                【资源文件保护】

        [-filecheck]                【文件完整性校验】

        [-ptrace]                【Ptrace防注入】

        [-so]                    【SO文件保护】

        [-dex2c]                【dex2C保护】

        [-string_obfus]                【字符串加密】

        [-dex_shadow]                【DexShadow】

        [-so_private]                【SO防盗用】

    -----------------------------------------------------------------

    -config_so            配置需要加固的SO文件,以空格分隔

    -config_assets            配置需要忽略的资源文件,以空格分隔

    -config_so_private        配置防盗用的SO文件,以空格分隔

    

    -showconfig                显示已配置加固项

    -version                显示当前版本号

    -update                    升级到最新版本

    -jiagu <inputAPKpath>             加固命令 <APK路径>

        <outputPath>                 <输出路径>

        [-autosign]                 【自动签名】

        [-automulpkg]                 【自动多渠道】

        [-pkgparam mulpkg_filepath]        【自定义文件生成多渠道】

 

 

步骤二: 在windows环境下执行dos命令

2.1 :进入该目录下

 

 

 

2.2 执行登录命令  :  java -jar jiagu.jar -login 用户名 密码 

登录成功会返回 login success字符串。

 

2.3 配置

登录成功后可设置360加固宝。设置一次后,可不再修改,设置保存至本地的。也可以登录客户端手动设置,都是一样的。、

个人建议不使用它的“启用自动签名”和 使用“跳过签名校验”功能。

 

2.4 加固apk

执行加固命令: java -jar jiagu.jar -jiagu input\input.apk output

java -jar jiagu.jar -jiagu 要加固的apk文件路径 输出apk路径

注:我使用的是相对路径, 也可以使用绝对路径。

        输出的文件名规则为 源文件名 + “_版本号_” + "jiagu.apk" .如上加固输出文件为 input_6130_jiagu.apk , 其源文件为input.apk

 

 

使用程序进行加固。

加固先开始上传(上传至360加固服务器那边,应该是这样的)

 

上传完成开始加固

 

加固完成。即加固程序运行结束

 

 

三、使用脚本工具进行加固

脚本工具下载地址:https://download.csdn.net/download/liuyu0915/11197032

实现功能:

脚本加固apk工具,可以通过该工具批量加固apk,  并支持加固api,加固apk不再需要手动操作加固客户端。内部封装的是360加固宝工具。该工具可以与签名、生成渠道包工具组合起来,达到一键生成线上渠道包的功能(studio生成release包,使用该工具加固,再调用程序进行签名,最后通过创建渠道包工具生成对应的渠道包,整个流程不需要手动操作,使用简单稳定。)。
准备工作:在360加固宝官网上下载360加固宝程序并解压,找到jiagu.jar文件,并记录它的路径。360加固宝下载地址

 

 

使用方法:


命令行方式: java -jar 360jiagu.jar kaixin -login 360加固宝用户名 360加固宝登录密码  -input input.apk -output 输出apk路径 -jiaguJar 360加固宝中jiagu.jar的路径

示例:java -jar 360jiagu.jar kaixin -login 153****8060  mima -input C:\Users\ttkx\Desktop\input.apk -output f:\ouput -jiaguJar D:\github_\AutoCreateApk\jiagu\jiagu.jar


API调用方式: 直接调用360jiagu.jar中的api .

调用方法:  JiaGuMain.runJiaGu(JiaGuConfig config).    JiaGuConfig类中设置登录用户名和密码,输入apk和加固完成后输出路径,还需要传360加宝程序解压后jiagu.jar的路径。

  1. JiaGuConfig config = JiaGuConfig.build()
  2. .setJarFile(new File("....\jiagu.jar"))
  3. .login("用户名****", "密码****")
  4. .addInputApkPath(getInputApkPath("htg_input.apk"))
  5. .addInputApkPath(getInputApkPath("app-anzhi_oas-debug.apk"))
  6. .outputPath(mOutputPath);
  7. JiaGuMain.runJiaGu(config);

备注:该工具没有设置360加固宝相关设置的功能,如果需要修改加固宝默认设置,可以打开客户端手动设置后关闭再使用该工具进行加固,设置一次之后就不用再设置了。建议大家不使用360加固宝的自动签名和签名校验功能。

 

 

 

四、脚本工具源码解析

 

目的: 用程序调用加固apk, 与后续签名和生成多渠道包功能连贯至一起。实现一键生成多渠道线上包的功能。

创建java工程, 然后使用java api执行windows 的dos命令,调用360加固宝程序 。最终实现加固apk.

步骤一 : 创建java工程 或是java lib 工程。

步骤二: 将360加固宝解压文件入至工程中(方便管理)。

我的目录结构如下:

 

步骤三: 使用java api 调用dos命令,执行加固程序

3.1 设置登录用户名和密码 , 输入文件路径 和 输出文件夹路径

3.4 检查是否登录完成 。 

检查返回的字符串是否包含login success 字符串即可。

3.5检查加固是否完成

检查返回字符串是否包含 “已加固”。

备注: dos命令在程序中执行是在当前线程,当加固程序完成之后才会走下一行代码。所以当加固程序走完的时候,就能够在输出文件夹内找到对应的已加固apk文件。本人dos命令玩的太差,上面检查360加固登录和加固状态的代码写的稀烂,对返回的字符串处理很low,欢迎大神指点。

上述三的思想是创建java工程,然后调用360加固宝工具进行加固。我对其进行了二次封装。

源码

 

  1. package com.kaixin.jiagu360;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.StringReader;
  7. import java.nio.charset.Charset;
  8. import java.util.Arrays;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class JiaGuMain {
  13. public static final String JAR_NAME = "jiagu.jar";
  14. public JiaGuMain() {
  15. }
  16. public static void main(String[] args) {
  17. String cmd = args[0];
  18. String[] params = (String[])Arrays.copyOfRange(args, 1, args.length);
  19. try {
  20. if ("kaixin".equals(cmd)) {
  21. disposeArgs(params);
  22. } else {
  23. System.err.println("请输入kaixin,不要问为什么,因为这是我写的。。。哈哈");
  24. }
  25. } catch (Exception var4) {
  26. System.err.println("Error: " + var4.getMessage());
  27. }
  28. }
  29. //处理输入参数
  30. private static void disposeArgs(String[] params) {
  31. if (params.length == 0) {
  32. error("未发现有效参数");
  33. } else {
  34. JiaGuConfig config = JiaGuConfig.build();
  35. Options options = new Options(params);
  36. Map<String, List<String>> paramMap = options.builder();
  37. List<String> loginList = (List)paramMap.get("-login");
  38. if (loginList != null && loginList.size() == 2) {
  39. String userName = (String)loginList.get(0);
  40. String password = (String)loginList.get(1);
  41. config.login(userName, password);
  42. } else {
  43. error("登录参数未发现或不合法");
  44. }
  45. List<String> inputApkList = (List)paramMap.get("-input");
  46. String inputApkPath;
  47. if (inputApkList != null && inputApkList.size() > 0) {
  48. Iterator var11 = inputApkList.iterator();
  49. label55:
  50. while(true) {
  51. while(true) {
  52. if (!var11.hasNext()) {
  53. break label55;
  54. }
  55. inputApkPath = (String)var11.next();
  56. File file = new File(inputApkPath);
  57. if (file.exists() && file.isFile() && file.getName().endsWith(".apk")) {
  58. config.addInputApkPath(inputApkPath);
  59. } else {
  60. error("输入待加固apk路径不合法: " + inputApkPath);
  61. }
  62. }
  63. }
  64. } else {
  65. error("未发现有效的待加固apk");
  66. }
  67. List<String> outputDirList = (List)paramMap.get("-output");
  68. if (outputDirList != null && outputDirList.size() > 0) {
  69. inputApkPath = (String)outputDirList.get(0);
  70. config.outputPath(inputApkPath);
  71. } else {
  72. error("未发现输出apk路径");
  73. }
  74. List<String> jarList = (List)paramMap.get("-jiaguJar");
  75. if (jarList != null && jarList.size() > 0) {
  76. String jarPath = (String)jarList.get(0);
  77. File file = new File(jarPath);
  78. if (file.exists() && file.isFile() && "jiagu.jar".equals(file.getName())) {
  79. config.setJarFile(file);
  80. }
  81. }
  82. checkJiaguJar(config);
  83. runJiaGu(config);
  84. }
  85. }
  86. private static void checkJiaguJar(JiaGuConfig config) {
  87. File jarFile = config.getJarFile();
  88. if (jarFile == null || !jarFile.exists()) {
  89. jarFile = FileHelper.searchFile(new File((new File("")).getAbsolutePath()), "jiagu.jar");
  90. config.setJarFile(jarFile);
  91. }
  92. if (jarFile == null || !jarFile.exists() || !jarFile.isFile() || !"jiagu.jar".equals(jarFile.getName())) {
  93. error("未发现加固工具jiagu.jar");
  94. }
  95. }
  96. private static void error(String content) {
  97. if (content != null) {
  98. System.err.println(content);
  99. }
  100. }
  101. public static BufferedReader runCmd(String command) {
  102. Runtime runtime = Runtime.getRuntime();
  103. try {
  104. File jarFile = JiaGuConfig.build().getJarFile();
  105. if (jarFile != null && jarFile.isFile()) {
  106. Process process = runtime.exec(command, (String[])null, jarFile.getParentFile());
  107. return new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
  108. } else {
  109. error("未发现jiagu.jar文件");
  110. return null;
  111. }
  112. } catch (IOException var4) {
  113. var4.printStackTrace();
  114. return new BufferedReader(new StringReader(var4.getMessage()));
  115. }
  116. }
  117. public static boolean runJiaGu(JiaGuConfig config) {
  118. if (config != null && config.getInputApkPath().size() > 0) {
  119. checkJiaguJar(config);//检查360加固工具是否存在,如果不存在,在当前项目目录下搜索
  120. boolean login_success = login360JiaGu(config);
  121. if (login_success) {
  122. System.out.print("加固中。。。。\n");
  123. FileHelper.createNewDir(JiaGuConfig.getConfig().getOutputPath());
  124. List<String> inputApkPathList = config.getInputApkPath();
  125. Iterator var3 = inputApkPathList.iterator();
  126. while(var3.hasNext()) {
  127. String inputApkPath = (String)var3.next();
  128. jiaGuOneApk(inputApkPath, config.getOutputPath());
  129. System.out.print("360加固完成输出路径:" + config.getOutputPath());
  130. }
  131. return true;
  132. }
  133. error("360加固宝登录不成功");
  134. }
  135. return false;
  136. }
  137. public static boolean jiaGuOneApk(String inputApkPath, String outputPath) {
  138. String jarUtils = "java -jar jiagu.jar";
  139. String command2 = jarUtils + " -jiagu " + inputApkPath + " " + outputPath;
  140. BufferedReader bf = runCmd(command2);
  141. String bf2Str = getBF2Str(bf);
  142. System.out.print(bf2Str);
  143. return true;
  144. }
  145. public static boolean login360JiaGu(JiaGuConfig config) {
  146. String jarUtils = "java -jar jiagu.jar";
  147. String command1 = jarUtils + " -login " + config.getUserName() + " " + config.getPassword();
  148. BufferedReader bufferedReader = runCmd(command1);
  149. boolean login_success = checkResultInfo(bufferedReader, "login success");
  150. return login_success;
  151. }
  152. public static String getBF2Str(BufferedReader bf) {
  153. if (bf != null) {
  154. String line = null;
  155. StringBuilder sb = new StringBuilder();
  156. try {
  157. while((line = bf.readLine()) != null) {
  158. sb.append(line + "\n");
  159. }
  160. return sb.toString();
  161. } catch (Exception var4) {
  162. var4.getMessage();
  163. }
  164. }
  165. return "";
  166. }
  167. public static boolean checkResultInfo(BufferedReader bufferedReader, String tag) {
  168. if (bufferedReader != null) {
  169. String line = null;
  170. StringBuilder sb = new StringBuilder();
  171. try {
  172. while((line = bufferedReader.readLine()) != null) {
  173. sb.append(line + "\n");
  174. if (line.contains(tag)) {
  175. System.out.println(line + "\n");
  176. return true;
  177. }
  178. }
  179. } catch (Exception var5) {
  180. ;
  181. }
  182. }
  183. return false;
  184. }
  185. }
  1. package com.kaixin.jiagu360;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. public class Options {
  7. private final String[] mParams;
  8. public Options(String[] params) {
  9. this.mParams = (String[])params.clone();
  10. }
  11. public Map<String, List<String>> builder() {
  12. Map<String, List<String>> map = new HashMap();
  13. if (this.mParams != null) {
  14. int length = this.mParams.length;
  15. List<String> list = null;
  16. for(int i = 0; i < length; ++i) {
  17. String param = this.mParams[i];
  18. if (param != null && param.length() > 0) {
  19. if (param.startsWith("-")) {
  20. list = this.getList(map, param);
  21. } else if (list != null) {
  22. list.add(param);
  23. }
  24. }
  25. }
  26. }
  27. return map;
  28. }
  29. private List<String> getList(Map<String, List<String>> map, String key) {
  30. if (map.get(key) == null) {
  31. map.put(key, new ArrayList());
  32. }
  33. return (List)map.get(key);
  34. }
  35. }
  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5. package com.kaixin.jiagu360;
  6. import java.io.File;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class JiaGuConfig {
  10. private static JiaGuConfig mConfig;
  11. private List<String> mInputApkPathList = new ArrayList();
  12. private String mOutputPath;
  13. private String mUserName;
  14. private String mPassword;
  15. private File mJarFile;
  16. public static synchronized JiaGuConfig build() {
  17. if (mConfig == null) {
  18. mConfig = new JiaGuConfig();
  19. }
  20. return mConfig;
  21. }
  22. private JiaGuConfig() {
  23. }
  24. public JiaGuConfig addInputApkPath(String inputApkPath) {
  25. this.mInputApkPathList.add(inputApkPath);
  26. return this;
  27. }
  28. public JiaGuConfig outputPath(String outputPath) {
  29. this.mOutputPath = outputPath;
  30. return this;
  31. }
  32. public JiaGuConfig login(String userName, String password) {
  33. this.mUserName = userName;
  34. this.mPassword = password;
  35. return this;
  36. }
  37. public static JiaGuConfig getConfig() {
  38. return mConfig;
  39. }
  40. public List<String> getInputApkPath() {
  41. return this.mInputApkPathList;
  42. }
  43. public String getOutputPath() {
  44. return this.mOutputPath;
  45. }
  46. public String getUserName() {
  47. return this.mUserName;
  48. }
  49. public String getPassword() {
  50. return this.mPassword;
  51. }
  52. public File getJarFile() {
  53. return this.mJarFile;
  54. }
  55. public JiaGuConfig setJarFile(File mJarFile) {
  56. this.mJarFile = mJarFile;
  57. return this;
  58. }
  59. public JiaGuConfig setInputApkPathList(List<String> inputApkPathList) {
  60. this.mInputApkPathList = inputApkPathList;
  61. return this;
  62. }
  63. }

 

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5. package com.kaixin.jiagu360;
  6. import java.io.File;
  7. public class FileHelper {
  8. public FileHelper() {
  9. }
  10. public static void deleteAllFiles(File root) {
  11. if (root != null) {
  12. File[] files = root.listFiles();
  13. if (files != null) {
  14. File[] var2 = files;
  15. int var3 = files.length;
  16. for(int var4 = 0; var4 < var3; ++var4) {
  17. File f = var2[var4];
  18. if (f.isDirectory()) {
  19. deleteAllFiles(f);
  20. try {
  21. f.delete();
  22. } catch (Exception var8) {
  23. ;
  24. }
  25. } else if (f.exists()) {
  26. deleteAllFiles(f);
  27. try {
  28. f.delete();
  29. } catch (Exception var7) {
  30. ;
  31. }
  32. }
  33. }
  34. }
  35. root.delete();
  36. }
  37. }
  38. public static void deleteAllSonFiles(File root) {
  39. if (root != null) {
  40. File[] files = root.listFiles();
  41. if (files != null) {
  42. File[] var2 = files;
  43. int var3 = files.length;
  44. for(int var4 = 0; var4 < var3; ++var4) {
  45. File f = var2[var4];
  46. if (f.isDirectory()) {
  47. deleteAllFiles(f);
  48. try {
  49. f.delete();
  50. } catch (Exception var8) {
  51. ;
  52. }
  53. } else if (f.exists()) {
  54. deleteAllFiles(f);
  55. try {
  56. f.delete();
  57. } catch (Exception var7) {
  58. ;
  59. }
  60. }
  61. }
  62. }
  63. }
  64. }
  65. public static boolean createNewDir(String dirPath) {
  66. return dirPath != null && dirPath.length() > 0 ? createNewDir(new File(dirPath)) : false;
  67. }
  68. public static boolean createNewDir(File file) {
  69. if (file != null) {
  70. if (file.exists()) {
  71. deleteAllFiles(file);
  72. return file.mkdirs();
  73. } else {
  74. return file.mkdirs();
  75. }
  76. } else {
  77. return false;
  78. }
  79. }
  80. public static File searchFile(File file, String fileName) {
  81. if (file != null && file.exists() && fileName != null && fileName.length() > 0) {
  82. if (file.isFile() && fileName.equals(file.getName())) {
  83. return file;
  84. }
  85. if (file.isDirectory()) {
  86. File[] var2 = file.listFiles();
  87. int var3 = var2.length;
  88. for(int var4 = 0; var4 < var3; ++var4) {
  89. File sonFile = var2[var4];
  90. String absolutePath1 = sonFile.getAbsolutePath();
  91. if (sonFile.isFile()) {
  92. if (fileName.equals(sonFile.getName())) {
  93. return sonFile;
  94. }
  95. } else if (sonFile.isDirectory()) {
  96. File resultFile = searchFile(sonFile, fileName);
  97. if (resultFile != null && resultFile.isFile() && fileName.equals(resultFile.getName())) {
  98. return resultFile;
  99. }
  100. }
  101. }
  102. }
  103. }
  104. return null;
  105. }
  106. }

 

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

闽ICP备14008679号