提取so文件的特征值

ELF文件格式

这一节文章的标题叫做<提取so文件的特征值>,在这里就不得不说ELF文件的格式. 因为像.o , .so, .exe 为后缀名的文件都是elf格式的文件. ELF 文件格式是一种二进制的文件.它被叫做可执行链接的格式(Executable and Linking Format).

ELF格式文件标准被选作为一种可移植的目标文件被分为三种类型:

  • 可重定位文件(Relocatable File) (*.0)  其包含适用于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据.
  • 可执行文件(Executable File)(*.exe) 包含使用于执行的一个程序,此文件规定了exec()如何创建一个程序的映像.
  • 共享目标文件(Shared Object File)(*.so)包含可在两种上下文链接的代码和数据.首先链接编辑器可以将它和其他的可重定位文件和共享文件一起处理

ELF的数据类型

ELF文件的头部结构

typedef struct{
Elf32_Word sh_name;   //节区名,是节区头部字符串表节区(Section Header String Table Section)的索引。名字是一个 NULL 结尾的字符串。
Elf32_Word sh_type;    //为节区类型
Elf32_Word sh_flags;    //节区标志
Elf32_Addr sh_addr;    //如果节区将出现在进程的内存映像中,此成员给出节区的第一个字节应处的位置。否则,此字段为 0。
Elf32_Off sh_offset;    //此成员的取值给出节区的第一个字节与文件头之间的偏移。
Elf32_Word sh_size;   //此 成 员 给 出 节 区 的 长 度 ( 字 节 数 )。
Elf32_Word sh_link;   //此成员给出节区头部表索引链接。其具体的解释依赖于节区类型。
Elf32_Word sh_info;       //此成员给出附加信息,其解释依赖于节区类型。
Elf32_Word sh_addralign;    //某些节区带有地址对齐约束.
Elf32_Word sh_entsize;    //某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。
}Elf32_Shdr;

每次我看到ELF文件的时候,总会想到的东西就是虫子,因为它们都是一节一节的.(或许这个表述不准确) ELF文件包括了很多的节区(section),这些节区有的是系统预定好的,有些是用户通过.section命令自定义的.

在这里我们需要强调的是一些特殊节区, 这些节区是系统预定的,我们在这里要提一下我们之后需要的提取的节区的特征值

.dynamic 动态链接信息

.dynsym  此节区包含了动态链接符号表

.got 此节区包含了全局偏移表

.plt 过程链接表

.text  此节区包含了程序的可执行指令

如果你想要了解更多这方面的内容,你可以参考这篇文章:

elf文件格式总结

readelf工具

readelf是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用.在提取so文件我们也用到了这个工具.

你可以在这里下载到:http://download.csdn.net/detail/grace_0642/8562495

下面在这里简单介绍一下它的用法:

1.显示ELF Header文件头信息

readelf -h file

===================================

2. 查看文件的程序头表信息

readelf -I file

===================================

3. 显示文件的节信息

readelf -S file

====================================

4.显示 Dynamic Section 信息

readelf -d file

==================================

你还需要知道的事

1.awk的用法

你可以参考这篇文章,写的很好 链接:http://coolshell.cn/articles/9070.html

AWK 简明教程

代码

结构说明:

python脚本调用shell脚本.shell脚本调用readelf工具读取so文件内容信息, readelf工具和脚本放在相同的路径下.

python脚本代码:

'''
@Author : Chicho
@Date : 2014-12-5
@Function : elf parser
@Running : pyhton ELF_Extract.py /path/to/so
'''
import os
import sys

if (len(sys.argv)<2):
    print("*Usage : python ELF_Extract.py /path/to/so")
else:
    path = sys.argv[1]

fileList = os.listdir(path)

'''
we will put the readelf file in the path of so files so that we can

extract the features of ELF 

'''

for filename in fileList:
    portion = os.path.splitext(filename)

# find the .so file
    if portion[1]==".so":
        os.system("./moreelf_finefeatures_extract.sh " + filename )

print "The end"

shell脚本:

#!/bin/bash

INPUT=$1

if [ $# -lt 1 ]; then
    echo "Usage: $0 /path/to/libXXX.so"
    exit 1
fi

READELF=./readelf 

entry_point_addr=$($READELF -h $INPUT| grep "Entry point address:" | egrep -o "0x[0-9A-Za-z]*")
start_section_headers=$($READELF -h $INPUT | grep "Start of section headers:" | egrep -o "[0-9]*")
num_programs=$($READELF -h $INPUT | grep "Number of program headers:" | egrep -o "[0-9]*")
size_section_headers=$($READELF -h $INPUT | grep "Size of section headers:" | egrep -o "[0-9]*")
num_section_headers=$($READELF -h $INPUT | grep "Number of section headers:" | egrep -o "[0-9]*")
string_table_index=$($READELF -h $INPUT | grep "Section header string table index:" | egrep -o "[0-9]*")
dynamic_section=$($READELF -d $INPUT | grep "Dynamic section at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")
dynsym_entries=$($READELF -s $INPUT | grep "Symbol table '.dynsym' contains" | egrep -o "[0-9]*")
num_rel_dyn=$($READELF -r $INPUT | grep "Relocation section '.rel.dyn' at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")
num_rel_plt=$($READELF -r $INPUT | grep "Relocation section '.rel.plt' at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")

echo $entry_point_addr $start_section_headers $num_programs $size_section_headers $num_section_headers $string_table_index $dynamic_section $dynsym_entries $num_rel_dyn $num_rel_plt $label>> more_finefeatures_result.txt

就比如说如果我们还想做点别的事情,比如说判断特定的so文件的特征值:

#!/bin/bash

INPUT=$1

if [ $# -lt 1 ]; then
    echo "Usage: $0 /path/to/libXXX.so"
    exit 1
fi

READELF=./readelf 

entry_point_addr=$($READELF -h $INPUT| grep "Entry point address:" | egrep -o "0x[0-9A-Za-z]*")
start_section_headers=$($READELF -h $INPUT | grep "Start of section headers:" | egrep -o "[0-9]*")
num_programs=$($READELF -h $INPUT | grep "Number of program headers:" | egrep -o "[0-9]*")
size_section_headers=$($READELF -h $INPUT | grep "Size of section headers:" | egrep -o "[0-9]*")
num_section_headers=$($READELF -h $INPUT | grep "Number of section headers:" | egrep -o "[0-9]*")
string_table_index=$($READELF -h $INPUT | grep "Section header string table index:" | egrep -o "[0-9]*")
dynamic_section=$($READELF -d $INPUT | grep "Dynamic section at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")
dynsym_entries=$($READELF -s $INPUT | grep "Symbol table '.dynsym' contains" | egrep -o "[0-9]*")
num_rel_dyn=$($READELF -r $INPUT | grep "Relocation section '.rel.dyn' at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")
num_rel_plt=$($READELF -r $INPUT | grep "Relocation section '.rel.plt' at" | egrep -o "[0-9]* entries" | egrep -o "[0-9]*")

if [[ "$1" =~ "libsecmain"* ]]
then label="Bangcle1"
elif [[ "$1" =~ "libsecexe"* ]]
then label="Bangcle2"
elif [[ "$1" =~ "libtup"* ]]
then label="Tencent"
elif [[ "$1" =~ "libprotectClass"* ]]
then label="Qihoo"
elif [[ "$1" =~ "libexecmain"* ]]
then label="ijiami1"
elif [[ "$1" =~ "libexec"* ]]
then label="ijiami2"
elif [[ "$1" =~ "libapkprotect"* ]]
then label="APKProtect1"
elif [[ "$1" =~ "libcube-jni"* ]]
then label="APKProtect2"
elif [[ "$1" =~ "libminimapv320"* ]]
then label="APKProtect3"
elif [[ "$1" =~ "libswiperctrl"* ]]
then label="APKProtect4"
else
    label="unknow"
fi

echo $entry_point_addr $start_section_headers $num_programs $size_section_headers $num_section_headers $string_table_index $dynamic_section $dynsym_entries $num_rel_dyn $num_rel_plt $label>> more_finefeatures_result.txt

时间: 2024-08-28 16:12:16

提取so文件的特征值的相关文章

案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l

通过使用Oracle DUL工具提取损坏磁盘里的数据库文件中的表及lob字段中内容 在有次8i的库恢复中,因为硬盘损坏导致几个表出现很多诡异性坏块,尝试使用dul对其进行挖掘数据,当时使用dul 9 遇到一个难题:当一张表中有lob类型,同时又有varchar2类型,而且varchar2类型数据中包含回车键,使得解决起来很麻烦(因为export_mode=false支持lob,但是不支持字符串含回车;export_mode=true支持字符串含回车,但是不支持lob),最后放弃了对部分数据的挖掘

DMG提取安装文件

打开原版的DMG文件,选中安装文件,按下鼠标右键,选择显示包内容 <ignore_js_op> 按照下图的路径,一直找到installESD.dmg,双击打开它<ignore_js_op> 挂载之后进入installESD的Packages目录,你就看到了所有的安装包,以系统基本包为例,要提取内核.驱动文件选择使用The Unarchiver打开,需要事先安装该软件. <ignore_js_op> 解压到某个目录,打开终端程序,以我的环境为例,解压的路径为/Volume

利用python 提取log 文件中的关键句子,并进行统计分析

利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/home/alzhong/logs/qtat1/R2860.01.13/sim-applycommitrollback-bld1.log' file=open(file_name,'r') acnum=[];time_res=[];lnum=0 def trans_time(time): t1=datet

电脑中如何提取PDF文件中的图片

通常,我们在一些PDF文件中看到一些好看的图片,想将图片保存下来,但是PDF文件是无法编辑的,在文件自身当中我们无法将图片完成的提取出来,因此大家都会想办法在不破坏图片完整性的情况下将图片从PDF文件中提取出来,下面就跟大家分享一下小编是从电脑中如何提取PDF文件中的图片.借助工具:×××换器1.在PDF文件中提取图片,本身也是一种对文件的编辑,知识PDF文件无法编辑,所以我们要借助工具来进行编辑,工具可以直接在百度浏览器中下载.2.下载安装好工具,打开工具,进入到操作页面,操作页面左边是功能栏

PDF编辑技巧:怎么提取PDF文件中的页面

怎么提取PDF文件中的页面?有些时候我们需要提取PDF文件中的页面,不知道如何操作.想要提取PDF文件中的页面就可以选择使用迅捷PDF编辑器来进行操作,下面就为大家分享一下PDF编辑器如何提取PDF文件页面的操作. 操作软件:迅捷PDF编辑器 具体操作方法如下: 1:首先将迅捷PDF编辑器安装到自己的电脑中,打开PDF编辑器将需要提取页面的PDF文件添加到软件中. 2:在软件的顶部找到文档,点击文档在下面找到提取页面,点击提取页面在软件中会出现一个弹窗. 3:在软件的弹窗中可以找到页面范围,选择

python抓取m3u8文件,并提取.ts文件合成视频

本节抓取手机app视频,charles抓包部分就不演示了,抓包内容如下: 可以直接抓取到.ts视频文件,但全都是视频片段,如果要抓全部的视频,就要找m3u8文件,里边有所有的视频路径,在拼接url前缀,就可以拿到正确的视频url了. 以下是代码部分: import requests import os,sys import re #读取m3u8文件并提取.ts文件路径 url="http://f1.thishs.com/578a7600fb83e8566227a90f3bd926b4/5E64C

c# 提取word文件中的图片问题

最近遇到一个项目就是要从一份word中提取出所有的图片信息,功能看起来不是很难,只要使用office自带的Microsoft.Office.Interop.Word就可以解决问题.网上也有不少的文章来说明如何去实现.不过总体来说网上的内容分为两派一个是使用剪贴板来实现,一个是通过将图片转为byte数组来完成.个人倾向于后者,但是在实践过程中遇到了问题. 问题一:通过byte的方式来实现图片的提取会导致提取出来的图片的质量严重下降,这样的图片质量下降是无法通过修改图片质量的代码来优化和提高的.目前

提取PDF文件中的文本信息

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43527755 我们从网上下载的PDF文件有的是加密处理过的,无法复制其中的内容,对于这类文件的内容提取可以通过该工具实现 PDF加密 PDF文件经过加密处理之后是无法简单的复制的,PDF文件的属性也如下图所示: 工具的使用方法 软件的目录结构如下图: lib文件夹下是程序的运行环境和代码: pdf文件夹是需要转化的pdf文件所在的文件夹: txt文件夹是转化后生成的txt文件所

perl 多fasta文件匹配,并提取匹配文件第一条序列

目标如题,有多个fasta文件和一个文件名列表,将文件名列表中包含的文件匹配出来并提取第一条序列合并成一个fa文件. 这个采用perl实现,用法和代码如下: 1 #!/usr/bin/perl -w 2 use strict; 3 4 sub usage{ 5 die "usage:perl $0 <fa.list> <Fasta_Dir> <merged.fa>\n",unless(@ARGV==3); 6 } 7 usage(); 8 9 ope