RIPS源码精读(二):扫描对象的实例化及token信息的生成
很早就有深入分析学习一款源代码审计工具的想法,在查找rips源码分析相关资料时,发现相关的学习分析资料较少,于是选择rips作为该系列文章的分析对象,因为没有最新版的rips的源码,因此选取的rips源码为已公开的版本。因为我是第一次将具体的分析写下来,并且本身的技术能力问题,在某些场景下的用语或者技术细节描述可能存在偏差,请师傅们包涵。上一篇文章:RIPS源码精读(一):逻辑流程及lib文件夹大致说明
引言
在main.php的171行附近,rips对Scanner类进行了实例化,并由此进入正式的分析流程。
内容简介
阅读rips关于token分析处理相关的源码,并分析对应的用途及处理逻辑。
Scanner类
首先是调用Scanner类的构造函数
$scan = new Scanner($file_scanning, $scan_functions, $info_functions, $source_functions);
各参数说明如下:
$file_scanning:待扫描文件的文件名
$scan_functions:待扫描的函数类型,由 main.php 中 $_POST['vector'] 的值决定
$info_functions:由 main.php 中 Info::$F_INTEREST 而来,是一个已定义的函数名数组
$source_functions:由 main.php 中 Sources::$F_OTHER_INPUT 而来,是一个已定义的函数名数组
Scanner类构造函数分析
Scanner构造函数定义如下:
function __construct($file_name, $scan_functions, $info_functions, $source_functions)
首先是大量的变量初始赋值:
//直接传参获取的参数
$this->file_name = $file_name;
$this->scan_functions = $scan_functions;
$this->info_functions = $info_functions;
$this->source_functions = $source_functions;
//......
其中夹杂着Analyzer类的初始化,用于获取php的include_path配置
$this->include_paths = Analyzer::get_ini_paths(ini_get("include_path"));
紧接着便是根据文件生成token信息
$tokenizer = new Tokenizer($this->file_pointer);
$this->tokens = $tokenizer->tokenize(implode('',$this->lines_pointer));
unset($tokenizer);
在讲这几行作用之前,要先了解token_get_all函数
token_get_all()函数简单介绍
php手册说明如下
token_get_all() 解析提供的 source 源码字符,然后使用 Zend 引擎的语法分析器获取源码中的 PHP 语言的解析器代号
函数定义
array token_get_all ( string $source )
示例代码
echo 123;>
token_get_all()处理语句
token_get_all(" echo 123;>");
处理结果
Array
(
[0] => Array
(
[0] => 376
[1] =>
[2] => 1
)
[1] => Array
(
[0] => 319
[1] => echo
[2] => 1
)
[2] => Array
(
[0] => 379
[1] =>
[2] => 1
)
[3] => Array
(
[0] => 308
[1] => 123
[2] => 1
)
[4] => ;
[5] => Array
(
[0] => 378
[1] => ?>
[2] => 1
)
)
可以看到,代码被分割成了五段,其中除了第四段之外,每一段都分为三段.
我们设$token=token_get_all(....),那么$token[0]便对应着
Array
(
[0] => 376
[1] =>
[2] => 1
)
则$token[0][1]对应
那么下一个问题便是$token[0]对应数组中的三个值,分别代表什么意思,解释如下:
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
很早就有深入分析学习一款源代码审计工具的想法,在查找rips源码分析相关资料时,发现相关的学习分析资料较少,于是选择rips作为该系列文章的分析对象,因为没有最新版的rips的源码,因此选取的rips源码为已公开的版本。因为我是第一次将具体的分析写下来,并且本身的技术能力问题,在某些场景下的用语或者技术细节描述可能存在偏差,请师傅们包涵。上一篇文章:RIPS源码精读(一):逻辑流程及lib文件夹大致说明
引言
在main.php的171行附近,rips对Scanner类进行了实例化,并由此进入正式的分析流程。
内容简介
阅读rips关于token分析处理相关的源码,并分析对应的用途及处理逻辑。
Scanner类
首先是调用Scanner类的构造函数
$scan = new Scanner($file_scanning, $scan_functions, $info_functions, $source_functions);
各参数说明如下:
$file_scanning:待扫描文件的文件名
$scan_functions:待扫描的函数类型,由 main.php 中 $_POST['vector'] 的值决定
$info_functions:由 main.php 中 Info::$F_INTEREST 而来,是一个已定义的函数名数组
copyright 无奈人生
$source_functions:由 main.php 中 Sources::$F_OTHER_INPUT 而来,是一个已定义的函数名数组
Scanner类构造函数分析
Scanner构造函数定义如下:
function __construct($file_name, $scan_functions, $info_functions, $source_functions)
首先是大量的变量初始赋值:
//直接传参获取的参数
$this->file_name = $file_name;
$this->scan_functions = $scan_functions;
$this->info_functions = $info_functions;
$this->source_functions = $source_functions;
//......
其中夹杂着Analyzer类的初始化,用于获取php的include_path配置
$this->include_paths = Analyzer::get_ini_paths(ini_get("include_path"));
紧接着便是根据文件生成token信息
$tokenizer = new Tokenizer($this->file_pointer);
$this->tokens = $tokenizer->tokenize(implode('',$this->lines_pointer));
unset($tokenizer);
在讲这几行作用之前,要先了解token_get_all函数
token_get_all()函数简单介绍
php手册说明如下
token_get_all() 解析提供的 source 源码字符,然后使用 Zend 引擎的语法分析器获取源码中的 PHP 语言的解析器代号
函数定义
array token_get_all ( string $source )
示例代码
echo 123;>
token_get_all()处理语句
token_get_all(" echo 123;>");
处理结果
Array
(
[0] => Array
(
[0] => 376
[1] =>
[2] => 1
)
[1] => Array
(
[0] => 319
[1] => echo 无奈人生安全网
[2] => 1
)
[2] => Array
(
[0] => 379
[1] =>
[2] => 1
)
[3] => Array
(
[0] => 308
[1] => 123
[2] => 1
)
[4] => ;
[5] => Array
( 本文来自无奈人生安全网
[0] => 378
[1] => ?>
[2] => 1
)
)
可以看到,代码被分割成了五段,其中除了第四段之外,每一段都分为三段.
我们设$token=token_get_all(....),那么$token[0]便对应着
Array
(
[0] => 376
[1] =>
[2] => 1
)
则$token[0][1]对应
那么下一个问题便是$token[0]对应数组中的三个值,分别代表什么意思,解释如下:
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页