yayan 9 місяців тому
батько
коміт
c19b6f891c

+ 1 - 0
.idea/gradle.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 6 - 1
build.gradle

@@ -6,7 +6,12 @@ plugins {
 }
 
 group = 'io.nexilis'
-version = '1.0.2'
+version = '1.0.20'
+
+compileJava {
+    sourceCompatibility = '1.8'
+    targetCompatibility = '1.8'
+}
 
 repositories {
     mavenCentral()

+ 21 - 21
src/main/java/io/nexilis/StreamShieldPlugin.java

@@ -1,12 +1,12 @@
 package io.nexilis;
 
 import io.nexilis.transformer.InjectProtectionTask;
-import io.nexilis.transformer.LibraryInjector;
 import io.nexilis.util.Util;
 import org.gradle.api.Plugin;
 import org.gradle.api.Project;
 
-import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
 
 public class StreamShieldPlugin implements Plugin<Project> {
     @Override
@@ -22,32 +22,32 @@ public class StreamShieldPlugin implements Plugin<Project> {
                 InjectProtectionTask injectTask = (InjectProtectionTask) project.getTasks().named("injectProtection").get();
                 if (task.getName().equals("preBuild")) {
                     task.doLast(t -> {
-                        File file = project.file(Util.findMainActivity(evaluatedProject.getProjectDir().toString()));
-                        System.out.println(">>>>> " + file);
-                        injectTask.getInputDir().set(file);
+                        Path path = Util.findMainActivity(evaluatedProject.getProjectDir().toString());
+                        injectTask.getInputDir().set(path.toFile());
+                    });
+                }
+                if (task.getName().matches("compileDebugJavaWithJavac|compileReleaseJavaWithJavac")) {
+                    task.doLast(t -> {
+                        try {
+                            injectTask.injectProtection();
+                            System.out.print("> Task :" + evaluatedProject.getName() + ":injectProtection");
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }
                     });
                 }
 //                if (task.getName().equals("compileDebugJavaWithJavac")) {
-//                    task.doLast(t -> {
-//                        try {
-//                            injectTask.injectProtection();
+//                    task.doLast(it -> {
+//                        File file = injectTask.getInputDir().getAsFile().get();
+//                        if (file.exists()) {
+//                            String fileName = file.getName().replaceAll(".java", ".class");
+//                            LibraryInjector.inject();
 //                            System.out.print("> Task :" + evaluatedProject.getName() + ":injectProtection");
-//                        } catch (IOException e) {
-//                            throw new RuntimeException(e);
+//                        } else {
+//                            System.out.println("MainApplication.class not found!");
 //                        }
 //                    });
 //                }
-                if (task.getName().equals("compileDebugJavaWithJavac")) {
-                    task.doLast(it -> {
-                        File application = injectTask.getInputDir().getAsFile().get();
-                        if (application.exists()) {
-                            LibraryInjector.inject(application.getAbsolutePath());
-                            System.out.print("> Task :" + evaluatedProject.getName() + ":injectProtection");
-                        } else {
-                            System.out.println("MainApplication.class not found!");
-                        }
-                    });
-                }
             });
         });
     }

+ 1 - 1
src/main/java/io/nexilis/Debug.java → src/main/java/io/nexilis/debug/Debug.java

@@ -1,4 +1,4 @@
-package io.nexilis;
+package io.nexilis.debug;
 
 import org.gradle.api.Project;
 

+ 10 - 4
src/main/java/io/nexilis/transformer/LibraryInjector.java → src/main/java/io/nexilis/debug/LibraryInjector.java

@@ -1,24 +1,30 @@
-package io.nexilis.transformer;
+package io.nexilis.debug;
 
+import io.nexilis.transformer.ProtectionInjector;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
 
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 
 public class LibraryInjector {
 
+    public static void main(String[] args) {
+        inject("C:\\Users\\yayan\\IdeaProjects\\streamshield\\build\\classes\\java\\main\\io\\nexilis\\debug\\MainActivity.class");
+    }
+
     public static void inject(String input) {
         try {
-            ClassReader classReader = new ClassReader(new FileInputStream(input));
+            ClassReader classReader = new ClassReader(Files.newInputStream(Paths.get(input)));
             ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
             ClassVisitor classVisitor = new ProtectionInjector(classWriter);
             classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
 
             byte[] modifiedClass = classWriter.toByteArray();
-            try (FileOutputStream fileOutputStream = new FileOutputStream(input)) {
+            try (FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\yayan\\IdeaProjects\\streamshield\\build\\classes\\java\\main\\io\\nexilis\\debug\\MainActivity-mod.class")) {
                 fileOutputStream.write(modifiedClass);
             }
         } catch (IOException e) {

+ 8 - 0
src/main/java/io/nexilis/debug/MainActivity.java

@@ -0,0 +1,8 @@
+package io.nexilis.debug;
+
+public class MainActivity {
+
+    protected void onCreate() {
+        System.out.println();
+    }
+}

+ 6 - 0
src/main/java/io/nexilis/service/Callback.java

@@ -0,0 +1,6 @@
+package io.nexilis.service;
+
+public interface Callback {
+    void onSuccess(String s);
+    void onFailed(String s);
+}

+ 3 - 2
src/main/java/io/nexilis/transformer/InjectProtectionTask.java

@@ -34,8 +34,9 @@ public class InjectProtectionTask extends DefaultTask {
     @TaskAction
     public void injectProtection() throws IOException {
         Path inputPath = inputDir.getAsFile().get().toPath();
-        try (Stream<Path> stream = Files.walk(inputPath)) {
-            stream.filter(path -> path.toString().endsWith(".class"))
+        String fileName = inputPath.getFileName().toString();
+        try (Stream<Path> stream = Files.walk(getProject().getLayout().getBuildDirectory().get().getAsFile().toPath())) {
+            stream.filter(path -> path.toString().endsWith(fileName.replace(".java",".class")))
                     .forEach(classFile -> {
                         try {
                             injectProtectionIntoClass(classFile);

+ 0 - 4
src/main/java/io/nexilis/transformer/MainActivity.java

@@ -1,4 +0,0 @@
-package io.nexilis.transformer;
-
-public class MainActivity {
-}

+ 39 - 6
src/main/java/io/nexilis/transformer/ProtectionInjector.java

@@ -13,7 +13,43 @@ public class ProtectionInjector extends ClassVisitor {
 
     @Override
     public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
-        super.visit(version, access, name, signature, superName, interfaces);
+        String[] newInterfaces = append(interfaces, "io/nexilis/service/Callback");
+        super.visit(version, access, name, signature, superName, newInterfaces);
+    }
+
+    @Override
+    public void visitEnd() {
+        MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "onSuccess", "()V", null, null);
+        if (mv != null) {
+            mv.visitCode();
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "io/security/streamshield/SecurityShield", "getInstance", "()Lio/security/streamshield/SecurityShield;", false);
+            mv.visitInsn(Opcodes.DUP);
+            mv.visitLdcInsn("gow3");
+            mv.visitLdcInsn("8B0449EA6ECD9C67EAD8A4C5AA716A0ECE803F28A4082E61D3F6DB488D1C185C");
+            mv.visitVarInsn(Opcodes.ALOAD, 0);
+            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/security/streamshield/SecurityShield", "check", "(Ljava/lang/String;Ljava/lang/String;Landroid/app/Activity;)V", false);
+            mv.visitInsn(Opcodes.RETURN);
+            mv.visitMaxs(1, 1);
+            mv.visitEnd();
+        }
+        mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "onFailed", "()V", null, null);
+        if (mv != null) {
+            mv.visitCode();
+            mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+            mv.visitLdcInsn("onFailed");
+            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+            mv.visitInsn(Opcodes.RETURN);
+            mv.visitMaxs(2, 2);
+            mv.visitEnd();
+        }
+        super.visitEnd();
+    }
+
+    private String[] append(String[] arr, String element) {
+        String[] newArr = new String[arr.length + 1];
+        System.arraycopy(arr, 0, newArr, 0, arr.length);
+        newArr[arr.length] = element;
+        return newArr;
     }
 
     @Override
@@ -39,14 +75,11 @@ public class ProtectionInjector extends ClassVisitor {
         @Override
         protected void onMethodExit(int opcode) {
             super.onMethodExit(opcode);
-//            mv.visitVarInsn(ALOAD, 0);
-//            mv.visitMethodInsn(INVOKESTATIC, "com/example/security/DetectionLibrary", "initialize", "(Landroid/content/Context;)V", false);
-
-            mv.visitMethodInsn(INVOKESTATIC, "io/security/streamshield/SecurityShield", "getInstance", "()Lio/security/streamshield/SecurityShield;", false);
             mv.visitLdcInsn("gow3");
             mv.visitLdcInsn("8B0449EA6ECD9C67EAD8A4C5AA716A0ECE803F28A4082E61D3F6DB488D1C185C");
             mv.visitVarInsn(ALOAD, 0);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "io/security/streamshield/SecurityShield", "check", "(Ljava/lang/String;Ljava/lang/String;Landroid/app/Activity;)V", false);
+            mv.visitVarInsn(ALOAD, 0);
+            mv.visitMethodInsn(INVOKESTATIC, "io/nexilis/service/API", "connect", "(Ljava/lang/String;Ljava/lang/String;Landroid/app/Activity;Lio/nexilis/service/Callback;)V", false);
         }
     }
 }

+ 1 - 3
src/main/java/io/nexilis/util/Util.java

@@ -18,7 +18,6 @@ public class Util {
         try {
             long t0 = System.currentTimeMillis();
             String mainActivity = findMainOnManifest(dir);
-            System.out.println("Task > findMainOnManifest " + (System.currentTimeMillis() - t0) + " ms");
             Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
                 @Override
                 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
@@ -43,8 +42,7 @@ public class Util {
                     if (file.getFileName().toString().equals("AndroidManifest.xml")) {
                         try {
                             long t0 = System.currentTimeMillis();
-                            String main = XmlParser.getMainActivity(new FileInputStream(file.toFile()));
-                            System.out.println("Task > getMainActivity " + (System.currentTimeMillis() - t0) + " ms");
+                            String main = XmlParser.getMainActivity(Files.newInputStream(file));
                             if (!main.isEmpty()) {
                                 path[0] = main;
                                 return FileVisitResult.TERMINATE;

+ 3 - 2
src/main/java/io/nexilis/util/XmlParser.java

@@ -10,6 +10,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
@@ -24,10 +25,10 @@ public class XmlParser {
         }
     }
 
-    public static String getMainActivity(FileInputStream fileInputStream) throws ParserConfigurationException, IOException, SAXException {
+    public static String getMainActivity(InputStream inputStream) throws ParserConfigurationException, IOException, SAXException {
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
-        Document doc = dBuilder.parse(fileInputStream);
+        Document doc = dBuilder.parse(inputStream);
         doc.getDocumentElement().normalize();
         NodeList activity = doc.getElementsByTagName("activity");
         String main = "";