Skip to content

Commit

Permalink
整理,call_native 支持静态native函数call
Browse files Browse the repository at this point in the history
  • Loading branch information
yao.mai committed Apr 6, 2020
1 parent 514735b commit d055f5b
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 49 deletions.
2 changes: 1 addition & 1 deletion androidemu/cpu/syscall_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ def _handle_futex(self, mu, uaddr, op, val, timeout, uaddr2, val3):

def _handle_tgkill(self, mu, tgid, tid, sig):
if (tgid == self._getpid(mu) and sig == 6):
logger.warn("tgkill abort self, skip!!!")
raise RuntimeError("tgkill abort self,...")
return 0
#
if (tgid == self._getpid(mu) and tid == self._gettid(mu)):
Expand Down
4 changes: 2 additions & 2 deletions androidemu/emulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from androidemu.vfs.file_system import VirtualFileSystem

from androidemu.java.java_class_def import JavaClassDef
from androidemu.java.constant_values import JAVA_RET_NULL
from androidemu.java.constant_values import JAVA_NULL

sys.stdout = sys.stderr
#由于这里的stream只能改一次,为避免与fork之后的子进程写到stdout混合,将这些log写到stderr
Expand Down Expand Up @@ -185,7 +185,7 @@ def call_native(self, addr, *argv):
result_idx = res
result = self.java_vm.jni_env.get_local_reference(result_idx)
if result is None:
return JAVA_RET_NULL
return JAVA_NULL
return result.value
#
else:
Expand Down
4 changes: 2 additions & 2 deletions androidemu/java/classes/bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ def getString(self, emu, k):
if (pykey in self.__pymap):
return String(self.__pymap[pykey])
else:
#attention do not return None, return None means no return value in function, return JAVA_RET_NULL means the return value is NULL
return JAVA_RET_NULL
#attention do not return None, return None means no return value in function, return JAVA_NULL means the return value is NULL
return JAVA_NULL
#
raise NotImplementedError()
#
Expand Down
2 changes: 1 addition & 1 deletion androidemu/java/classes/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def __setitem__(self,index,value):
def get(self, emu, index):
if (index < len(self.__pylist)):
return self.__pylist[index]
return JAVA_RET_NULL
return JAVA_NULL
#


Expand Down
2 changes: 1 addition & 1 deletion androidemu/java/constant_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@

#注意,这个返回值是给java函数返回null的时候用,返回null与python的None不是一个概念
#python 的None在本系统设计里面表示函数没有返回值,与返回Null(0)有本质上的区别,请不要混淆
JAVA_RET_NULL = 0
JAVA_NULL = 0
20 changes: 18 additions & 2 deletions androidemu/java/java_method_def.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from androidemu.java.jvm_id_conter import *
from androidemu.java.java_class_def import JavaClassDef

class JavaMethodDef:

def __init__(self, func_name, func, name, signature, native, args_list=None, modifier=None, ignore=None):
Expand All @@ -16,13 +18,27 @@ def __init__(self, func_name, func, name, signature, native, args_list=None, mod

def java_method_def(name, signature, native=False, args_list=None, modifier=None, ignore=False):
def java_method_def_real(func):
def native_wrapper(self, emulator, *argv):
def native_wrapper(*args, **kwargs):
clz = args[0].__class__
emulator = None
extra_args = None
if (isinstance(clz, JavaClassDef)):
#如果第一个参数是Java类,则是self
emulator = args[1]
extra_args = args[2:]
#
else:
#否则是static方法
emulator = args[0]
extra_args = args[1:]
#

return emulator.call_native(
native_wrapper.jvm_method.native_addr,
emulator.java_vm.jni_env.address_ptr, # JNIEnv*
0xFA, # this, TODO: Implement proper "this", a reference to the Java object inside which this native
# method has been declared in
*argv # Extra args.
*extra_args # Extra args.
)
#
def normal_wrapper(*args, **kwargs):
Expand Down
59 changes: 22 additions & 37 deletions example_douyin8.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ class XGorgen(metaclass=JavaClassDef, jvm_name='com/ss/sys/ces/a'):
def __init__(self):
pass

@staticmethod
@java_method_def(name='leviathan', signature='(I[B)[B', native=True)
def leviathan(self, mu):
def leviathan(mu):
pass
#

@staticmethod
@java_method_def(name='meta', signature='(ILandroid/content/Context;Ljava/lang/Object;)Ljava/lang/Object;', native=True)
def meta(self, mu, optype, ctx, obj):
def meta(mu, optype, ctx, obj):
pass
#

Expand Down Expand Up @@ -90,23 +92,8 @@ def njss(mu, i1, o1):
elif i1 == 133:
return String('{}')

return JAVA_RET_NULL

def test(self):
pass


class secuni_b(metaclass=JavaClassDef, jvm_name='com/ss/sys/secuni/b/c'):
def __init__(self):
pass

@java_method_def(name='n0', signature='(Landroid/content/Context;)[B', native=True)
def n0(self, mu):
pass

@java_method_def(name='n1', signature='(Landroid/content/Context;Ljava/lang/String;)I', native=True)
def n1(self, mu):
pass
return JAVA_NULL
#


class UserInfo(metaclass=JavaClassDef, jvm_name='com/ss/android/common/applog/UserInfo'):
Expand Down Expand Up @@ -226,7 +213,6 @@ def hook_code(mu, address, size, user_data):
# Register Java class.
# emulator.java_classloader.add_class(MainActivity)
emulator.java_classloader.add_class(XGorgen)
emulator.java_classloader.add_class(secuni_b)
emulator.java_classloader.add_class(UserInfo)
emulator.java_classloader.add_class(java_lang_System)
emulator.java_classloader.add_class(java_lang_Thread)
Expand Down Expand Up @@ -256,27 +242,26 @@ def hook_code(mu, address, size, user_data):
vf = VirtualFile("/system/bin/app_process32", misc_utils.my_open(path, os.O_RDONLY), path)
emulator.memory.map(0xab006000, sz, UC_PROT_WRITE | UC_PROT_READ, vf, 0)

x = XGorgen()
print("begin meta")
r = x.meta(emulator, 101, 0, String("0"))
r = x.meta(emulator, 102, 0, String("1128"))
r = x.meta(emulator, 1020, 0, String(""))
r = x.meta(emulator, 105, 0, String("850"))

r = x.meta(emulator, 106, 0, String("com.ss.android.ugc.aweme"))
XGorgen.meta(emulator, 101, 0, String("0"))
XGorgen.meta(emulator, 102, 0, String("1128"))
XGorgen.meta(emulator, 1020, 0, String(""))
XGorgen.meta(emulator, 105, 0, String("850"))

r = x.meta(emulator, 107, 0, String("/data/user/0/com.ss.android.ugc.aweme/files"))
r = x.meta(emulator, 108, 0, String("/data/app/com.ss.android.ugc.aweme-1.apk"))
r = x.meta(emulator, 109, 0, String("/sdcard"))
r = x.meta(emulator, 110, 0, String("/data"))
XGorgen.meta(emulator, 106, 0, String("com.ss.android.ugc.aweme"))

print("meta return 0x%08X"%r)
XGorgen.meta(emulator, 107, 0, String("/data/user/0/com.ss.android.ugc.aweme/files"))
XGorgen.meta(emulator, 108, 0, String("/data/app/com.ss.android.ugc.aweme-1.apk"))
XGorgen.meta(emulator, 109, 0, String("/sdcard"))
XGorgen.meta(emulator, 110, 0, String("/data"))

#data = 'acde74a94e6b493a3399fac83c7c08b35D58B21D9582AF77647FC9902E36AE70f9c001e9334e6e94916682224fbe4e5f00000000000000000000000000000000'
#data = bytearray(bytes.fromhex(data))
#n2 = 1562848170
#arr = Array("B", data)

data = 'acde74a94e6b493a3399fac83c7c08b35D58B21D9582AF77647FC9902E36AE70f9c001e9334e6e94916682224fbe4e5f00000000000000000000000000000000'
data = bytearray(bytes.fromhex(data))
n = 1562848170
arr = Array("B", data)
'''
l = [71,57,-52,16,-33,-74,56,-78,88,-1,81,113,90,-56,-109,-114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-89,102,-14,26,-10,-97,-18,-41,27,113,-106,-61,36,106,-12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
l2 = []
for item in l:
Expand All @@ -288,11 +273,11 @@ def hook_code(mu, address, size, user_data):
data2 = bytearray(l2)
n2 = 1585841725
arr2 = Array("B", data2)
'''

#emulator.mu.hook_add(UC_HOOK_CODE, hook_code, emulator)

result = x.leviathan(emulator, n2, arr2)

result = XGorgen.leviathan(emulator, n, arr)
print(''.join(['%02x' % b for b in result]))


Expand Down
6 changes: 3 additions & 3 deletions example_sgmain.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,17 @@ def __init__(self):

@java_method_def(name='sendSyncHttpGetRequestBridge', signature='(Ljava/lang/String;)Ljava/lang/String;', native=False)
def sendSyncHttpGetRequestBridge(self, mu, string):
return JAVA_RET_NULL
return JAVA_NULL
#

@java_method_def(name='sendSyncHttpPostRequestBridge', signature='(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)Ljava/lang/String;', native=False)
def sendSyncHttpPostRequestBridge(self, mu, s1, s2, s3, i1, i2):
return JAVA_RET_NULL
return JAVA_NULL
#

@java_method_def(name='downloadFileBridge', signature='(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;', native=False)
def downloadFileBridge(self, mu, s1, s2):
return JAVA_RET_NULL
return JAVA_NULL
#
#

Expand Down
Binary file modified vfs/dev/log/main
Binary file not shown.

0 comments on commit d055f5b

Please sign in to comment.