@@ -29,91 +29,25 @@ protocol Kinded {
29
29
open class AndroidInjection {
30
30
31
31
open class func connectAndRun( forMainThread: @escaping ( @escaping ( ) -> ( ) ) -> ( ) ) {
32
+ if androidInjectionHost == " NNN.NNN.NNN.NNN " {
33
+ NSLog ( " Injection: androidInjectionHost has not been updated, try build again " )
34
+ return
35
+ }
36
+
32
37
DispatchQueue . global ( qos: . background) . async {
33
38
var serverSocket : Int32 = - 1
34
39
while true {
35
- serverSocket = connectTo ( ipAddress: androidInjectionHost, INJECTION_APPNAME: " Injection " )
36
- if serverSocket >= 0 {
37
- break
38
- }
39
- Thread . sleep ( forTimeInterval: 10 )
40
- }
41
-
42
- let serverWrite = fdopen ( serverSocket, " w " )
43
- NSLog ( " Injection: Connected to \( androidInjectionHost) " )
44
-
45
- var value : Int32 = Int32 ( INJECTION_PORT)
46
- let valueLength = MemoryLayout . size ( ofValue: value)
47
- if serverWrite == nil || fwrite ( & value, 1 , valueLength, serverWrite) != valueLength {
48
- NSLog ( " Injection: Could not write magic to %d %p: %s " , serverSocket, serverWrite!, strerror ( errno) )
49
- return
50
- }
51
-
52
- if !#file. withCString ( {
53
- filepath in
54
- value = Int32 ( strlen ( filepath) )
55
- return fwrite ( & value, 1 , valueLength, serverWrite) == valueLength &&
56
- fwrite ( filepath, 1 , Int ( value) , serverWrite) == value
57
- } ) {
58
- NSLog ( " Injection: Could not write filepath to %d %p: %s " , serverSocket, serverWrite!, strerror ( errno) )
59
- return
60
- }
61
- fflush ( serverWrite)
62
-
63
- var injectionNumber = 0
64
- let serverRead = fdopen ( serverSocket, " r " )
65
- var compressedLength : Int32 = 0 , uncompressedLength : Int32 = 0
66
-
67
- while fread ( & compressedLength, 1 , valueLength, serverRead) == valueLength &&
68
- fread ( & uncompressedLength, 1 , valueLength, serverRead) == valueLength,
69
- var compressedBuffer = malloc ( Int ( compressedLength) ) ,
70
- var uncompressedBuffer = malloc ( Int ( uncompressedLength) ) ,
71
- fread ( compressedBuffer, 1 , Int ( compressedLength) , serverRead) == compressedLength {
72
- defer {
73
- free ( uncompressedBuffer)
74
- free ( compressedBuffer)
75
- }
76
- if compressedLength == valueLength && uncompressedLength == valueLength {
77
- continue
78
- }
79
-
80
- NSLog ( " Injection: received %d/%d bytes " , compressedLength, uncompressedLength)
81
-
82
- var destLen = uLongf ( uncompressedLength)
83
- if uncompress ( uncompressedBuffer. assumingMemoryBound ( to: Bytef . self) , & destLen,
84
- compressedBuffer. assumingMemoryBound ( to: Bytef . self) ,
85
- uLong ( compressedLength) ) != Z_OK || destLen != uLongf ( uncompressedLength) {
86
- NSLog ( " Injection: uncompression failure " )
40
+ while true {
41
+ serverSocket = connectTo ( ipAddress: androidInjectionHost, INJECTION_APPNAME: " Injection " )
42
+ if serverSocket >= 0 {
87
43
break
88
44
}
45
+ Thread . sleep ( forTimeInterval: 10 )
46
+ }
89
47
90
- injectionNumber += 1
91
- let libraryPath = NSTemporaryDirectory ( ) + " injection \( injectionNumber) .so "
92
- let libraryFILE = fopen ( libraryPath, " w " )
93
- if libraryFILE == nil || fwrite ( uncompressedBuffer, 1 , Int ( uncompressedLength) , libraryFILE) != uncompressedLength {
94
- NSLog ( " Injection: Could not write library file " )
95
- break
96
- }
97
- fclose ( libraryFILE)
98
-
99
- forMainThread ( {
100
- NSLog ( " Injection: Wrote to \( libraryPath) , injecting... " )
101
- let error = loadAndInject ( library: libraryPath)
102
- var status = Int32 ( error == nil ? 0 : strlen ( error) )
103
- if fwrite ( & status, 1 , valueLength, serverWrite) != valueLength {
104
- NSLog ( " Injection: Could not write status " )
105
- }
106
- if error != nil && fwrite ( error, 1 , Int ( status) , serverWrite) != status {
107
- NSLog ( " Injection: Could not write error string " )
108
- }
109
- fflush ( serverWrite)
110
- NSLog ( " Injection complete. " )
111
- } )
48
+ service ( serverSocket: serverSocket, forMainThread: forMainThread)
49
+ Thread . sleep ( forTimeInterval: 10 )
112
50
}
113
-
114
- NSLog ( " Injection loop exits " )
115
- fclose ( serverWrite)
116
- fclose ( serverRead)
117
51
}
118
52
}
119
53
@@ -140,11 +74,88 @@ open class AndroidInjection {
140
74
else {
141
75
return loaderSocket
142
76
}
143
-
144
77
close ( loaderSocket)
145
78
return - 1
146
79
}
147
80
81
+ open class func service( serverSocket: Int32 , forMainThread: @escaping ( @escaping ( ) -> ( ) ) -> ( ) ) {
82
+ NSLog ( " Injection: Connected to \( androidInjectionHost) " )
83
+
84
+ let serverWrite = fdopen ( serverSocket, " w " )
85
+ var value : Int32 = Int32 ( INJECTION_PORT)
86
+ let valueLength = MemoryLayout . size ( ofValue: value)
87
+ if serverWrite == nil || fwrite ( & value, 1 , valueLength, serverWrite) != valueLength {
88
+ NSLog ( " Injection: Could not write magic to %d %p: %s " , serverSocket, serverWrite!, strerror ( errno) )
89
+ return
90
+ }
91
+
92
+ if !#file. withCString ( {
93
+ filepath in
94
+ value = Int32 ( strlen ( filepath) )
95
+ return fwrite ( & value, 1 , valueLength, serverWrite) == valueLength &&
96
+ fwrite ( filepath, 1 , Int ( value) , serverWrite) == value
97
+ } ) {
98
+ NSLog ( " Injection: Could not write filepath to %d %p: %s " , serverSocket, serverWrite!, strerror ( errno) )
99
+ return
100
+ }
101
+ fflush ( serverWrite)
102
+
103
+ let serverRead = fdopen ( serverSocket, " r " )
104
+ var compressedLength : Int32 = 0 , uncompressedLength : Int32 = 0 , injectionNumber = 0
105
+
106
+ while fread ( & compressedLength, 1 , valueLength, serverRead) == valueLength &&
107
+ fread ( & uncompressedLength, 1 , valueLength, serverRead) == valueLength,
108
+ var compressedBuffer = malloc ( Int ( compressedLength) ) ,
109
+ var uncompressedBuffer = malloc ( Int ( uncompressedLength) ) ,
110
+ fread ( compressedBuffer, 1 , Int ( compressedLength) , serverRead) == compressedLength {
111
+ defer {
112
+ free ( compressedBuffer)
113
+ free ( uncompressedBuffer)
114
+ }
115
+ if compressedLength == valueLength && uncompressedLength == valueLength {
116
+ continue
117
+ }
118
+
119
+ NSLog ( " Injection: received %d/%d bytes " , compressedLength, uncompressedLength)
120
+
121
+ var destLen = uLongf ( uncompressedLength)
122
+ if uncompress ( uncompressedBuffer. assumingMemoryBound ( to: Bytef . self) , & destLen,
123
+ compressedBuffer. assumingMemoryBound ( to: Bytef . self) ,
124
+ uLong ( compressedLength) ) != Z_OK || destLen != uLongf ( uncompressedLength) {
125
+ NSLog ( " Injection: uncompression failure " )
126
+ break
127
+ }
128
+
129
+ injectionNumber += 1
130
+ let libraryPath = NSTemporaryDirectory ( ) + " injection \( injectionNumber) .so "
131
+ let libraryFILE = fopen ( libraryPath, " w " )
132
+ if libraryFILE == nil ||
133
+ fwrite ( uncompressedBuffer, 1 , Int ( uncompressedLength) , libraryFILE) != uncompressedLength {
134
+ NSLog ( " Injection: Could not write library file " )
135
+ break
136
+ }
137
+ fclose ( libraryFILE)
138
+
139
+ forMainThread ( {
140
+ NSLog ( " Injection: Wrote to \( libraryPath) , injecting... " )
141
+ let error = loadAndInject ( library: libraryPath)
142
+ var status = Int32 ( error == nil ? 0 : strlen ( error) )
143
+ if fwrite ( & status, 1 , valueLength, serverWrite) != valueLength {
144
+ NSLog ( " Injection: Could not write status " )
145
+ }
146
+ if error != nil && fwrite ( error, 1 , Int ( status) , serverWrite) != status {
147
+ NSLog ( " Injection: Could not write error string " )
148
+ }
149
+ fflush ( serverWrite)
150
+ NSLog ( " Injection complete. " )
151
+ } )
152
+ }
153
+
154
+ NSLog ( " Injection loop exits " )
155
+ fclose ( serverWrite)
156
+ fclose ( serverRead)
157
+ }
158
+
148
159
open class func loadAndInject( library: String ) -> UnsafePointer < Int8 > ? {
149
160
guard let libHandle = dlopen ( library, Int32 ( RTLD_LAZY) ) else {
150
161
let error = dlerror ( )
@@ -247,4 +258,3 @@ open class AndroidInjection {
247
258
memcpy ( byteAddr ( existingClass) + vtableOffset, byteAddr ( classMetadata) + vtableOffset, vtableLength)
248
259
}
249
260
}
250
-
0 commit comments