@@ -6,6 +6,8 @@ function JNIEnvInterceptor(references, threads, transport) {
66 this . references = references ;
77 this . threads = threads ;
88 this . transport = transport ;
9+
10+ this . javaVMInterceptor = NULL ;
911}
1012
1113JNIEnvInterceptor . prototype . shadowJNIEnv = null ;
@@ -43,7 +45,24 @@ JNIEnvInterceptor.prototype.createJNIIntercept = function(id, methodAddr) {
4345
4446 var ret = nativeFunction . apply ( null , localArgs ) ;
4547
46- self . transport . trace ( method , localArgs , ret , this . context ) ;
48+ var add = null ;
49+
50+ if ( method . args [ method . args . length - 1 ] === "jvalue*" ) {
51+ add = self . methods [ ptr ( localArgs [ 2 ] ) ] . javaParams ;
52+ var jvalues = ptr ( localArgs [ method . args . length - 1 ] ) ;
53+ localArgs = localArgs . slice ( 0 , - 1 ) ;
54+
55+ for ( var i = 0 ; i < add . length ; i ++ ) {
56+ var val = NULL ;
57+ var type = Types . convertNativeJTypeToFridaType ( add [ i ] ) ;
58+
59+ var val = self . readValue ( jvalues . add ( 8 * i ) , type ) ;
60+
61+ localArgs . push ( val ) ;
62+ }
63+ }
64+
65+ self . transport . trace ( method , localArgs , ret , this . context , add ) ;
4766
4867 if ( method . name === "GetMethodID" ||
4968 method . name === "GetStaticMethodID" ) {
@@ -68,6 +87,20 @@ JNIEnvInterceptor.prototype.createJNIIntercept = function(id, methodAddr) {
6887 fridaTypes . ret = Types . convertNativeJTypeToFridaType ( jTypeRet ) ;
6988
7089 self . methods [ ret ] = fridaTypes ;
90+ } else if ( method . name === "GetJavaVM" ) {
91+ var javaVM = NULL ;
92+
93+ if ( ret === 0 ) {
94+ self . threads . setJavaVM ( Memory . readPointer ( localArgs [ 1 ] ) ) ;
95+ }
96+
97+ if ( ! self . javaVMInterceptor . isInitialised ( ) ) {
98+ javaVM = self . javaVMInterceptor . create ( ) ;
99+ } else {
100+ javaVM = self . javaVMInterceptor . get ( ) ;
101+ }
102+
103+ Memory . writePointer ( localArgs [ 1 ] , javaVM ) ;
71104 } else if ( method . name === "RegisterNatives" ) {
72105 var methods = localArgs [ 2 ] ;
73106 var size = localArgs [ 3 ] ;
@@ -213,26 +246,10 @@ JNIEnvInterceptor.prototype.createJNIVaListIntercept =
213246 self . setUpVaListArgExtract ( vaList ) ;
214247
215248 for ( var i = 0 ; i < method . params . length ; i ++ ) {
216- var val = NULL ;
217249 var currentPtr = self . extractVaListArgValue ( method , i ) ;
218250
219- if ( method . params [ i ] === "char" ) {
220- val = Memory . readS8 ( currentPtr ) ;
221- } else if ( method . params [ i ] === "int16" ) {
222- val = Memory . readS16 ( currentPtr ) ;
223- } else if ( method . params [ i ] === "uint16" ) {
224- val = Memory . readU16 ( currentPtr ) ;
225- } else if ( method . params [ i ] === "int" ) {
226- val = Memory . readS32 ( currentPtr ) ;
227- } else if ( method . params [ i ] === "int64" ) {
228- val = Memory . readS64 ( currentPtr ) ;
229- } else if ( method . params [ i ] === "float" ) {
230- val = Memory . readDouble ( currentPtr ) ;
231- } else if ( method . params [ i ] === "double" ) {
232- val = Memory . readDouble ( currentPtr ) ;
233- }
251+ var val = self . readValue ( currentPtr , method . params [ i ] , true ) ;
234252
235- //TODO - needs to use jtype
236253 this . args . push ( val ) ;
237254 }
238255
@@ -279,6 +296,38 @@ JNIEnvInterceptor.prototype.createJNIVaListIntercept =
279296 return methodAddr ;
280297 }
281298
299+ JNIEnvInterceptor . prototype . readValue = function ( currentPtr , type , extend ) {
300+ var val = NULL ;
301+
302+ if ( type === "char" ) {
303+ val = Memory . readS8 ( currentPtr ) ;
304+ } else if ( type === "int16" ) {
305+ val = Memory . readS16 ( currentPtr ) ;
306+ } else if ( type === "uint16" ) {
307+ val = Memory . readU16 ( currentPtr ) ;
308+ } else if ( type === "int" ) {
309+ val = Memory . readS32 ( currentPtr ) ;
310+ } else if ( type === "int64" ) {
311+ val = Memory . readS64 ( currentPtr ) ;
312+ } else if ( type === "float" ) {
313+ if ( extend ) {
314+ val = Memory . readDouble ( currentPtr ) ;
315+ } else {
316+ val = Memory . readFloat ( currentPtr ) ;
317+ }
318+ } else if ( type === "double" ) {
319+ val = Memory . readDouble ( currentPtr ) ;
320+ } else if ( type === "pointer" ) {
321+ val = Memory . readPointer ( currentPtr ) ;
322+ }
323+
324+ return val ;
325+ }
326+
327+ JNIEnvInterceptor . prototype . setJavaVMInterceptor = function ( javaVMInterceptor ) {
328+ this . javaVMInterceptor = javaVMInterceptor ;
329+ }
330+
282331JNIEnvInterceptor . prototype . create = function ( ) {
283332 var threadId = Process . getCurrentThreadId ( ) ;
284333 var jniEnv = this . threads . getJNIEnv ( threadId ) ;
0 commit comments