⑴ 如何利用ndk-stack工具查看so库的调用堆栈
1、保存log,先要选中eclipse的LogCat的所有行,点击保存,假设保存到了/User/mac/Desktop/log.txt
2、找到你的so(确保你的so是debug版带调试信息的)所在目录,应该是你的android工程/obj/local/armeabi,假设我的是在/User/mac/Desktop/MyProj/proj.android/obj/local/armbi
2、打开控制台cd到ndk的安装目录
3、敲入命令 ./ndk-stack -sym/User/mac/Desktop/MyProj/proj.android/obj/local/armbi-mp/User/mac/Desktop/log.txt
崩溃堆栈就会显示出来了。
⑵ 有个.so(unix 动态链接库)文件,有办法可以查看它都提供什么样的函数或接口可以调用吗谢谢。
nm 命令 可以看到符号表(不是所有库都包含这些信息,因为代码在执行的时候只用地址,这些信息是调试用的,正式的版权软件不一定包含这些),其中可以看到函数名,和变量名。但是具体传入参数的类型和其他信息,其实在标准C和C++在二进制库文件中是不包括这些信息的,进栈和出栈是在编译阶段决定的。
gdb 调试so所属应用程序的执行,看它的调用函数的传入和传出。
反编译可以获得一些信息,不过过程复杂,因为你要观察汇编代码和地址之间的跳转。如果你只是开发程序的话,获得完善的信息,你只能查看手册。
但是如果你是想用某个版权软件的某个so的功能的话只能反编译分析代码了。如果你具备反编译技能的话,应该不会问这个问题了。所以别伤脑筋了。你火候到了自然都有办法了。
如果借此以营利是违法的。
⑶ 在没有头文件时,如何查看安卓so库中定义的函数
你拿到一个libABC.so库,却没有头文件,这时候你该如何知道这个库中定义了哪些函数呢?
linux/Mac提供了一个神奇的命令: nm 。看例子:
命令的用法是:
⑷ linux下,怎么用shell命令或脚本查看.so文件里面的所有函数名
readelf
readelf -s *.so
objmp
objump -t *.so
⑸ 如何查看 linux 下 so文件
方法一:
文件名已经带有版本号:
这种情况下很容易就能够看到软链指向的文件的版本号是 1.0.1
方法二:
当文件名不带版本号时:如下所示
使用readelf -a ***.so读取出文件的版本号,不过此时只能读取到主版本号,version:1
方法三:
如果文件名不带版本号,且又想知道具体的版本号的时候怎么办呢?
这时候只能使用傻瓜方法,生成md5值与已知版本号的共享库相对比了。
$ md5sum fcrypt.so.1.0.1
fcrypt.so.1.0.1
$ md5sum fcrypt.so
fcrypt.so
两个md5值一致,由此得出版本应该是1.0.1。
⑹ Mac查看so文件的具体信息
了解ELF的文件格式可通过 SO(ELF)文件格式详解 通过命令greadelf -a xxx.so和gobjmp -x xxx.so以及readelf这三个命令得到so的信息 我个人常用readelf命令,具体指令的使用可参考 readelf命令使用说明 运行下述命令: brew update brew install binutils ELF Header: Section Headers:⑺ 如何使用ida查看so库函数名
1、解包对方APK,插入一个:对应SMALI: android.os.SystemClock.sleep(20000);const-wide/16 v0, 0x2710 #20秒invoke-static {v0, v(X-1)}, Landroid/os/SystemClock;->sleep(J)V这里(X-1)对应.local X。
2
另外,有的包在你要调试的那个SO里面有签名保护,反正你重新打了包之后会导致程序运行崩溃,这个相比JAVA修改困难些,建议你用那个签名漏洞来打包。事实上我调试那个SO也遇到过这样,然后打了个签名漏洞的包嵌入的延时函数就可以了。
1) am start -D -n 包名/类名;
2) IDA pro attach 进程, 设置新线程,加载so时断点,continue;
3) 打开ddms, 查看调试端口, jdb attach port;
4) 这个时候应该已经断在新线程,或者加载so处了,在你感兴趣的so处停下来;
5) 另外用ida 打开so,查看你感兴趣的函数偏移, 加上你感兴趣的so的基地址,打上断点,continue, 就大功告成了。
⑻ sap查openso的命令是什么
Openinvoices。sap查openso的命令是Openinvoices。sap为全球企业管理解决方案的提供商,提供完善的ERP、云ERP、CRM、大数据、云计算、供应链、物联网解决方案,实现智造转型。
⑼ 哪个命令可以查看.lib或.so文件
ldd 查看可执行文件链接了哪些 系统动态链接库
nm 查看可执行文件里面有哪些符号
strip 去除符号表可以给可执行文件瘦身
如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令
strings
Linux操作系统上面的动态共享库大致分为三类:
1、操作系统级别的共享库和基础的系统工具库
比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录。此外还可能有其他特定Linux版本的系统库目录。
这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。
2、应用程序级别的系统共享库
并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local /lib下面去寻找共享库。
以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:
/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib
假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用 ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig 命令即可。
ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:
strings /etc/ld.so.cache | grep ImageMagick
输出结果为:
/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已经成功了!
3、应用程序独享的动态共享库
有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置 LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。