首页
社区
课程
招聘
[推荐]跨平台调so函数的框架
发表于: 2019-7-12 11:04 25229

[推荐]跨平台调so函数的框架

2019-7-12 11:04
25229

最近在翻unicorn showcase的时候发现了一套不错的代码,能够非常好的模拟Android Native调用。 于是就瞎改了其代码,使其可以支持跑测试so(x音),并翻译了一份README。
初始化有点慢,log有点慢,大黑阔们们别把初始化搞到任务循环里了~~

d68K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6b7y4r3&6V1j5e0m8K6i4K6u0r3b7h3&6V1M7X3!0A6k6p5&6S2N6r3W2$3k6f1g2E0N6g2)9J5c8R3`.`.

fork from : dcaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6m8k6h3!0F1e0s2g2U0K9h3c8Q4x3V1k6m8L8X3c8J5L8$3W2V1e0X3q4@1K9i4k6W2c8h3#2#2

AndroidNativeEmu 让你能够跨平台模拟Android Native库函数,比如JNI_OnLoad、Java_XXX_XX等函数。
fork from : 8dfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6m8k6h3!0F1e0s2g2U0K9h3c8Q4x3V1k6m8L8X3c8J5L8$3W2V1e0X3q4@1K9i4k6W2c8h3#2#2

小弟不才,修改了一些代码,使其能够运行libcms的leviathan.

运行环境:python 3.7 必须!

Windows上可以跑,自行尝试。

注意看看各项参数的定义

更多的类请见example

init array 已经自动调用了,SO如果有加密也没关系。

 
 
# Initialize emulator
emulator = Emulator(
    vfp_inst_set=True,
    vfs_root=posixpath.join(posixpath.dirname(__file__), "vfs")
)
class java_lang_System(metaclass=JavaClassDef, jvm_name='java/lang/System'):
        def __init__(self):
            pass

        @java_method_def(name='getProperty', args_list=["jstring"] ,signature='(Ljava/lang/String;)Ljava/lang/String;', native=False)
        def getProperty(self, *args, **kwargs):
            print (args[0].value)
            return "2.1.0"
class XGorgen(metaclass=JavaClassDef, jvm_name='com/ss/sys/ces/a'):
    def __init__(self):
        pass

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

    def test(self):
        pass
class java_lang_Thread(metaclass=JavaClassDef, jvm_name='java/lang/Thread'):
    def __init__(self):
        pass

    @java_method_def(name="currentThread", signature='()Ljava/lang/Thread;', native=False)
    def currentThread(self, *args, **kwargs):
        return java_lang_Thread()

    @java_method_def(name="getStackTrace", signature='()[Ljava/lang/StackTraceElement;', native=False)
    def getStackTrace(self, *args, **kwargs):
        return  [java_lang_StackTraceElement("dalvik.system.VMStack"),
                 java_lang_StackTraceElement("java.lang.Thread"),
                 java_lang_StackTraceElement("com.ss.sys.ces.a"),
                 java_lang_StackTraceElement("com.yf.douyintool.MainActivity"),
                 java_lang_StackTraceElement("java.lang.reflect.Method"),
                 java_lang_StackTraceElement("java.lang.reflect.Method"),
                 java_lang_StackTraceElement("android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener"),
                 java_lang_StackTraceElement("android.view.View"),
                 java_lang_StackTraceElement("android.os.Handler"),
                 java_lang_StackTraceElement("android.os.Handler"),
                 java_lang_StackTraceElement("android.os.Looper"),
                 java_lang_StackTraceElement("android.app.ActivityThread"),
                 java_lang_StackTraceElement("java.lang.reflect.Method"),
                 java_lang_StackTraceElement("java.lang.reflect.Method"),
                 java_lang_StackTraceElement("com.android.internal.os.ZygoteInit$MethodAndArgsCaller"),
                 java_lang_StackTraceElement("com.android.internal.os.ZygoteInit"),
                 java_lang_StackTraceElement("dalvik.system.NativeStart")
                 ]
emulator.java_classloader.add_class(XGorgen)
emulator.java_classloader.add_class(java_lang_System)
emulator.java_classloader.add_class(java_lang_Thread)
emulator.java_classloader.add_class(java_lang_StackTraceElement)
# 添加依赖库
emulator.load_library("samples/example_binaries/libdl.so")
emulator.load_library("samples/example_binaries/libc.so")
emulator.load_library("samples/example_binaries/libstdc++.so")
emulator.load_library("samples/example_binaries/libm.so")

lib_module = emulator.load_library("samples/example_binaries/libcms.so")

#   JNI_OnLoad will call 'RegisterNatives'.
emulator.call_symbol(lib_module, 'JNI_OnLoad', emulator.java_vm.address_ptr, 0x00)
x = XGorgen()
data = 'acde74a94e6b493a3399fac83c7c08b35D58B21D9582AF77647FC9902E36AE70f9c001e9334e6e94916682224fbe4e5f00000000000000000000000000000000'
data = bytearray(bytes.fromhex(data))
result = x.leviathan(emulator, 1562848170, data)
  • 模拟 JNI Invocation API so JNI_OnLoad can be called properly.
  • 模拟 memory、malloc、memcpy
  • 支持拦截系统调用(SVC #0)
  • 通过符号Hook
  • 所有 JavaVM, JNIEnv 和 hooked functions 都可以用python来处理
  • 支持 VFP
  • 支持文件系统(也就是说你可以模拟maps、status等文件)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-8-5 13:02 被无名侠编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (35)
雪    币: 412
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排支持
2019-7-12 11:22
0
雪    币: 1039
活跃值: (355)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,谢谢。
2019-7-12 11:34
0
雪    币: 2097
活跃值: (8185)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
仿真器无敌了
2019-7-12 22:00
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
没看懂  先收藏膜拜一波
2019-7-14 23:18
0
雪    币: 4520
活跃值: (5674)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
6
前排支持
2019-7-15 09:55
0
雪    币: 4576
活跃值: (2211)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
win7 不成功啊
2019-7-15 10:29
0
雪    币: 48
活跃值: (108)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
收藏膜拜,无名侠tql
2019-7-18 14:19
0
雪    币: 29
活跃值: (470)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
    # bypass douyin checks
    with open("app_process32", 'rb') as ap:
        data = ap.read()
        len1 = len(data) + 1024 - (len(data) % 1024)
        emulator.mu.mem_map(0xab006000, len1)
        emulator.mu.mem_write(0xab006000, data)
这段代码的含义是啥?
2019-7-19 12:44
0
雪    币: 1244
活跃值: (2176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的
2019-7-19 16:48
0
雪    币: 29
活跃值: (470)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的
error: can't copy 'src/build/llvm/lib/libkeystone.dylib': doesn't exist or not a regular file
我在mac上的时候也遇到类似的这个问题  是因为平台不支持32bit 
需要下载keystone-engine-0.9.1-3 源码
在 src/make-common.sh 中删除i386
最后于 2019-7-19 18:55 被endlif编辑 ,原因:
2019-7-19 18:38
0
雪    币: 1244
活跃值: (2176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
endlif 菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的 error: can't& ...
谢谢师兄,我试一下
2019-7-22 09:04
0
雪    币: 1244
活跃值: (2176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好像计算的xgon有误,也不知道问题出在哪里
通过hook得到的参数是:
copyLove: s=5e17c1a25e40f2fc6d8305967f254c2d00000000000000000000000000000000d760a91c971b53507a536ff2da44d80900000000000000000000000000000000
xgon=03006cc0000001f5e81da76ab90577cdef8d7b81af152ccb76af
通过大佬调用后的计算结果是:
03000000000047a0d83f4f61076af53deea6c36eade7f1811710
明显不一致啊
2019-7-24 16:15
1
雪    币: 7129
活跃值: (9949)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
14
菜年richor 好像计算的xgon有误,也不知道问题出在哪里 通过hook得到的参数是: copyLove: s=5e17c1a25e40f2fc6d8305967f254c2d00000000000000000 ...
仅做参考,已被和谐
2019-7-25 17:02
0
雪    币: 1244
活跃值: (2176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
无名侠 仅做参考,已被和谐
近距离膜拜大佬,看你的视频入门的,受益匪浅,感谢
2019-7-25 17:25
0
雪    币: 3618
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
<删除>
最后于 2019-9-3 14:21 被YoHooo编辑 ,原因:
2019-9-3 11:14
0
雪    币: 8310
活跃值: (4332)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
YoHooo zhoudeMacBook-Pro:samples zhou$ python3 example.py 2019-09-03 11:09:59,484 DEBUG androide ...
启用vfs试试?
# Initialize emulator
emulator = Emulator(
    vfp_inst_set=True,
    vfs_root=posixpath.join(posixpath.dirname(__file__), "vfs")
)
2019-9-3 12:23
0
雪    币: 3618
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
breaklink 启用vfs试试? # Initialize emulator emulator = Emulator( vfp_inst_set=True, vfs_root=posixpat ...
找到问题了000K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6m8k6h3!0F1e0s2g2U0K9h3c8Q4x3V1k6m8L8X3c8J5L8$3W2V1e0X3q4@1K9i4k6W2c8h3#2#2i4K6u0r3K9i4y4K6N6h3g2K6i4K6u0r3z5l9`.`.
2019-9-3 12:36
0
雪    币: 3618
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
又遇到了一个问题。。

Traceback (most recent call last):
  File "samples/example_douyin.py", line 152, in <module>
    result = x.leviathan(emulator, 1562848170, data)
  File "/Users/Desktop/AndroidNativeEmu-master/androidemu/java/java_method_def.py", line 24, in native_wrapper
    *argv  # Extra args.
  File "/Users/Desktop/AndroidNativeEmu-master/androidemu/emulator.py", line 143, in call_native
    self.mu.emu_start(addr, stop_pos - 1)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/unicorn/unicorn.py", line 286, in emu_start
    status = _uc.uc_emu_start(self._uch, begin, until, timeout, count)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
最后于 2019-9-3 15:21 被YoHooo编辑 ,原因:
2019-9-3 15:21
0
雪    币: 1
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
YoHooo 又遇到了一个问题。。Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last):&nbsp;&nbsp; ...
同遇到了这个问题,这个开源项目跑的我好难受……
猜测有可能是抖音更新了,这个方法在JNI_Onload里不再注册导致了该函数的地址变成了None?
还请大佬解答!
最后于 2019-9-4 16:03 被bwmaples编辑 ,原因:
2019-9-3 18:44
0
雪    币: 144
活跃值: (718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
问一个问题,你给的测试厘子libnative-lib.so导出函数经过了名称修饰string_from_jni修饰为_Z13stringFromJNIP7_JNIEnvP8_jobject,但是现在安卓编译的apk导出函数并没有修饰,例如,Java_cn_cfanr_jnisample_FieldJni_addNum,根本就没修饰,所以我调用出现typeerror错误,该怎么解决
2019-9-25 17:53
0
雪    币: 1595
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
22
endlif 菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的 error:&nbsp;can't& ...
在Window10下也出现了这种错误,在此记录下解决方法:就是直接去官网(2faK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3E0W2P5i4y4@1L8$3&6W2i4K6u0V1k6h3&6Y4K9h3&6W2i4K6u0W2L8%4u0Y4i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0S2Q4b7V1c8Q4b7V1c8b7P5i4c8Z5L8$3&6Q4x3U0k6F1j5Y4y4H3i4K6y4n7L8h3!0V1N6h3I4W2i4K6t1$3L8X3u0K6M7q4)9K6b7X3k6G2M7W2)9J5y4X3&6T1M7%4m8Q4x3@1u0i4K9h3&6V1L8%4N6K6i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9J5k6q4)9J5y4X3&6T1M7%4m8Q4x3@1u0n7K9h3&6S2M7X3W2W2M7#2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4#2)9^5y4q4!0n7y4W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4g2)9&6b7#2!0m8z5q4!0q4y4#2)9&6y4q4!0n7y4g2!0q4z5q4)9^5y4q4)9&6x3g2!0q4y4q4!0n7z5q4)9^5b7g2!0q4y4g2!0m8c8g2)9^5z5g2!0q4z5q4!0m8x3#2)9^5y4g2!0q4y4g2)9^5c8q4!0n7x3#2!0q4y4g2)9^5c8W2!0m8c8R3`.`.
2019-12-3 17:09
0
雪    币: 1595
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
23
endlif 菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的 error:&nbsp;can't& ...
没有jni_load的so怎么调用java_开头的函数?直接注释调用jni_load那行代码的话,后面执行直接就报错了,提示如下





2019-12-3 18:44
0
雪    币: 1595
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
24
zylyy 问一个问题,你给的测试厘子libnative-lib.so导出函数经过了名称修饰string_from_jni修饰为_Z13stringFromJNIP7_JNIEnvP8_jobject,但是现在安 ...
跟我遇到的问题一样,解决没?
2019-12-4 09:50
0
雪    币: 1595
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
25
bwmaples YoHooo 又遇到了一个问题。。Traceback&amp;nbsp;(most&amp;nbsp;recent&amp;nbsp; ...
跟我遇到的问题一样,解决没?
2019-12-4 09:51
0
游客
登录 | 注册 方可回帖
返回