Lasly的专栏

Endless Silence

用户操作
[即时聊天] [发私信] [加为好友]
LaslyID:FlyLasly
67966次访问,排名1667,好友1人,关注者4人。
FlyLasly的文章
原创 28 篇
翻译 0 篇
转载 0 篇
评论 780 篇
Lasly的公告
Fly me to the moon
Let me sing among those stars
Let me see what spring is like
On Jupiter and Mars

In other words, hold my hand
In other words, baby kiss me

Fill my heart with song
Let me sing for ever more
You are all I long for
All I worship and adore

In other words, please be true
In other words, I love you
最近评论
sunny:同求一份sdk的补丁及sfc源码
sunnylqm#qq.com
感激不尽
chimpane:怎么下不来阿
insulted:不知道博主用的是什么编译器啊,我用了vc6,vc7,还有gcc,都没有在*( (int *)( p + i ) ) = a;后出现内存为:03 00 00 00 03 00 00 00,
仍然与使用memcpy( p + i , &a , 3 )的结果一样!
abcboy:Lasly大大加油阿,168的大大一个接一个走了,好可惜阿,兔的未来就靠你啦~
lionwonder:请问这个GB测试版如何存档啊?
没法存档,很郁闷啊
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何在没有资料的情况下调用Linux链接库收藏

    新一篇: 好久没有更新了 | 旧一篇: 最近的流水帐

    引言

    Moto E2是一部具有相当性价比的Linux智能手机,但是由于某些商业上的原因并没有开放其本地的图形库SDK,导致其竞争力与扩展性大幅度的降低。本文以我在编写其应用中获得的经验,介绍如何在没有相关资料的情况下导出对应的头文件并且编写相应的程序代码。

    注意,本文并非面对一般的手机用户,如果想顺利的阅读这篇文章,请首先学习一些相关的C/C++知识以及编译知识。当然,由于本人所学限制,可能有错误,甚至是缪误,也欢迎众多高手斧正讨论。另外,这篇文章所描述的方法并不只限于Moto E2EZX图形库的使用方法,理论上能够应用于任何类似的环境。



    . 原理

    为了破解这些没有资料的动态连接库,首先必须理解在linux下面的程序编译。下面首先假定需要破解的动态连接库是某个系统的基础(例如,Moto E2手机的图形库即EZX,这是一个基于QT2.3.8的扩展图形库,也就是我们需要破解的部分),否则作为非通用性(仅对当前系统而言)没有任何的实际意义。

    Linux的程序在链接库的使用方式上有三种。

    1.编译时链接.a库文件并将起代码拷贝到生成的二进制文件中,运行时脱离.a库文件运行。

    2.编译时链接.so库文件并将其作为引用生成二进制文件,运行时需要依赖相应.so文件。

    3.在程序用以动态链接库的方式调用相关的.so库文件,在编译器不依赖这些.so文件,但是在运行期需要依赖这些.so文件。

    作为现状来说,第一种方式首先被排除了,因为作为发行版不可能有.a静态链接库。第三种方式也并不适合,因为在编译器不依赖库文件,导致我们不能正确的判断相应函数的类型,反而造成破解效率的低下,当然还有更重要的原因会在后面提到。因此选择第二中方式是比较合适的。

    那么,使用第二种方式我们需要那些东西才能正确的编译一个程序呢?

    首先,源代码是必须的,就是真正我们写的程序;其次,是so链接库,这是我们程序运行的基础;最后,是连接程序和so链接库的头文件。这个头文件是用于描述so链接库的基础。(当然,一个相应的gcc也必不可少)。

    源文件是我们自己写的东西,so文件是从目标系统中导出的,现在我们缺乏的仅仅是相应的头文件。只要我们得到这个头文件,即可自由的编译基于目标系统的程序。

    另外补充一点,用这种方式生成的二进制可执行文件和so链接库的联系在调用时依赖的是函数名称的文本方式,这也是我们破解原理的基础。

    . 导出函数列表

    由于能够找到相应的gcc以及导出so链接库,大部分人都能够通过简单的nm命令导出so链接库的函数列表,只需要对相应的so链接库(例中链接库名称为a.so)

    arm-linux-nm -gsDC --format=bsd –defined-only a.so

    当然在运行这段代码之前要设定正确的环境变量,本文重在讲述原理,这些具体实施细节上就不那么严谨了。当然你也可以使用其他的方式来调用nm指令,只是上面给出的参数能够获得至少是我比较满意的效果。

    这样就可以导出这个库文件的导出函数库。例如某so文件的导出函数库为:

    ...

    4184cde8 T colorToString(QColor)

    418ab0c4 T setLanguageId(int)

    4184cb70 T stringToColor(QString)

    ....

    41a21244 T KbAltItems::initMetaObject()

    41a21358 T KbAltItems::staticMetaObject()

    41a21424 T KbAltItems::signalChooserResults(int, int, QString const&, int)

    41a212b8 T KbAltItems::tr(char const*)

    ......

    在这里我们可以得到相应的函数声明,唯一没有的仅仅是返回值,幸好作为基础库函数一般来说有良好的命名规范,我们大体上能够从函数名称上猜出其返回值。当然这或许需要一定的经验积累以及良好的运气作为基础。

    比如

    4184cde8 T colorToString(QColor)

    4184cb70 T stringToColor(QString)

    这两个函数明显是一对配对的函数进行颜色和字符串的相互转换,那么其正确的形态我们能够很简单的得出:

    QString colorToString(QColor)

    QColor stringToColor(QString)

    这样在我们的程序中直接声明这样的函数,并且在编译时指明链接相应的so文件就能成功的编译通过并且使用这两个函数为我们的程序服务。

    当然在很多时候这些函数并非那么轻易的得出返回值的说明,有时候对于某些函数放弃返回值,直接声明void或许是一个比较好的折衷选择。

    如果你的目标是纯C的链接库,恭喜你,现在你已经成功的破解并且能够使用了,当然我相信既然你点开了这篇文档,那么你的目标系统必然不是纯C写的系统。那么,对于C++的链接库应该怎么处理呢?

    . 处理C++的导出函数

    C++的导出函数构造成为一个类,并且能够正常的使用,这是一个漫长的过程,期间拼的不仅仅是良好的技术和丰富的经验,优秀的运气和富有亲和力的人品才是是否能够搞定一个系统的关键(笑,我就是因为这几个方面都比较欠缺所以导出的SDK到现在都是一个半吊子)。

    首先,我们需要明确的一点是,so链接库中,仅仅是函数列表的集合,任何一个类的成员函数,在这里只是名称比C函数古怪的普通函数而已。这可能和大家想象的有些大相径庭,不过正是以为如此我们才使用前面所说的三种方法中的第二种的最根本原因。

    因此,一切抱有so中含有类的正确格式信息的想法都是不现实以及不实际的,因为so链接库中根本就没有所谓的C++概念,一切都是编译器的杰作而已。

    还是不提这些问题,我们先把一个类函数表组成一个类的形式:(如上面得到的结果片段)

    class KbAltItems

    {

    public:

    void initMetaObject() ;

    void staticMetaObject() ;

    void signalChooserResults(int, int, QString const&, int) ;

    void tr(char const*) ;

    };

    (由于系统的特殊性,某些函数的特殊处理不再本文的讨论之列)

    当然既然是导出函数,必然函数是可见的,属性都是public。这时候这样构成一个class已经能够正确的编写程序并且通过编译了,不过很遗憾的是,只要一使用这个类,无论是如何使用,都会立即崩溃,segment fault

    原因事实上很简单:这个类定义里面没有定义正确的成员变量。

    无论是直接声明一个类的对象或者使用new方式,一个对象的大小是在编译期决定的,其大小是根据头文件中类的大小决定的,我们导出的class中没有含有相应的成员变量,大小为4(当然为什么一个什么都没有的类的对象也有4个字节的大小就是另外一段故事了,这里暂时不讨论)。一旦这些成员函数想要调用并没有分配但是被它“认为”是存在的成员变量时,就会访问到不恰当的内存单元激发系统的内存异常,segment fault也是很平常的事情了。

    由于so中不存在相应的类格式,那么正确的使用一个类是不可能的事情了么?那也未必。事实上有一种非常粗旷的方法来规避这个问题,当然这个也是这篇文章唯一值得炫耀的一点了:

    在类的定义中加入 char tmp[X];作为成员变量。

    X的大小我们能够通过简单的测试的出来,通过这样再试试,是不是以前不能运行的类能够正确运行了?

    其原理也非常简单,既然对象没有足够的空间来正确的执行,那么我们就给它分配一个足够大的空间让它正确的执行。

    这样,源代码、库、头文件我们都有了,那么,应用程序还会远么?

    写在最后

    事实上,成功的构造一个类远远不止这些;首先要揣摩类的正确使用方法;其次,类之间的继承关系我们只有通过类函数的相关性和类名称的联系进行“有限的猜想”。当然,由于使用了上述的那种粗旷的解决方法,只要保证使用了足够的空间将起所有父类都包括进来,也并非必须;另外,还要对整个系统的架构进行彻底的分析,否则不能将其连接起来;最后,枚举能够通过强制转换int值的方式进行转换,而纯粹的结构体就必须直接放弃了,因为除了名字什么也没有,我们只有通过更彻底的阅读反编译的代码进行解读,破解系统时太消耗时间了。

    最后是一个小技巧:对于类中难以使用的类(比如依赖其他的类作为参数的),直接注释掉就好了,对于链接仅仅链接使用了的函数,没有使用的函数是不处理的。

    预祝对某些系统想入非非的程序员能够获得一个让自己满意的结果^o^

    发表于 @ 2007年09月20日 02:13:00|评论(loading...)|编辑

    新一篇: 好久没有更新了 | 旧一篇: 最近的流水帐

    评论

    #passi 发表于2007-09-20 10:57:46  IP: 58.217.141.*
    精品文章.喜欢lasly的低调和学识。
    关于SDK的破解,我想LASLY也已经看到相关新闻了。开发GGLIVE的3G公司在论坛声明已经依靠自己的能力破解了部分E2的SDK。9月28日会推出E2可以使用的GGLIVE MPKG程序。我们拭目以待吧。或许lasly可以少走点弯路。
    #Oo枝漓破碎ツ 发表于2007-09-20 12:43:39  IP: 59.63.10.*
    看不太明白 纯支持好了
    #linzy69 发表于2007-09-20 13:06:39  IP: 59.56.45.*
    纯支持了先....
    #t 发表于2007-09-20 18:19:28  IP: 221.131.128.*
    纯支持LASLY
    #cash 发表于2007-09-20 18:27:03  IP: 220.154.175.*
    支持```
    #maxwu 发表于2007-09-20 18:41:56  IP: 218.22.21.*
    太难了~~~
    加油啊 ~~~qt貌似挺久没更新了
    #FreeStyle 发表于2007-09-20 19:06:46  IP: 59.35.151.*
    纯支持...

    太难了
    #kewulei 发表于2007-09-21 14:52:10  IP: 219.131.118.*
    厉害,复杂。。。
    #ahshow 发表于2007-09-21 16:55:02  IP: 122.9.241.*
    可惜我不是做c、c++的,底层的语言还是比较强的
    #cash 发表于2007-09-22 18:25:40  IP: 220.154.176.*
    大大都在忙什么啊!???
    期待你们的研究成果
    #cnlcg 发表于2007-09-22 21:22:56  IP: 220.205.111.*
    破解???
    #yanliwenwen 发表于2007-09-23 23:49:33  IP: 60.210.220.*
    good
    #zhuran_lili 发表于2007-09-24 14:03:26  IP: 61.145.128.*
    学习下
    #vjian 发表于2007-09-24 22:24:12  IP: 124.21.34.*
    看不太明白 纯支持好了
    #cash 发表于2007-09-25 19:45:47  IP: 211.95.235.*
    最近在做什么!??
    #阿七[seven] 发表于2007-09-26 17:28:20  IP: 218.19.70.*
    似懂非懂状态,呵呵

    终于算是公布了一下破解方法了。
    #阿七[seven] 发表于2007-09-26 17:30:27  IP: 218.19.70.*
    忘了说了,其实现在的SDK已经可以做不少有用的东西了。

    谢谢大大的贡献!
    #cash 发表于2007-09-27 19:27:37  IP: 211.95.227.*
    支持````期待
    #ahshow 发表于2007-09-28 17:07:47  IP: 124.21.163.*
    支持你继续开发E2的好软件,要不是我是做。net的我也做着玩玩
    #LEE 发表于2007-09-28 21:25:12  IP: 219.131.192.*
    真是大虾啊!
    #max 发表于2007-10-01 18:20:21  IP: 220.178.46.*
    等待奇迹的发生```吼吼
    #cash 发表于2007-10-02 15:05:27  IP: 220.154.175.*
    怎么一点动静都没有啊
    #cash 发表于2007-10-07 20:22:07  IP: 220.154.173.*
    怎么没有更新过啊!
    #cash 发表于2007-10-25 21:38:55  IP: 211.95.226.*
    Lalsy ne
    #max 发表于2007-10-26 12:59:30  IP: 220.178.46.*
    好久没更新了
    #cash 发表于2007-11-03 21:19:13  IP: 211.95.230.*
    `zzzzz
    #一蓝 发表于2008-01-13 10:43:58  IP: 61.50.133.*
    LASLY,我支持你~~请你一定要加油~
    #shengweiaini 发表于2008-04-10 21:37:37  IP: 121.229.59.*
    路过
    纯属支持
    #gera 发表于2008-08-23 11:28:37  IP: 125.163.96.*
    mcnr
    #bluehouse1985 发表于2008-09-24 12:01:12  IP: 116.231.42.*
    Linux 环境下的多核调试
    — Intel + Totalview 强强联合!
    目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
    Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
    TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
    XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!

    一、报名方式:
    电话:021-62128912/010-84492749
    Email:Marketing@xlsoft.com.cn

    二、讲座内容:
    1. Linux 平台下程序调试工具概述
    2. Intel 软件功能介绍
    3. Totalview Debugger功能介绍

    三、讲座时间:
    2008年10月30日(星期四)14:00 ~ 17:00

    四、讲座地点:
    上海青松城大酒店3楼长悦厅
    (徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)

    四、活动详情:
    联系人:王娟
    Tel:021-62128916 Mobile: 15000262606
    E-mail:kiko.wang@xlsoft.com.cn

    咨询热线:
    021-62128912 010-84492749
    更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。

    上海世全软件信息技术有限公司
    联系电话 上海:021-62128912 北京:010-84492749

    #bluehouse1985 发表于2008-09-24 12:12:59  IP: 116.231.56.*
    Linux 环境下的多核调试
    — Intel + Totalview 强强联合!
    目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
    Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
    TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
    XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!

    一、报名方式:
    电话:021-62128912/010-84492749
    Email:Marketing@xlsoft.com.cn

    二、讲座内容:
    1. Linux 平台下程序调试工具概述
    2. Intel 软件功能介绍
    3. Totalview Debugger功能介绍

    三、讲座时间:
    2008年10月30日(星期四)14:00 ~ 17:00

    四、讲座地点:
    上海青松城大酒店3楼长悦厅
    (徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)

    四、活动详情:
    联系人:王娟
    Tel:021-62128916 Mobile: 15000262606
    E-mail:kiko.wang@xlsoft.com.cn

    咨询热线:
    021-62128912 010-84492749
    更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。

    上海世全软件信息技术有限公司
    联系电话 上海:021-62128912 北京:010-84492749

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © Lasly