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

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

2019-7-12 11:04
25066

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

https://github.com/P4nda0s/AndroidNativeEmu/

fork from : https://github.com/AeonLucid/AndroidNativeEmu

AndroidNativeEmu 让你能够跨平台模拟Android Native库函数,比如JNI_OnLoad、Java_XXX_XX等函数。
fork from : https://github.com/AeonLucid/AndroidNativeEmu

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

运行环境:python 3.7 必须!

Windows上可以跑,自行尝试。

注意看看各项参数的定义

更多的类请见example

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

 
 
1
2
3
4
5
# Initialize emulator
emulator = Emulator(
    vfp_inst_set=True,
    vfs_root=posixpath.join(posixpath.dirname(__file__), "vfs")
)
1
2
3
4
5
6
7
8
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"
1
2
3
4
5
6
7
8
9
10
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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")
                 ]
1
2
3
4
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)
1
2
3
4
5
6
7
8
9
10
# 添加依赖库
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)
1
2
3
4
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等文件)

[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2019-8-5 13:02 被无名侠编辑 ,原因:
收藏
免费 4
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-24 04:24
无名侠
为你点赞~
2020-8-21 12:53
StriveMario
为你点赞~
2019-9-18 17:56
richor
为你点赞~
2019-7-19 16:41
最新回复 (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
雪    币: 2121
活跃值: (7602)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
仿真器无敌了
2019-7-12 22:00
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
没看懂  先收藏膜拜一波
2019-7-14 23:18
0
雪    币: 4211
活跃值: (5334)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
6
前排支持
2019-7-15 09:55
0
雪    币: 4576
活跃值: (2211)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
win7 不成功啊
2019-7-15 10:29
0
雪    币: 48
活跃值: (78)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
收藏膜拜,无名侠tql
2019-7-18 14:19
0
雪    币: 29
活跃值: (420)
能力值: ( 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
雪    币: 1184
活跃值: (2019)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的
2019-7-19 16:48
0
雪    币: 29
活跃值: (420)
能力值: ( 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
雪    币: 1184
活跃值: (2019)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
endlif 菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的 error: can't& ...
谢谢师兄,我试一下
2019-7-22 09:04
0
雪    币: 1184
活跃值: (2019)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好像计算的xgon有误,也不知道问题出在哪里
通过hook得到的参数是:
copyLove: s=5e17c1a25e40f2fc6d8305967f254c2d00000000000000000000000000000000d760a91c971b53507a536ff2da44d80900000000000000000000000000000000
xgon=03006cc0000001f5e81da76ab90577cdef8d7b81af152ccb76af
通过大佬调用后的计算结果是:
03000000000047a0d83f4f61076af53deea6c36eade7f1811710
明显不一致啊
2019-7-24 16:15
1
雪    币: 7010
活跃值: (9619)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
14
菜年richor 好像计算的xgon有误,也不知道问题出在哪里 通过hook得到的参数是: copyLove: s=5e17c1a25e40f2fc6d8305967f254c2d00000000000000000 ...
仅做参考,已被和谐
2019-7-25 17:02
0
雪    币: 1184
活跃值: (2019)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
无名侠 仅做参考,已被和谐
近距离膜拜大佬,看你的视频入门的,受益匪浅,感谢
2019-7-25 17:25
0
雪    币: 3613
活跃值: (835)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
<删除>
最后于 2019-9-3 14:21 被YoHooo编辑 ,原因:
2019-9-3 11:14
0
雪    币: 7898
活跃值: (3962)
能力值: ( 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
雪    币: 3613
活跃值: (835)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
breaklink 启用vfs试试? # Initialize emulator emulator = Emulator( vfp_inst_set=True, vfs_root=posixpat ...
找到问题了https://github.com/AeonLucid/AndroidNativeEmu/issues/8
2019-9-3 12:36
0
雪    币: 3613
活跃值: (835)
能力值: ( 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
活跃值: (488)
能力值: ( 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
雪    币: 1795
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
22
endlif 菜年richor 膜拜大佬,安装keystone的时候出现问题,能不能帮我看一下,pip是最新版的 error:&nbsp;can't& ...
在Window10下也出现了这种错误,在此记录下解决方法:就是直接去官网(http://www.keystone-engine.org/download/)下载Python module for Windows - Binaries,然后在电脑上安装即可
2019-12-3 17:09
0
雪    币: 1795
活跃值: (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
雪    币: 1795
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
24
zylyy 问一个问题,你给的测试厘子libnative-lib.so导出函数经过了名称修饰string_from_jni修饰为_Z13stringFromJNIP7_JNIEnvP8_jobject,但是现在安 ...
跟我遇到的问题一样,解决没?
2019-12-4 09:50
0
雪    币: 1795
活跃值: (2539)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
25
bwmaples YoHooo 又遇到了一个问题。。Traceback&amp;nbsp;(most&amp;nbsp;recent&amp;nbsp; ...
跟我遇到的问题一样,解决没?
2019-12-4 09:51
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册