Skip to content

Commit 87b0cea

Browse files
committed
primary obfuscation working
1 parent c932984 commit 87b0cea

File tree

9 files changed

+107
-8
lines changed

9 files changed

+107
-8
lines changed

build.gradle

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@ compileKotlin {
2424
}
2525
compileTestKotlin {
2626
kotlinOptions.jvmTarget = "1.8"
27-
}
27+
}
28+
29+
processResources {
30+
from 'src/main/kotlin/components/jni'
31+
include '*.dylib', '*.dll'
32+
}

src/main/kotlin/components/Extensions.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,15 @@ fun File.restore(projectPath: String): File {
9595
return restore
9696
}
9797

98+
fun ByteArray.toReadableString(): String {
99+
val builder = StringBuilder()
100+
this.forEachIndexed { index, byte ->
101+
if (index == this.size - 1) {
102+
builder.append(byte)
103+
} else {
104+
builder.append("$byte, ")
105+
}
106+
}
107+
return builder.toString()
108+
}
109+

src/main/kotlin/components/Stark.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package components
2+
3+
import java.io.File
4+
import java.io.FileOutputStream
5+
6+
class Stark {
7+
8+
companion object {
9+
init {
10+
when (getOs()) {
11+
Os.WINDOWS -> loadLib("..\\$winLib")
12+
Os.OSX -> loadLib("../$osxLib")
13+
}
14+
}
15+
16+
private fun loadLib(name: String) {
17+
// val path = (Stark::class.java.protectionDomain.codeSource.location.toURI()).path
18+
val inputStream = Stark::class.java.getResourceAsStream(name)
19+
val buffer = ByteArray(1024)
20+
var read = -1
21+
val temp = File.createTempFile(name, "")
22+
val fos = FileOutputStream(temp)
23+
24+
read = inputStream.read(buffer)
25+
while (read != -1) {
26+
fos.write(buffer, 0, read)
27+
read = inputStream.read(buffer)
28+
}
29+
fos.close()
30+
inputStream.close()
31+
32+
System.load(temp.absolutePath)
33+
}
34+
35+
@JvmStatic external fun obfuscate(mainModule: String, key: String, value: ByteArray): ByteArray
36+
37+
@JvmStatic external fun reveal(mainModule: String, key: String, value: ByteArray): ByteArray
38+
}
39+
40+
}

src/main/kotlin/components/Vars.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package components
22

33
internal const val resourceBackup = "resbackup"
44
internal const val extensionName = "stringcare"
5+
internal const val winLib = "libsignKey.dll"
6+
internal const val osxLib = "libsignKey.dylib"
57
internal const val wrapperOsX = "./gradlew"
68
internal const val wrapperWindows = "gradlew.bat"
79
internal const val emptyChar = ""

src/main/kotlin/components/XParser.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import models.Configuration
44
import models.ResourceFile
55
import models.SAttribute
66
import models.StringEntity
7-
import org.xml.sax.InputSource
87
import java.io.File
98
import javax.xml.parsers.DocumentBuilderFactory
109

@@ -61,3 +60,14 @@ fun parseXML(file: File, module: String, debug: Boolean): List<StringEntity> {
6160
return entities
6261
}
6362

63+
fun obfuscate(mainModule: String, key: String, entity: StringEntity): StringEntity {
64+
val obfuscation = Stark.obfuscate(mainModule, key, entity.value.toByteArray()).toReadableString()
65+
return StringEntity(entity.name, entity.attributes, obfuscation)
66+
}
67+
68+
fun reveal(mainModule: String, key: String, entity: StringEntity): StringEntity {
69+
val arr: ByteArray = entity.value.split(", ").map { it.toInt().toByte() }.toByteArray()
70+
val original = String(Stark.reveal(mainModule, key, arr))
71+
return StringEntity(entity.name, entity.attributes, original)
72+
}
73+
3.66 MB
Binary file not shown.
Binary file not shown.
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package models
22

3-
data class StringEntity(val name: String, val attributes: List<SAttribute>, val value: String)
3+
class StringEntity(var name: String, var attributes: List<SAttribute>, var value: String) {
4+
5+
}
46
data class SAttribute(val name: String, val value: String)

src/test/kotlin/SCTest.kt

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
import components.*
2+
import org.junit.Before
23
import org.junit.Test
4+
import java.io.File
35

46

57
class SCTest {
68

79
private val logger by logger()
810

911
private val projectName = "KotlinSample"
12+
private val mainModuleTest = "app"
13+
14+
private val librarySetupTask = """
15+
cp src/main/kotlin/components/jni/$osxLib out/production/classes/$osxLib
16+
cp src/main/kotlin/components/jni/$winLib out/production/classes/$winLib
17+
""".trimIndent()
18+
1019
private val prepareTask = """
1120
rm -rf $projectName &&
1221
git clone https://github.com/StringCare/$projectName.git &&
@@ -20,6 +29,11 @@ class SCTest {
2029
${signingReportTask()}
2130
""".trimIndent()
2231

32+
@Before
33+
fun setup() {
34+
librarySetupTask.runCommand()
35+
}
36+
2337
@Test
2438
fun `terminal verification`() {
2539
"echo $extensionName".runCommand { command, result ->
@@ -68,19 +82,33 @@ class SCTest {
6882
prepareTask.runCommand { _, _ ->
6983
val files = backupFiles(projectName, defaultConfig())
7084
files.forEach {
71-
assert(parseXML(it, "app", true).isNotEmpty())
85+
assert(parseXML(it, mainModuleTest, true).isNotEmpty())
7286
}
7387
}
7488
}
7589

7690

7791
@Test
7892
fun `obfuscate string files`() {
79-
prepareTask.runCommand { _, _ ->
93+
signingReportTask.runCommand { _, report ->
8094
val files = backupFiles(projectName, defaultConfig())
81-
files.forEach {
82-
val entities = parseXML(it, "app", true)
83-
95+
files.forEach { file ->
96+
val entities = parseXML(file, mainModuleTest, true)
97+
entities.forEach { entity ->
98+
val obfuscated = obfuscate(
99+
"$projectName${File.separator}$mainModuleTest",
100+
report.extractFingerprint(),
101+
entity)
102+
assert(obfuscated.value != entity.value)
103+
104+
val original = reveal(
105+
"$projectName${File.separator}$mainModuleTest",
106+
report.extractFingerprint(),
107+
obfuscated)
108+
109+
assert(original.value == entity.value)
110+
111+
}
84112
}
85113
}
86114
}

0 commit comments

Comments
 (0)