Compare commits
3 commits
dddbcd17b7
...
1d55be1853
Author | SHA1 | Date | |
---|---|---|---|
|
1d55be1853 | ||
|
3f5bf8226b | ||
|
cd6bf3fcbc |
9 changed files with 2094 additions and 852 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
#import "@preview/diagraph:0.3.5": render
|
||||||
|
|
||||||
#import "../lib.typ": SDK, num, mypercent, ART, ie, APKs, API,
|
#import "../lib.typ": SDK, num, mypercent, ART, ie, APKs, API,
|
||||||
#import "../lib.typ": todo, jfl-note
|
#import "../lib.typ": todo, jfl-note
|
||||||
#import "X_var.typ": *
|
#import "X_var.typ": *
|
||||||
|
@ -188,10 +190,10 @@ public class Main {
|
||||||
}
|
}
|
||||||
```,
|
```,
|
||||||
caption: [Code of the main class of the application showed by Jadx, before patching],
|
caption: [Code of the main class of the application showed by Jadx, before patching],
|
||||||
)<fig:th-demo-before>
|
)<lst:th-demo-before>
|
||||||
|
|
||||||
A first analysis of the contant of the application shows that the application contains one `Activity` that instanciate the class `Main` and call `Main.main()`.
|
A first analysis of the contant of the application shows that the application contains one `Activity` that instanciate the class `Main` and call `Main.main()`.
|
||||||
@fig:th-demo-before shows the most of the code of `Main` as returned by Jadx.
|
@lst:th-demo-before shows the most of the code of `Main` as returned by Jadx.
|
||||||
We can see that the class contains another #DEX file encoded in base 64 and loaded in the `InMemoryDexClassLoader` `cl`.
|
We can see that the class contains another #DEX file encoded in base 64 and loaded in the `InMemoryDexClassLoader` `cl`.
|
||||||
A class is then loaded from this class loader, and two methods from this class loader are called.
|
A class is then loaded from this class loader, and two methods from this class loader are called.
|
||||||
The names of this class and methods are not directly accessible as they have been chipĥered and are decoded just before beeing used at runtime.
|
The names of this class and methods are not directly accessible as they have been chipĥered and are decoded just before beeing used at runtime.
|
||||||
|
@ -203,7 +205,7 @@ This is not particularly surprising considering the obfusctation methods used.
|
||||||
|
|
||||||
Then we run the dynamic analysis we described in @sec:th-dyn on the application and apply the transformation described in @sec:th-trans to add the dynamic informations to it.
|
Then we run the dynamic analysis we described in @sec:th-dyn on the application and apply the transformation described in @sec:th-trans to add the dynamic informations to it.
|
||||||
This time, Flowdroid compute a larger callgraph of 76 edges, and does find a data leak.
|
This time, Flowdroid compute a larger callgraph of 76 edges, and does find a data leak.
|
||||||
Indeed, when looking at the new application with Jadx, we notice a new class `Malicious`, and the code of `Main.main()` is now as shown in @fig:th-demo-after:
|
Indeed, when looking at the new application with Jadx, we notice a new class `Malicious`, and the code of `Main.main()` is now as shown in @lst:th-demo-after:
|
||||||
the method called in the loop is either `Malicious.get_data`, `Malicious.send_data()` or `Method.invoke()`.
|
the method called in the loop is either `Malicious.get_data`, `Malicious.send_data()` or `Method.invoke()`.
|
||||||
Although self explanatory, verifying the code of those methods indeed confirm that `get_data()` calls `Utils.source()` and `send_data()` calls `Utils.sink()`.
|
Although self explanatory, verifying the code of those methods indeed confirm that `get_data()` calls `Utils.source()` and `send_data()` calls `Utils.sink()`.
|
||||||
|
|
||||||
|
@ -225,7 +227,30 @@ Although self explanatory, verifying the code of those methods indeed confirm th
|
||||||
}
|
}
|
||||||
```,
|
```,
|
||||||
caption: [Code of `Main.main()` showed by Jadx, after patching],
|
caption: [Code of `Main.main()` showed by Jadx, after patching],
|
||||||
)<fig:th-demo-after>
|
)<lst:th-demo-after>
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
render(
|
||||||
|
read("figs/demo_main_main.dot"),
|
||||||
|
width: 100%,
|
||||||
|
alt: (
|
||||||
|
"",
|
||||||
|
).join(),
|
||||||
|
),
|
||||||
|
caption: [Call Graph of `Main.main()` view by Androguard before patching],
|
||||||
|
) <fig:th-cg-before>
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
render(
|
||||||
|
read("figs/patched_main_main.dot"),
|
||||||
|
width: 100%,
|
||||||
|
alt: (
|
||||||
|
"",
|
||||||
|
).join(),
|
||||||
|
),
|
||||||
|
caption: [Call Graph of `Main.main()` view by Androguard after patching],
|
||||||
|
) <fig:th-cg-after>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#todo[androgard call graph]
|
#todo[androgard call graph]
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 96 KiB |
228
5_theseus/figs/demo_main_main.dot
Normal file
228
5_theseus/figs/demo_main_main.dot
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
strict digraph "" {
|
||||||
|
#"Main-><init>(Activity)V" [accessflags="public constructor",
|
||||||
|
# classname="Main",
|
||||||
|
# descriptor="(Activity)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Class->getClassLoader()ClassLoader" [classname="Class",
|
||||||
|
# descriptor="()ClassLoader",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getClassLoader];
|
||||||
|
#"Main-><init>(Activity)V" -> "Class->getClassLoader()ClassLoader";
|
||||||
|
#"String->getBytes()[B" [classname="String",
|
||||||
|
# descriptor="()[B",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getBytes];
|
||||||
|
#"Main-><init>(Activity)V" -> "String->getBytes()[B";
|
||||||
|
#"ByteBuffer->wrap([B)ByteBuffer" [classname="ByteBuffer",
|
||||||
|
# descriptor="([B)ByteBuffer",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=wrap];
|
||||||
|
#"Main-><init>(Activity)V" -> "ByteBuffer->wrap([B)ByteBuffer";
|
||||||
|
#"SecretKeySpec-><init>([B String)V" [classname="SecretKeySpec",
|
||||||
|
# descriptor="([B String)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "SecretKeySpec-><init>([B String)V";
|
||||||
|
#"InMemoryDexClassLoader-><init>(ByteBuffer ClassLoader)V" [classname="InMemoryDexClassLoader",
|
||||||
|
# descriptor="(ByteBuffer ClassLoader)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "InMemoryDexClassLoader-><init>(ByteBuffer ClassLoader)V";
|
||||||
|
#"Object-><init>()V" [classname="Object",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "Object-><init>()V";
|
||||||
|
"Base64->decode(String I)[B" [classname="Base64",
|
||||||
|
descriptor="(String I)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=decode];
|
||||||
|
#"Main-><init>(Activity)V" -> "Base64->decode(String I)[B";
|
||||||
|
"Main->decrypt(String)String" [accessflags=public,
|
||||||
|
classname="Main",
|
||||||
|
descriptor="(String)String",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=decrypt];
|
||||||
|
"Main->decrypt(String)String" -> "Base64->decode(String I)[B";
|
||||||
|
"Cipher->init(I Key)V" [classname="Cipher",
|
||||||
|
descriptor="(I Key)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=init];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->init(I Key)V";
|
||||||
|
"Cipher->doFinal([B)[B" [classname="Cipher",
|
||||||
|
descriptor="([B)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=doFinal];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->doFinal([B)[B";
|
||||||
|
"Cipher->getInstance(String)Cipher" [classname="Cipher",
|
||||||
|
descriptor="(String)Cipher",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getInstance];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->getInstance(String)Cipher";
|
||||||
|
"String-><init>([B)V" [classname="String",
|
||||||
|
descriptor="([B)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Main->decrypt(String)String" -> "String-><init>([B)V";
|
||||||
|
#"Main->encrypt(String)String" [accessflags=public,
|
||||||
|
# classname="Main",
|
||||||
|
# descriptor="(String)String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=encrypt];
|
||||||
|
#"Main->encrypt(String)String" -> "String->getBytes()[B";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->init(I Key)V";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->doFinal([B)[B";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->getInstance(String)Cipher";
|
||||||
|
#"Base64->encodeToString([B I)String" [classname="Base64",
|
||||||
|
# descriptor="([B I)String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=encodeToString];
|
||||||
|
#"Main->encrypt(String)String" -> "Base64->encodeToString([B I)String";
|
||||||
|
"Main->main()V" [accessflags=public,
|
||||||
|
classname="Main",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=main];
|
||||||
|
"Main->main()V" -> "Main->decrypt(String)String";
|
||||||
|
"Method->invoke(Object [Object)Object" [classname="Method",
|
||||||
|
descriptor="(Object [Object)Object",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=invoke];
|
||||||
|
"Main->main()V" -> "Method->invoke(Object [Object)Object";
|
||||||
|
"ClassLoader->loadClass(String)Class" [classname="ClassLoader",
|
||||||
|
descriptor="(String)Class",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=loadClass];
|
||||||
|
"Main->main()V" -> "ClassLoader->loadClass(String)Class";
|
||||||
|
"Class->getMethod(String [Class)Method" [classname="Class",
|
||||||
|
descriptor="(String [Class)Method",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getMethod];
|
||||||
|
"Main->main()V" -> "Class->getMethod(String [Class)Method";
|
||||||
|
#"MainActivity-><init>()Vg" [accessflags="public constructor",
|
||||||
|
# classname="MainActivity",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Activity-><init>()V" [classname="Activity",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"MainActivity-><init>()Vg" -> "Activity-><init>()V";
|
||||||
|
#"MainActivity->onCreate(Bundle)V" [accessflags=protected,
|
||||||
|
# classname="MainActivity",
|
||||||
|
# descriptor="(Bundle)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=onCreate];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Main-><init>(Activity)V";
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Main->main()V";
|
||||||
|
#"Activity->onCreate(Bundle)V" [classname="Activity",
|
||||||
|
# descriptor="(Bundle)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=onCreate];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Activity->onCreate(Bundle)V";
|
||||||
|
#"Log->i(String String Throwable;)I" [classname="Log",
|
||||||
|
# descriptor="(String String Throwable;)I",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=i];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Log->i(String String Throwable;)I";
|
||||||
|
#"Utils-><init>()V" [accessflags="public constructor",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils-><init>()V" -> "Object-><init>()V";
|
||||||
|
#"Utils->popup(Activity String String)V" [accessflags="public static",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="(Activity String String)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=popup];
|
||||||
|
#"AlertDialog$Builder->setTitle(CharSequence)AlertDialog$Builder" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(CharSequence)AlertDialog$Builder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=setTitle];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->setTitle(CharSequence)AlertDialog$Builder";
|
||||||
|
#"AlertDialog$Builder-><init>(Context)V" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(Context)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder-><init>(Context)V";
|
||||||
|
#"AlertDialog$Builder->setMessage(CharSequence)AlertDialog$Builder" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(CharSequence)AlertDialog$Builder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=setMessage];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->setMessage(CharSequence)AlertDialog$Builder";
|
||||||
|
#"AlertDialog->show()V" [classname="AlertDialog",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=show];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog->show()V";
|
||||||
|
#"AlertDialog$Builder->create()AlertDialog" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="()AlertDialog",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=create];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->create()AlertDialog";
|
||||||
|
#"Utils->sink(Activity String)V" [accessflags="public static",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="(Activity String)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=sink];
|
||||||
|
#"Utils->sink(Activity String)V" -> "Utils->popup(Activity String String)V";
|
||||||
|
#"Utils->source(String)String" [accessflags="public static",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="(String)String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=source];
|
||||||
|
#"StringBuilder->append(String)StringBuilder" [classname="StringBuilder",
|
||||||
|
# descriptor="(String)StringBuilder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=append];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder->append(String)StringBuilder";
|
||||||
|
#"StringBuilder-><init>()V" [classname="StringBuilder",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder-><init>()V";
|
||||||
|
#"StringBuilder->toString()String" [classname="StringBuilder",
|
||||||
|
# descriptor="()String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=toString];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder->toString()String";
|
||||||
|
}
|
235
5_theseus/figs/demo_raw.dot
Normal file
235
5_theseus/figs/demo_raw.dot
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
strict digraph "" {
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Landroid/app/Activity;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;" [classname="Ljava/lang/Class;",
|
||||||
|
descriptor="()Ljava/lang/ClassLoader;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getClassLoader];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;";
|
||||||
|
"Ljava/lang/String;->getBytes()[B" [classname="Ljava/lang/String;",
|
||||||
|
descriptor="()[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getBytes];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ljava/lang/String;->getBytes()[B";
|
||||||
|
"Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;" [classname="Ljava/nio/ByteBuffer;",
|
||||||
|
descriptor="([B)Ljava/nio/ByteBuffer;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=wrap];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;";
|
||||||
|
"Ljavax/crypto/spec/SecretKeySpec;-><init>([B Ljava/lang/String;)V" [classname="Ljavax/crypto/spec/SecretKeySpec;",
|
||||||
|
descriptor="([B Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ljavax/crypto/spec/SecretKeySpec;-><init>([B Ljava/lang/String;)V";
|
||||||
|
"Ldalvik/system/InMemoryDexClassLoader;-><init>(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V" [classname="Ldalvik/system/InMemoryDexClassLoader;",
|
||||||
|
descriptor="(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ldalvik/system/InMemoryDexClassLoader;-><init>(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V";
|
||||||
|
"Ljava/lang/Object;-><init>()V" [classname="Ljava/lang/Object;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Ljava/lang/Object;-><init>()V";
|
||||||
|
"Landroid/util/Base64;->decode(Ljava/lang/String; I)[B" [classname="Landroid/util/Base64;",
|
||||||
|
descriptor="(Ljava/lang/String; I)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=decode];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c" -> "Landroid/util/Base64;->decode(Ljava/lang/String; I)[B";
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=decrypt];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" -> "Landroid/util/Base64;->decode(Ljava/lang/String; I)[B";
|
||||||
|
"Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="(I Ljava/security/Key;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=init];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" -> "Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V";
|
||||||
|
"Ljavax/crypto/Cipher;->doFinal([B)[B" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="([B)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=doFinal];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" -> "Ljavax/crypto/Cipher;->doFinal([B)[B";
|
||||||
|
"Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljavax/crypto/Cipher;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getInstance];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" -> "Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;";
|
||||||
|
"Ljava/lang/String;-><init>([B)V" [classname="Ljava/lang/String;",
|
||||||
|
descriptor="([B)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584" -> "Ljava/lang/String;-><init>([B)V";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=encrypt];
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" -> "Ljava/lang/String;->getBytes()[B";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" -> "Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" -> "Ljavax/crypto/Cipher;->doFinal([B)[B";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" -> "Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;";
|
||||||
|
"Landroid/util/Base64;->encodeToString([B I)Ljava/lang/String;" [classname="Landroid/util/Base64;",
|
||||||
|
descriptor="([B I)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=encodeToString];
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x5c8" -> "Landroid/util/Base64;->encodeToString([B I)Ljava/lang/String;";
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=main];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678" -> "Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x584";
|
||||||
|
"Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=invoke];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678" -> "Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;";
|
||||||
|
"Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;" [classname="Ljava/lang/ClassLoader;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/Class;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=loadClass];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678" -> "Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;";
|
||||||
|
"Ljava/lang/Class;->getMethod(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;" [classname="Ljava/lang/Class;",
|
||||||
|
descriptor="(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getMethod];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678" -> "Ljava/lang/Class;->getMethod(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;";
|
||||||
|
"Lcom/example/theseus/MainActivity;-><init>()V [access_flags=public constructor] @ 0x524" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/MainActivity;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Landroid/app/Activity;-><init>()V" [classname="Landroid/app/Activity;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/MainActivity;-><init>()V [access_flags=public constructor] @ 0x524" -> "Landroid/app/Activity;-><init>()V";
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x53c" [accessflags=protected,
|
||||||
|
classname="Lcom/example/theseus/MainActivity;",
|
||||||
|
descriptor="(Landroid/os/Bundle;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=onCreate];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x53c" -> "Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x60c";
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x53c" -> "Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x678";
|
||||||
|
"Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V" [classname="Landroid/app/Activity;",
|
||||||
|
descriptor="(Landroid/os/Bundle;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=onCreate];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x53c" -> "Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V";
|
||||||
|
"Landroid/util/Log;->i(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I" [classname="Landroid/util/Log;",
|
||||||
|
descriptor="(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=i];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x53c" -> "Landroid/util/Log;->i(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I";
|
||||||
|
"Lcom/example/theseus/Utils;-><init>()V [access_flags=public constructor] @ 0x754" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;-><init>()V [access_flags=public constructor] @ 0x754" -> "Ljava/lang/Object;-><init>()V";
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=popup];
|
||||||
|
"Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=setTitle];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" -> "Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;";
|
||||||
|
"Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Landroid/content/Context;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" -> "Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V";
|
||||||
|
"Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=setMessage];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" -> "Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;";
|
||||||
|
"Landroid/app/AlertDialog;->show()V" [classname="Landroid/app/AlertDialog;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=show];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" -> "Landroid/app/AlertDialog;->show()V";
|
||||||
|
"Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="()Landroid/app/AlertDialog;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=create];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c" -> "Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;";
|
||||||
|
"Lcom/example/theseus/Utils;->sink(Landroid/app/Activity; Ljava/lang/String;)V [access_flags=public static] @ 0x7a8" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Landroid/app/Activity; Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=sink];
|
||||||
|
"Lcom/example/theseus/Utils;->sink(Landroid/app/Activity; Ljava/lang/String;)V [access_flags=public static] @ 0x7a8" -> "Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x76c";
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x710" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=source];
|
||||||
|
"Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/StringBuilder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=append];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x710" -> "Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;";
|
||||||
|
"Ljava/lang/StringBuilder;-><init>()V" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x710" -> "Ljava/lang/StringBuilder;-><init>()V";
|
||||||
|
"Ljava/lang/StringBuilder;->toString()Ljava/lang/String;" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="()Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=toString];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x710" -> "Ljava/lang/StringBuilder;->toString()Ljava/lang/String;";
|
||||||
|
}
|
315
5_theseus/figs/patched_main_main.dot
Normal file
315
5_theseus/figs/patched_main_main.dot
Normal file
|
@ -0,0 +1,315 @@
|
||||||
|
strict digraph "" {
|
||||||
|
#"MainActivity-><init>()V" [accessflags="public constructor",
|
||||||
|
# classname="MainActivity",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Activity-><init>()V" [classname="Activity",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"MainActivity-><init>()V" -> "Activity-><init>()V";
|
||||||
|
#"MainActivity->onCreate(Bundle)V" [accessflags=protected,
|
||||||
|
# classname="MainActivity",
|
||||||
|
# descriptor="(Bundle)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=onCreate];
|
||||||
|
"Main->main()V" [accessflags=public,
|
||||||
|
classname="Main",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=main];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Main->main()V";
|
||||||
|
#"Activity->onCreate(Bundle)V" [classname="Activity",
|
||||||
|
# descriptor="(Bundle)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=onCreate];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Activity->onCreate(Bundle)V";
|
||||||
|
#"Main-><init>(Activity)V" [accessflags="public constructor",
|
||||||
|
# classname="Main",
|
||||||
|
# descriptor="(Activity)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> #"Main-><init>(Activity)V";
|
||||||
|
#"Log->i(String String Throwable)I" [classname="Log",
|
||||||
|
# descriptor="(String String Throwable)I",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=i];
|
||||||
|
#"MainActivity->onCreate(Bundle)V" -> "Log->i(String String Throwable)I";
|
||||||
|
"Main->decrypt(String)String" [accessflags=public,
|
||||||
|
classname="Main",
|
||||||
|
descriptor="(String)String",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=decrypt];
|
||||||
|
"Main->main()V" -> "Main->decrypt(String)String";
|
||||||
|
"ClassLoader->loadClass(String)Class" [classname="ClassLoader",
|
||||||
|
descriptor="(String)Class",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=loadClass];
|
||||||
|
"Main->main()V" -> "ClassLoader->loadClass(String)Class";
|
||||||
|
"Malicious->get_data(String Activity)String" [accessflags="public static",
|
||||||
|
classname="Malicious",
|
||||||
|
descriptor="(String Activity)String",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=get_data,
|
||||||
|
style=filled,
|
||||||
|
fillcolor=salmon];
|
||||||
|
"Main->main()V" -> "Malicious->get_data(String Activity)String";
|
||||||
|
"Method->invoke(Object [Object)Object" [classname="Method",
|
||||||
|
descriptor="(Object [Object)Object",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=invoke];
|
||||||
|
"Main->main()V" -> "Method->invoke(Object [Object)Object";
|
||||||
|
"Malicious->send_data(String Activity)String" [accessflags="public static",
|
||||||
|
classname="Malicious",
|
||||||
|
descriptor="(String Activity)String",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=send_data,
|
||||||
|
style=filled,
|
||||||
|
fillcolor=salmon];
|
||||||
|
"Main->main()V" -> "Malicious->send_data(String Activity)String";
|
||||||
|
"T->check_is_Malicious_get_data(Method)Z" [accessflags="public static final",
|
||||||
|
classname="T",
|
||||||
|
descriptor="(Method)Z",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=check_is_Malicious_get_data,
|
||||||
|
style=filled,
|
||||||
|
fillcolor=lightgrey];
|
||||||
|
"Main->main()V" -> "T->check_is_Malicious_get_data(Method)Z";
|
||||||
|
"Class->getMethod(String [Class)Method" [classname="Class",
|
||||||
|
descriptor="(String [Class)Method",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getMethod];
|
||||||
|
"Main->main()V" -> "Class->getMethod(String [Class)Method";
|
||||||
|
"T->check_is_Malicious_send_data(Method)Z" [accessflags="public static final",
|
||||||
|
classname="T",
|
||||||
|
descriptor="(Method)Z",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=check_is_Malicious_send_data,
|
||||||
|
style=filled,
|
||||||
|
fillcolor=lightgrey];
|
||||||
|
"Main->main()V" -> "T->check_is_Malicious_send_data(Method)Z";
|
||||||
|
#"Object-><init>()V" [classname="Object",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "Object-><init>()V";
|
||||||
|
#"ByteBuffer->wrap([B)ByteBuffer" [classname="ByteBuffer",
|
||||||
|
# descriptor="([B)ByteBuffer",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=wrap];
|
||||||
|
#"Main-><init>(Activity)V" -> "ByteBuffer->wrap([B)ByteBuffer";
|
||||||
|
#"Class->getClassLoader()ClassLoader" [classname="Class",
|
||||||
|
# descriptor="()ClassLoader",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getClassLoader];
|
||||||
|
#"Main-><init>(Activity)V" -> "Class->getClassLoader()ClassLoader";
|
||||||
|
#"SecretKeySpec-><init>([B String)V" [classname="SecretKeySpec",
|
||||||
|
# descriptor="([B String)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "SecretKeySpec-><init>([B String)V";
|
||||||
|
"Base64->decode(String I)[B" [classname="Base64",
|
||||||
|
descriptor="(String I)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=decode];
|
||||||
|
#"Main-><init>(Activity)V" -> "Base64->decode(String I)[B";
|
||||||
|
#"InMemoryDexClassLoader-><init>(ByteBuffer ClassLoader)V" [classname="InMemoryDexClassLoader",
|
||||||
|
# descriptor="(ByteBuffer ClassLoader)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Main-><init>(Activity)V" -> "InMemoryDexClassLoader-><init>(ByteBuffer ClassLoader)V";
|
||||||
|
#"String->getBytes()[B" [classname="String",
|
||||||
|
# descriptor="()[B",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getBytes];
|
||||||
|
#"Main-><init>(Activity)V" -> "String->getBytes()[B";
|
||||||
|
#"Utils-><init>()V" [accessflags="public constructor",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils-><init>()V" -> "Object-><init>()V";
|
||||||
|
#"Utils->popup(Activity String String)V" [accessflags="public static",
|
||||||
|
# classname="Utils",
|
||||||
|
# descriptor="(Activity String String)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=popup];
|
||||||
|
#"AlertDialog$Builder->setMessage(CharSequence)AlertDialog$Builder" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(CharSequence)AlertDialog$Builder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=setMessage];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->setMessage(CharSequence)AlertDialog$Builder";
|
||||||
|
#"AlertDialog$Builder->setTitle(CharSequence)AlertDialog$Builder" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(CharSequence)AlertDialog$Builder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=setTitle];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->setTitle(CharSequence)AlertDialog$Builder";
|
||||||
|
#"AlertDialog$Builder->create()AlertDialog;" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="()AlertDialog;",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=create];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder->create()AlertDialog;";
|
||||||
|
#"AlertDialog$Builder-><init>(Landroid/content/Context;)V" [classname="AlertDialog$Builder",
|
||||||
|
# descriptor="(Landroid/content/Context;)V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog$Builder-><init>(Landroid/content/Context;)V";
|
||||||
|
#"AlertDialog;->show()V" [classname="AlertDialog;",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=show];
|
||||||
|
#"Utils->popup(Activity String String)V" -> "AlertDialog;->show()V";
|
||||||
|
"Utils->sink(Activity String)V" [accessflags="public static",
|
||||||
|
classname="Utils",
|
||||||
|
descriptor="(Activity String)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=sink];
|
||||||
|
#"Utils->sink(Activity String)V" -> "Utils->popup(Activity String String)V";
|
||||||
|
"Utils->source(String)String" [accessflags="public static",
|
||||||
|
classname="Utils",
|
||||||
|
descriptor="(String)String",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=source];
|
||||||
|
#"StringBuilder->append(String)StringBuilder" [classname="StringBuilder",
|
||||||
|
# descriptor="(String)StringBuilder",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=append];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder->append(String)StringBuilder";
|
||||||
|
#"StringBuilder-><init>()V" [classname="StringBuilder",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder-><init>()V";
|
||||||
|
#"StringBuilder->toString()String" [classname="StringBuilder",
|
||||||
|
# descriptor="()String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=toString];
|
||||||
|
#"Utils->source(String)String" -> "StringBuilder->toString()String";
|
||||||
|
"Main->decrypt(String)String" -> "Base64->decode(String I)[B";
|
||||||
|
"String-><init>([B)V" [classname="String",
|
||||||
|
descriptor="([B)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Main->decrypt(String)String" -> "String-><init>([B)V";
|
||||||
|
"Cipher->doFinal([B)[B" [classname="Cipher",
|
||||||
|
descriptor="([B)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=doFinal];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->doFinal([B)[B";
|
||||||
|
"Cipher->init(I Key)V" [classname="Cipher",
|
||||||
|
descriptor="(I Key)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=init];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->init(I Key)V";
|
||||||
|
"Cipher->getInstance(String)Cipher" [classname="Cipher",
|
||||||
|
descriptor="(String)Cipher",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getInstance];
|
||||||
|
"Main->decrypt(String)String" -> "Cipher->getInstance(String)Cipher";
|
||||||
|
#"Main->encrypt(String)String" [accessflags=public,
|
||||||
|
# classname="Main",
|
||||||
|
# descriptor="(String)String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname=encrypt];
|
||||||
|
#"Main->encrypt(String)String" -> "String->getBytes()[B";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->doFinal([B)[B";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->init(I Key)V";
|
||||||
|
#"Main->encrypt(String)String" -> "Cipher->getInstance(String)Cipher";
|
||||||
|
#"Base64->encodeToString([B I)String" [classname="Base64",
|
||||||
|
# descriptor="([B I)String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=encodeToString];
|
||||||
|
#"Main->encrypt(String)String" -> "Base64->encodeToString([B I)String";
|
||||||
|
"Malicious->get_data(String Activity)String" -> "Utils->source(String)String";
|
||||||
|
"Malicious->send_data(String Activity)String" -> "Utils->sink(Activity String)V";
|
||||||
|
#"Class->descriptorString()String" [classname="Class",
|
||||||
|
# descriptor="()String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=descriptorString];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "Class->descriptorString()String";
|
||||||
|
#"Method->getName()String" [classname="Method",
|
||||||
|
# descriptor="()String",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getName];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "Method->getName()String";
|
||||||
|
#"String->equals(Object)Z" [classname="String",
|
||||||
|
# descriptor="(Object)Z",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=equals];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "String->equals(Object)Z";
|
||||||
|
#"Method->getDeclaringClass()Class" [classname="Method",
|
||||||
|
# descriptor="()Class",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getDeclaringClass];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "Method->getDeclaringClass()Class";
|
||||||
|
#"Method->getParameterTypes()[Class" [classname="Method",
|
||||||
|
# descriptor="()[Class",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getParameterTypes];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "Method->getParameterTypes()[Class";
|
||||||
|
#"Method->getReturnType()Class" [classname="Method",
|
||||||
|
# descriptor="()Class",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=True,
|
||||||
|
# methodname=getReturnType];
|
||||||
|
#"T->check_is_Malicious_get_data(Method)Z" -> "Method->getReturnType()Class";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "Class->descriptorString()String";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "Method->getName()String";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "String->equals(Object)Z";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "Method->getDeclaringClass()Class";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "Method->getParameterTypes()[Class";
|
||||||
|
#"T->check_is_Malicious_send_data(Method)Z" -> "Method->getReturnType()Class";
|
||||||
|
#"Malicious-><init>()V" [accessflags="public constructor",
|
||||||
|
# classname="Malicious",
|
||||||
|
# descriptor="()V",
|
||||||
|
# entrypoint=False,
|
||||||
|
# external=False,
|
||||||
|
# methodname="<init>"];
|
||||||
|
#"Malicious-><init>()V" -> "Object-><init>()V";
|
||||||
|
}
|
336
5_theseus/figs/patched_raw.dot
Normal file
336
5_theseus/figs/patched_raw.dot
Normal file
|
@ -0,0 +1,336 @@
|
||||||
|
strict digraph "" {
|
||||||
|
"Lcom/example/theseus/MainActivity;-><init>()V [access_flags=public constructor] @ 0x7a8" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/MainActivity;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Landroid/app/Activity;-><init>()V" [classname="Landroid/app/Activity;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/MainActivity;-><init>()V [access_flags=public constructor] @ 0x7a8" -> "Landroid/app/Activity;-><init>()V";
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x7c0" [accessflags=protected,
|
||||||
|
classname="Lcom/example/theseus/MainActivity;",
|
||||||
|
descriptor="(Landroid/os/Bundle;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=onCreate];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=main];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x7c0" -> "Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0";
|
||||||
|
"Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V" [classname="Landroid/app/Activity;",
|
||||||
|
descriptor="(Landroid/os/Bundle;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=onCreate];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x7c0" -> "Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V";
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Landroid/app/Activity;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x7c0" -> "Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc";
|
||||||
|
"Landroid/util/Log;->i(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I" [classname="Landroid/util/Log;",
|
||||||
|
descriptor="(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=i];
|
||||||
|
"Lcom/example/theseus/MainActivity;->onCreate(Landroid/os/Bundle;)V [access_flags=protected] @ 0x7c0" -> "Landroid/util/Log;->i(Ljava/lang/String; Ljava/lang/String; Ljava/lang/Throwable;)I";
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=decrypt];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928";
|
||||||
|
"Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;" [classname="Ljava/lang/ClassLoader;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/Class;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=loadClass];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;";
|
||||||
|
"Lcom/example/theseus/Malicious;->get_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x20c" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Malicious;",
|
||||||
|
descriptor="(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=get_data];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Lcom/example/theseus/Malicious;->get_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x20c";
|
||||||
|
"Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=invoke];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object; [Ljava/lang/Object;)Ljava/lang/Object;";
|
||||||
|
"Lcom/example/theseus/Malicious;->send_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x228" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Malicious;",
|
||||||
|
descriptor="(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=send_data];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Lcom/example/theseus/Malicious;->send_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x228";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" [accessflags="public static final",
|
||||||
|
classname="Ltheseus/tl6JVUxO9Jqe3VYc/T;",
|
||||||
|
descriptor="(Ljava/lang/reflect/Method;)Z",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=check_is_Malicious_get_data_224c9b416025faf4];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac";
|
||||||
|
"Ljava/lang/Class;->getMethod(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;" [classname="Ljava/lang/Class;",
|
||||||
|
descriptor="(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getMethod];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Ljava/lang/Class;->getMethod(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" [accessflags="public static final",
|
||||||
|
classname="Ltheseus/tl6JVUxO9Jqe3VYc/T;",
|
||||||
|
descriptor="(Ljava/lang/reflect/Method;)Z",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=check_is_Malicious_send_data_c961adb85ae3b11c];
|
||||||
|
"Lcom/example/theseus/Main;->main()V [access_flags=public] @ 0x9b0" -> "Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88";
|
||||||
|
"Ljava/lang/Object;-><init>()V" [classname="Ljava/lang/Object;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ljava/lang/Object;-><init>()V";
|
||||||
|
"Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;" [classname="Ljava/nio/ByteBuffer;",
|
||||||
|
descriptor="([B)Ljava/nio/ByteBuffer;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=wrap];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;";
|
||||||
|
"Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;" [classname="Ljava/lang/Class;",
|
||||||
|
descriptor="()Ljava/lang/ClassLoader;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getClassLoader];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;";
|
||||||
|
"Ljavax/crypto/spec/SecretKeySpec;-><init>([B Ljava/lang/String;)V" [classname="Ljavax/crypto/spec/SecretKeySpec;",
|
||||||
|
descriptor="([B Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ljavax/crypto/spec/SecretKeySpec;-><init>([B Ljava/lang/String;)V";
|
||||||
|
"Landroid/util/Base64;->decode(Ljava/lang/String; I)[B" [classname="Landroid/util/Base64;",
|
||||||
|
descriptor="(Ljava/lang/String; I)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=decode];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Landroid/util/Base64;->decode(Ljava/lang/String; I)[B";
|
||||||
|
"Ldalvik/system/InMemoryDexClassLoader;-><init>(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V" [classname="Ldalvik/system/InMemoryDexClassLoader;",
|
||||||
|
descriptor="(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ldalvik/system/InMemoryDexClassLoader;-><init>(Ljava/nio/ByteBuffer; Ljava/lang/ClassLoader;)V";
|
||||||
|
"Ljava/lang/String;->getBytes()[B" [classname="Ljava/lang/String;",
|
||||||
|
descriptor="()[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getBytes];
|
||||||
|
"Lcom/example/theseus/Main;-><init>(Landroid/app/Activity;)V [access_flags=public constructor] @ 0x8bc" -> "Ljava/lang/String;->getBytes()[B";
|
||||||
|
"Lcom/example/theseus/Utils;-><init>()V [access_flags=public constructor] @ 0x808" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;-><init>()V [access_flags=public constructor] @ 0x808" -> "Ljava/lang/Object;-><init>()V";
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=popup];
|
||||||
|
"Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=setMessage];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" -> "Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;";
|
||||||
|
"Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=setTitle];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" -> "Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;";
|
||||||
|
"Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="()Landroid/app/AlertDialog;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=create];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" -> "Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;";
|
||||||
|
"Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V" [classname="Landroid/app/AlertDialog$Builder;",
|
||||||
|
descriptor="(Landroid/content/Context;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" -> "Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V";
|
||||||
|
"Landroid/app/AlertDialog;->show()V" [classname="Landroid/app/AlertDialog;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=show];
|
||||||
|
"Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820" -> "Landroid/app/AlertDialog;->show()V";
|
||||||
|
"Lcom/example/theseus/Utils;->sink(Landroid/app/Activity; Ljava/lang/String;)V [access_flags=public static] @ 0x85c" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Landroid/app/Activity; Ljava/lang/String;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=sink];
|
||||||
|
"Lcom/example/theseus/Utils;->sink(Landroid/app/Activity; Ljava/lang/String;)V [access_flags=public static] @ 0x85c" -> "Lcom/example/theseus/Utils;->popup(Landroid/app/Activity; Ljava/lang/String; Ljava/lang/String;)V [access_flags=public static] @ \
|
||||||
|
0x820";
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x878" [accessflags="public static",
|
||||||
|
classname="Lcom/example/theseus/Utils;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=source];
|
||||||
|
"Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/StringBuilder;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=append];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x878" -> "Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;";
|
||||||
|
"Ljava/lang/StringBuilder;-><init>()V" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x878" -> "Ljava/lang/StringBuilder;-><init>()V";
|
||||||
|
"Ljava/lang/StringBuilder;->toString()Ljava/lang/String;" [classname="Ljava/lang/StringBuilder;",
|
||||||
|
descriptor="()Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=toString];
|
||||||
|
"Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x878" -> "Ljava/lang/StringBuilder;->toString()Ljava/lang/String;";
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" -> "Landroid/util/Base64;->decode(Ljava/lang/String; I)[B";
|
||||||
|
"Ljava/lang/String;-><init>([B)V" [classname="Ljava/lang/String;",
|
||||||
|
descriptor="([B)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" -> "Ljava/lang/String;-><init>([B)V";
|
||||||
|
"Ljavax/crypto/Cipher;->doFinal([B)[B" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="([B)[B",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=doFinal];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" -> "Ljavax/crypto/Cipher;->doFinal([B)[B";
|
||||||
|
"Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="(I Ljava/security/Key;)V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=init];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" -> "Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V";
|
||||||
|
"Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;" [classname="Ljavax/crypto/Cipher;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljavax/crypto/Cipher;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getInstance];
|
||||||
|
"Lcom/example/theseus/Main;->decrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x928" -> "Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" [accessflags=public,
|
||||||
|
classname="Lcom/example/theseus/Main;",
|
||||||
|
descriptor="(Ljava/lang/String;)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname=encrypt];
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" -> "Ljava/lang/String;->getBytes()[B";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" -> "Ljavax/crypto/Cipher;->doFinal([B)[B";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" -> "Ljavax/crypto/Cipher;->init(I Ljava/security/Key;)V";
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" -> "Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;";
|
||||||
|
"Landroid/util/Base64;->encodeToString([B I)Ljava/lang/String;" [classname="Landroid/util/Base64;",
|
||||||
|
descriptor="([B I)Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=encodeToString];
|
||||||
|
"Lcom/example/theseus/Main;->encrypt(Ljava/lang/String;)Ljava/lang/String; [access_flags=public] @ 0x96c" -> "Landroid/util/Base64;->encodeToString([B I)Ljava/lang/String;";
|
||||||
|
"Lcom/example/theseus/Malicious;->get_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x20c" -> "Lcom/example/theseus/Utils;->source(Ljava/lang/String;)Ljava/lang/String; [access_flags=public static] @ 0x878";
|
||||||
|
"Lcom/example/theseus/Malicious;->send_data(Ljava/lang/String; Landroid/app/Activity;)Ljava/lang/String; [access_flags=public static] @ \
|
||||||
|
0x228" -> "Lcom/example/theseus/Utils;->sink(Landroid/app/Activity; Ljava/lang/String;)V [access_flags=public static] @ 0x85c";
|
||||||
|
"Ljava/lang/Class;->descriptorString()Ljava/lang/String;" [classname="Ljava/lang/Class;",
|
||||||
|
descriptor="()Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=descriptorString];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/Class;->descriptorString()Ljava/lang/String;";
|
||||||
|
"Ljava/lang/reflect/Method;->getName()Ljava/lang/String;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="()Ljava/lang/String;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getName];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/reflect/Method;->getName()Ljava/lang/String;";
|
||||||
|
"Ljava/lang/String;->equals(Ljava/lang/Object;)Z" [classname="Ljava/lang/String;",
|
||||||
|
descriptor="(Ljava/lang/Object;)Z",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=equals];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/String;->equals(Ljava/lang/Object;)Z";
|
||||||
|
"Ljava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="()Ljava/lang/Class;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getDeclaringClass];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;";
|
||||||
|
"Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="()[Ljava/lang/Class;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getParameterTypes];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;";
|
||||||
|
"Ljava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;" [classname="Ljava/lang/reflect/Method;",
|
||||||
|
descriptor="()Ljava/lang/Class;",
|
||||||
|
entrypoint=False,
|
||||||
|
external=True,
|
||||||
|
methodname=getReturnType];
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_get_data_224c9b416025faf4(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xaac" -> "Ljava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/Class;->descriptorString()Ljava/lang/String;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/reflect/Method;->getName()Ljava/lang/String;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/String;->equals(Ljava/lang/Object;)Z";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;";
|
||||||
|
"Ltheseus/tl6JVUxO9Jqe3VYc/T;->check_is_Malicious_send_data_c961adb85ae3b11c(Ljava/lang/reflect/Method;)Z [access_flags=public static \
|
||||||
|
final] @ 0xb88" -> "Ljava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;";
|
||||||
|
"Lcom/example/theseus/Malicious;-><init>()V [access_flags=public constructor] @ 0x1f4" [accessflags="public constructor",
|
||||||
|
classname="Lcom/example/theseus/Malicious;",
|
||||||
|
descriptor="()V",
|
||||||
|
entrypoint=False,
|
||||||
|
external=False,
|
||||||
|
methodname="<init>"];
|
||||||
|
"Lcom/example/theseus/Malicious;-><init>()V [access_flags=public constructor] @ 0x1f4" -> "Ljava/lang/Object;-><init>()V";
|
||||||
|
}
|
9
jury.typ
9
jury.typ
|
@ -8,10 +8,11 @@
|
||||||
column-gutter: 2em,
|
column-gutter: 2em,
|
||||||
stroke: 0pt,
|
stroke: 0pt,
|
||||||
inset: (x: 0pt, y: .5em),
|
inset: (x: 0pt, y: .5em),
|
||||||
"Présidente :", "", "", "",
|
//"Présidente :", "", "", "",
|
||||||
"Rapporteurs :", "Vincent Nicomette", "Professeur des Universités", "INSA Toulouse",
|
"Rapporteurs :", "Vincent Nicomette", "Professeur des Universités", "INSA de Toulouse",
|
||||||
"", "Julien Signoles", "Directeur de Recherches", "CEA",
|
"", "Julien Signoles", "Directeur de Recherche", "CEA LIST",
|
||||||
"Examinatrice :", "", "", "",
|
"Examinateurs :", "Guillaume Doyen", "Professeur", "IMT Atlantique",
|
||||||
|
"", "Simone Aonzo", /*"Assistant Professor"*/ "Maître de Conférences", "Eurecom",
|
||||||
"Dir. de thèse :", "Jean-François Lalande", "Professeur des Universités", "CentraleSupélec",
|
"Dir. de thèse :", "Jean-François Lalande", "Professeur des Universités", "CentraleSupélec",
|
||||||
"", "Valérie Viet Triem Tong", "Professeure", "CentraleSupélec",
|
"", "Valérie Viet Triem Tong", "Professeure", "CentraleSupélec",
|
||||||
)
|
)
|
||||||
|
|
14
main.typ
14
main.typ
|
@ -26,6 +26,15 @@
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
#let preliminary = if "preliminary" in sys.inputs {
|
||||||
|
assert(
|
||||||
|
sys.inputs.preliminary == "true" or sys.inputs.preliminary == "false",
|
||||||
|
message: "If --input preliminary=<val> is set, <val> must be 'true' or 'false'",
|
||||||
|
)
|
||||||
|
sys.inputs.preliminary == "true"
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
#let (show_cover, show_body, show_abstracts) = {
|
#let (show_cover, show_body, show_abstracts) = {
|
||||||
let show_cover = true
|
let show_cover = true
|
||||||
|
@ -52,9 +61,9 @@
|
||||||
|
|
||||||
|
|
||||||
#show: matisse-thesis.with(
|
#show: matisse-thesis.with(
|
||||||
title-fr: [Rétro-Ingénierie d'applications Android: les inconvénients de l'analyse statique], // malheurs -> inconvénients ?
|
title-fr: [Les difficultés de la rétro-ingénierie Android: de l'analyse large échelle au dé-brouillage dynamique],
|
||||||
// Because "Android Skuldgerries and Other Headache Inducing Fuckeries" won't pass the vibe check
|
// Because "Android Skuldgerries and Other Headache Inducing Fuckeries" won't pass the vibe check
|
||||||
title-en: [Android Application Reverse Engineering: the Woes of Static Analysis],
|
title-en: [The Woes of Android Reverse Engineering: from Large Scale Analysis to Dynamic Deobfuscation],
|
||||||
author: "Jean-Marie MINEAU",
|
author: "Jean-Marie MINEAU",
|
||||||
affiliation: "IRISA",
|
affiliation: "IRISA",
|
||||||
defense-place: "Rennes",
|
defense-place: "Rennes",
|
||||||
|
@ -74,6 +83,7 @@
|
||||||
show_cover: show_cover,
|
show_cover: show_cover,
|
||||||
show_body: show_body,
|
show_body: show_body,
|
||||||
show_abstracts: show_abstracts,
|
show_abstracts: show_abstracts,
|
||||||
|
preliminary: preliminary,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Preamble
|
// Preamble
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
#import "jury.typ": jury-content
|
#import "jury.typ": jury-content
|
||||||
|
|
||||||
#show: matisse-thesis.with(
|
#show: matisse-thesis.with(
|
||||||
title-fr: [Rétro-Ingénierie d'applications Android: les inconvénients de l'analyse statique], // malheurs -> inconvénients ?
|
title-fr: [Les difficultés de la rétro-ingénierie Android: de l'analyse large échelle au dé-brouillage dynamique],
|
||||||
title-en: [],
|
title-en: [],
|
||||||
author: "Jean-Marie MINEAU",
|
author: "Jean-Marie MINEAU",
|
||||||
affiliation: "IRISA",
|
affiliation: "IRISA",
|
||||||
defense-place: "Rennes",
|
defense-place: "Rennes",
|
||||||
draft: true,
|
draft: false,
|
||||||
defense-date: datetime(
|
defense-date: datetime(
|
||||||
year: 2025,
|
year: 2025,
|
||||||
month: 12,
|
month: 12,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue