首页
社区
课程
招聘
[原创]linux下调用共享库非导出函数
发表于: 2016-7-29 13:55 10316

[原创]linux下调用共享库非导出函数

2016-7-29 13:55
10316

在逆向共享库(.so)时,有时候需要逐一的验证函数的正确性,需要单独调用共享库中的函数(解决该问题,可以更方便的验证逆向结果),对于导出函数,没什么可说,使用dlopen、dlsym等,可以直接调用,那么非导出函数怎么调用呢?
        解决该问题,可以从两方面入手:
        1.修改.so文件中各个函数的属性,把所有函数全部导出
        2.尝试获取到非导出函数在虚拟内存中的地址,使用函数地址调用该函数
        由于.so可能面临加密等问题,我们暂时不讨论第一种方法,本文先介绍第二种方法。导出函数和非导出函数的差别不外乎就是函数的visibility属性,直观上,我们可以获取到库的基址和导出函数的相对地址,这是我们的已知信息。

先做一下准备工作,1.建库---2.获取地址信息

共享库:share

#include <stdio.h>

///print大写的ABCD
 void PrintABCD()//__attribute__((visibility("hidden")))
{
  printf("ABCD\n");
  sleep(-1);
}

///print小写的abcd
__attribute__((visibility("hidden"))) void Printabcd()//
{
  printf("abcd\n");
  sleep(-1);
}

///根据参数来确定print ABCD or abcd
void PrintIt(int isPrintCapital)
{
  if(isPrintCapital)
  {
    PrintABCD();
  }
  else
  {
    Printabcd();
  }
  printf("over!\n");
}

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

收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 42
活跃值: (492)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
函数的执行,只要找到相应的位置,传对参数就行。可以不需要func = addr-33; 只要知道函数原型:func=base+相对文件位置  (base位so或者可执行文件在内存中的基地址)
2016-7-30 15:41
0
雪    币: 18
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
是一样的吧
2016-8-1 09:55
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
还可以暴力搜索
2016-8-2 00:57
0
雪    币: 457
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嘻嘻嘻谢谢楼主的分享。
2016-8-2 14:56
0
雪    币: 312
活跃值: (123)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
Linux ubuntu 3.17.1 #1 SMP Fri Oct 24 09:08:26 PDT 2014 x86_64 GNU/Linux
版本nm -D xx.so可以看到非导出函数的偏移啊 只不过是t不是T
000000000000068c T PrintABCD
00000000000006ce T PrintIt
00000000000006ad t Printabcd
2016-8-17 00:30
0
游客
登录 | 注册 方可回帖
返回
//