代码解析工具cpg

38 篇文章 14 订阅
订阅专栏
31 篇文章 27 订阅
订阅专栏
13 篇文章 0 订阅
订阅专栏

cpg 是一个跨语言代码属性图解析工具,它目前支持C/C++ (C17), Java (Java 13)并且对Go, LLVM, python, TypeScript也有支持,在这个项目的根目录下:

  • cpg-core为cpg解析模块的核心功能,主要包括将代码解析为图,core模块只包括对C/C++/Java的支持。

  • cpg-analysis为基于代码属性图的代码分析规则,比如 ValueEvaluator主要基于DFG的回溯遍历计算某一表达式的值。

  • cpg-neo4j将解析结果导入到neo4j数据库。

  • cpg-language-xxx为对xxx语言的支持。

  • cpg-console包含针对用户端的功能,比如bug检测: OutOfBoundsCheck, NullPointerCheck。

cpg将编程语言抽象为1个特性( Trait)集合,语言特性是一组编程语言所共有的特性或特性。任何支持它们的语言都应该实现所需的trait接口。示例可以是对指针的支持、对模板或泛型的支持。

1.Graph Structure

这一部分主要介绍cpg提供的图结构,这些结构旨在提供大多数面向对象语言(如C++、Java或Go)中的语言特性的超集。这包括结构元素,例如函数、方法、类以及表达式/语句,例如调用、运算符、文本或条件。

1.1.Abstract Syntax Tree

树的根是 TranslationUnitDeclaration节点,它表示一个文件中包含的代码。树中存在不同类型的AST子节点,每个子节点表示程序中的不同语义:

  • Structural Entities 表示为代码提供其结构的实体。比如代表 namespaces, classes, structs 的结点。

  • Value Declarations 用于建模局部变量、参数、函数、方法和构造函数。

  • Nodes of Program Execution 它为语句和表达式建模。

    • 语句是按顺序执行的语法单元,因此构成命令式程序的程序逻辑。

    • 相比之下,表达式是计算值的语法单位,属于特定的值类型。表达式可以是嵌套的,也可以是语句的子级。

1.2.Control Flow and Evaluation Order

cpg将控制流图(CFG)的概念改编为评估顺序图(evaluation order graph, EOG),它按照语句和表达式被求值的顺序相互连接,以在更细粒度级别上表示控制流。这对于正确捕获来自表达式内部执行顺序的副作用是必要的。可以说EOG是expression-level CFG。

比如对下面代码:

int a = 2 + 3;
a = 0;
a += 1;

EOG为:

请添加图片描述

  • 绿框为3个语句对应的AST根节点,蓝框为其下AST子结点。

  • 蓝线连接同一语句下的AST结点,绿线连接不同语句的AST结点。

可以看出:

  • EOG的连接顺序为AST结点后序遍历顺序

  • 连接的结点都是对应的表达式或者语句访问顺序。

通常,EOG的构造对应后序遍历,当然也存在一些例外情况:

  • 显式更改程序控制流的构造函数,如 if 或其他条件表达式。

  • 表示不按代码出现的顺序执行的代码的节点,例如,在 for (initializer; condition; iteration) body();body();initializer 之后执行,在 iteration 之前执行。

分支语句的根节点在分支表达式(例如条件或选择器)之后和分支目标之前连接,以允许已经遍历分支表达式的算法在必须处理分支之前获得关于语义根的信息。

对于下面分支代码:

if (a == 4)
    a += 2;
else
    a += 3;
return 0;

其EOG如下:

请添加图片描述

1.3.Data Flow

处理数据的操作或实体在CPG内的数据流图(DFG)中表示。要对程序中的数据流进行建模,以下DFG边连接节点:

  • (1).如果父结点的值取决于子结点的值,则子对象包含其父结点的边。比如 BinaryOperator:2 + 3 指向其父结点 VariableDeclaration:a = 2 + 3

  • (2).如果语句对被引用变量进行写入,那么被引用变量是DF edge的起始结点;如果语句读取被引用变量,那么被引用变量是DF edge的开始。比如 a = 1; if (a == 4) xxx 中存在从 DeclaredReferenceExpression: a(a = 1; 中的 a) 指向 BinaryOperator: a== 4 的DF edge。

  • (3).函数调用时会建立从 CallExpression 对应的被引用变量到被调用参数之间的DF edge,以及被调用者定义和该 CallExpression 之间也会建立DF edge,如下面示例所示: DeclaredReferenceExpressionParamVariableDeclaration 之间有数据流,FunctionDeclarationCallExpression 之间也有数据流。

    • 绿边为data flow edge

    • 蓝边为普通AST edge(这里只包含了部分AST信息)

请添加图片描述

  • (4).如果控制流敏感(control-flow-sensitive)的数据流分析被执行,那么对于一个变量 (DeclaredReferenceExpression),在它最后一次被写入的地方和对应引用的位置会有1条数据流

  • (5).对于控制流不敏感的数据流分析,变量引用 (DeclaredReferenceExpression)和变量定义(VariableDeclaration)之间存在数据流。

对于具体DFG建立规则,可以参考 cpg DFG

1.4.Additional program semantics

  • 程序和所用语言的类型系统是通过添加其复杂的层次结构作为节点和边来建模的,形成一个类型子图,这有助于通过允许根据细微差别的语言语义进行区分,对语言级语义进行建模,以提高精度。

  • REFERS_TO 连接引用和定义。(每个 DeclaredReferenceExpression 都有1个成员变量 refersTo指向对应变量定义的位置)

  • INVOKES 连接调用语句和调用对象。(每个 CallExpression 都有成员变量 invokeEdges)指向其可能的调用对象。

2.核心架构和实现

CPG项目由围绕一个库构建的多个工具组成,用于以基于Java/Kotlin的开源实现3的形式对源代码进行迭代图形构建。图1描述了将源代码转换为图形表示的工作流,以及用户对其进行的可视化和分析。

代码解析的核心部分由 cpg-core 完成,用户输入由 cpg-console 完成。

请添加图片描述

2.1.语言前端(Language Frontends)

源代码文件通过其文件扩展名发送到特定语言的前端。然后,前端可以使用针对特定语言的AST解析库解析源代码(针对C/C++使用 eclipse CDT,针对Java采用 Java Parser)。语言前端应执行以下任务:

  • 特定语言的AST被转换为独立于语言的cpg AST结构,以方便建立独立于特定语言的图结构

  • 隐式存在但未位于源代码中的实体将显式添加到图中,例如隐式 this 字段和缺少的返回语句(void 函数,比如下面代码片段中 swap 函数在解析后补充了 ReturnStatement:return;)

void swap(int *p, int *q) {
    int t = *p;
    *p = *q;
    *q = t;
}

int main() {
    int a = 2, b = 1;
    swap(&a, &b);
    int c = a + 1;
    return 0;
}
  • 标识符被收集在scope tree中,以便以后以模糊的方式解析对名称的访问。在cpg AST的每个结点中,都有一个局部变量 scope指向一个 Scope对象,每个 scope 对象会用1个ASTNode来标识。以上面代码为例:

    • 整个代码对应的TranslationUnitDeclaration 会对应到一个 GlobalScope(记作 globalScope)对象中,该 GlobalScope 对象对应的ASTNode就是该 TranslationUnitDeclaration

    • swapmain 函数对应的 FunctionDeclarationscope 域指向 globalScope

    • swapmain 函数定义下的 CompoundStatement(函数体) 的 scope 域分别指向2个 FunctionScope(分别记作 functionScope1, functionScope2),functionScope1, functionScope2 对应的ASTNode分别为2个 FunctionDeclaration 结点

    • int t = *p;, int c = a + 1;scope 域分别指向2个 BlockScope,这2个 BlockScope 对应的ASTNode分别为2个函数定义下的 CompoundStatement

cpg-core 中,已经实现了针对C/C++/Java的 前端,而 cpg-language-xxx 实现了针对xxx语言的前端。

2.2.ScopeManager

在大多数编程语言中,名称的声明不是全局有效的,但其有效性仅限于与语言构造相关的区域,例如类或函数。这个有效区域被称为作用域(scope)。当前端遍历AST节点时,作用域管理器跟踪当前活动的作用域堆栈。这允许按绝对或相对名称跟踪和解析声明,并管理绑定到封闭语言功能(例如循环、try 语句)范围的控制流跳转。在语言前端构建作用域之后,作用域管理器持有多个作用域树。

在全局存在一个 ScopeManager对象,通过 HashMap 的方式将ASTNode映射为 Scope

2.3.Passes

cpg前端产生部分连接的AST树。然后,通过隐式执行信息和程序语义(如使用引用、数据流和求值顺序),使用 Passes来丰富cpg。
比如:

  • DFGPass负责生成DFG。

  • ControlFlowSensitiveDFGPass负责生成control-flow sensitive DFG。

  • EvaluationOrderGraphPass负责生成EOG。

这些语义是在独立于语言的AST节点之间构建的,并且它们本身独立于特定编程语言。然而,它们仍然允许特定语言的定制。

当需要graph中的语义时,某些 Pass 取决于其他 Pass 的先前执行。比如 ControlFlowSensitiveDFGPass 依赖于 DFGPass, EvaluationOrderGraphPass。后2者只遍历了AST,而 ControlFlowSensitiveDFGPass 还需遍历EOG。

最后,Pass 也支持推理。对于在源代码中不直接可见的实体,节点将被添加并标记为 IMPLICIT,如果缺少源代码,则为 INFERRED

3.程序分析

cpg在 cpg-analysis 下定义了一些程序分析规则,包括计算表达式的值、不可达代码分析等等。基本是通过图的遍历实现的,这里就介绍以下表达式求值。

表达式求值有点类似于常量传播,不过区别在于这里是通过 Data Flow Graph的遍历实现,对应的代码为 ValueEvaluator.evaluate,具体规则参考 evaluateInternal函数(还有1个更高级的版本 MultiValueEvaluator):

  • 返回值主要为常量值或者 canNotResolve,如果不能确定值的变量,那么返回的可能就是 canNotResolve

  • 如果访问的AST结点为 Literal类型,那么直接返回其值。

  • 如果是 DeclaredReferenceExpression,那么沿着DFG回溯,这里需要注意的是,data flow必须唯一,如果有多个DFG边指向该变量引用,也就是该变量可能值有多个,那么返回 canNotResolve

  • 对于算术运算表达式,则先分别计算其左右值,如果不是 canNotResolve,那么直接计算其值。

4.Bug检测

这一部分为cpg的部分用户功能,放在 cpg-console 模块中。

cpg目前支持2种类型的bug检测,out of bound和空指针访问,这2种bug clang static analyzer(CSA)已有实现,不过CSA基于符号执行,cpg基于data flow graph的反向遍历。

4.1.Out of Bound Check

CSA中的实现可参考 知乎介绍,clang对应的代码为 ArrayBoundChecker, ArrayBoundCheckerV2。

可以检查出由数组访问造成的溢出读写,比如 array[idx] = 1;,但是数组访问必须满足以下条件:

  • idx 必须是常量表达式(索引可以用变量,但是其值必须是常量)

  • 数组长度必须是常量,且长度通过 new Type[n]; 定义,n 为常量表达式

首先给出以下示例:

#include <iostream>
using namespace std;

int main() {
    int *a = new int[9 + 1];
    int i = 10;
    int idx = i + 1;
    a[idx] = 13;
    return 0;
}

其中有几个比较重要的AST结点类型:

  • ArrayCreationExpression: 表示由 new Type[n] 组成的AST结点,比如:

请添加图片描述

  • ArraySubscriptionExpression:表示数组访问语句 array[index], arrayindex 都属于 Expression 类(通常为 DeclaredReferenceExpression

请添加图片描述

  • VariableDeclaration: 变量定义结点,在图1中已有示例

  • DeclaredReferenceExpression: 变量引用结点,表示对变量的使用,每个 DeclaredReferenceExpression 都会有一个成员变量 refersTo 指向定义该变量的 VariableDeclaration 结点。比如图2中的 DeclaredReferenceStatement: a 指向图1中的 VariableDeclaration: *a = new int[9 + 1];

检查数组越界访问按以下方式进行,检查对象为 ArraySubscriptionExpression 结点,对于某一个 ArraySubscriptionExpression:

  • 取出改数组表达式的索引(示例中为图2 DeclaredReferenceStatement:idx),计算其值(示例中值为 11),如果不是常量则退出。

  • 找到表达式数组对应的 DeclaredStatementExpression(示例中为图2 DeclaredStatementExpression:a),找到其对应的 VariableDeclaration(示例中为图1 VariableDeclaration: *a = new int[9 + 1];),查找有没有 ArrayCreationExpression,没有则退出(int a[100]; 这种语句都不行)。

  • Type[n] 中的 n 对应着数组长度表达式,计算其值(示例中为 10),不是常量则退出。

  • 比较索引和长度的值,如果索引 >= 长度则报出越界访问。

参考第3部分,表达式的计算核心是回溯DFG,对于计算索引 idx 的值,上述示例比较重要的DFG包括下面4个,计算的过程是从最后1个data flow往前回溯

  • VariableDeclaration:i = 10 --------> DeclaredReferenceExpression:i,其中 VariableDeclaration:i = 10 对应的 initializerLiteral: 10,因此 DeclaredReferenceExpression:i 的结果为 10

  • VariableDeclaration:idx = i + 1 --------> DeclaredReferenceExpression:idx (从语句 int idx = i + 1; 指向 a[idx] = 13;),计算idx时,追溯到 VariableDeclaration:int idx = i + 1,对应的 initializerBinaryOperator: i + 1,左值为 DeclaredReferenceExpression:i,右值为 Literal:1,递归回溯后,左值结果为 10,因此 DeclaredReferenceExpression:idx 的值为 11

没有用到的data flow包括:

  • Literal:10 --------> VariableDeclaration:i = 10

  • BinaryOperator:i + 1 --------> VariableDeclaration:idx = i + 1

同理,可以计算出 a 的长度为 10,因此存在越界访问。

4.2.Null Pointer Check

CSA中的实现可参考 NullabilityChecker, GoSSIP团队也在CSA的基础上实现了新的空指针解引用检测算法 NewDereferenceChecker。

在cpg中空指针的检测规则比较简单,如果出现指针访问(数组,成员变量,成员方法),对其对应指针变量 base 进行求解,如果可能为 nullptr(必须由 nullptr 初始化,NULL 和默认初始化都不行)。

求解是对 base 变量所有的DFG前驱进行求解,下面示例也会检测出 s->i = 1; 存在空指针访问,这是由于存在错误数据流 VariableDeclaration:*s = nullptr --------> DeclaredReferenceExpression:s(line 11)

struct S1 {
	char c1; //1个字节
	int i;   //4个字节
	char c2; // 1个字节
};

int main() {
    struct S1 *s = nullptr; // 可以识别nullptr关键字,NULL不行
    s = new S1();
    s->i = 1;
    return 0;
}

5.参考文献

paper地址

@article{
    Weiss_A_Language-Independent_Analysis_2022,
    author = {Weiss, Konrad and Banse, Christian},
    doi = {10.48550/arXiv.2203.08424},
    title = {{A Language-Independent Analysis Platform for Source Code}},
    year = {2022}
}
vulsniper
khy123khy的博客
07-15 574
VulSniper: Focus Your Attention to Shoot Fine Grained Vulnerabilities IJCAI19 提出了一种新的程序建模方法 提出了一种新的网络结构 建模方法: 生成代码属性图(CPG)。 用 Joern 生成代码代码属性图(CPG),然后存在Neo4j数据库中。 作者将生成的CPG简化了,只保留了CFG和AST。 将简化后的代码属性图(CPG)转化成特征张量。 特征张量T(G)的shape是(n,n,m)。G表示的是代码性质图,包括有n个节
代码阅读分析工具
04-13
可直接连接github等代码托管网站的版本库,可在代码上建立批注,分享批注
9 个最佳 Java 静态代码分析工具
最新发布
欢迎拜读我的作品,喜欢的领域请给我留言
08-13 1821
使用顶级 Java 静态代码分析工具列表来提高您的代码质量 - 确保您的代码干净、高效且无错误。开发人员如何防止频繁出现应用程序故障?自动化分析可能是答案。Java 静态代码分析工具有助于检测任何问题或,并通过自动化代码审查流程来帮助提高我们将探索一些市场上最好的工具,这些工具可以增强工作流程并创建更强大的代码。什么是静态代码分析?静态代码分析是一种无需执行源代码即可对其进行检查的技术。通过根据编码规则分析代码集,这种高级静态分析工具可以读取代码中的错误并确保其符合标准和最佳实践。
代码解析工具汇总
热门推荐
qq_44370676的博客
03-09 1万+
代码解析工具汇总
代码分析工具
12-25
分析工具, 让你的代码更倾向于艺术化,给特定人群使用,请谅解
代码分析
12-21
代码分析
代码分析工具
SHELLCODE_8BIT的博客
09-27 3155
工具目前支持 Java、.Net、Go、Python、Ruby、JS(Node、Angular、JQuery 等)、PHP、Perl、COBOL、APEX 等等。Apex、C/C++、C#、CUDA、Java#、JavaScript、PHP、Python、.NET Core、ASP.NET、Objective-C、Go、JSP、Ruby、Swift、Fortran、Scala、VB.NET、iOS、Android , 打字稿, Kotlin。使用图形、文档和指标提供静态代码分析的 IDE。
cpg.rar_CPG
09-20
综上所述,“cpg.rar_CPG”中的助手程序是SuperH CPG管理的关键组件,它们为开发者提供了强大的工具集,以精细地控制和优化系统的时钟系统。理解和熟练运用这些助手程序,能有效提升SuperH平台的开发效率和系统性能...
java代码cpg生成
05-22
你说的CPG应该是指代码控制流图(Control Flow Graph)吧?如果是的话,Java代码生成CPG可以通过以下步骤实现: 1. 使用Java解析器读取Java代码; 2. 对代码进行词法分析和语法分析,构建语法树; 3. 对语法树...
cpg&joern分享.pdf
10-31
使用 Joern 时,需要设置 JDK 环境变量,然后可以使用 Joern 来解析 Java 代码,生成 CPG,并对其进行查询和分析CPG 和 Joern 的应用 CPG 和 Joern 有很多实践应用,例如代码分析、软件测试、安全漏洞扫描等。 ...
CGI-HMM:通过 HMM 查找 CpG 岛-开源
05-29
4. 结果解析:输出的结果通常包含CpG岛的位置、长度、得分和其他相关统计信息,用户可以根据这些信息进一步分析和验证结果。 在实际应用中,CGI-HMM可以与其他生物信息学工具结合,例如ChIP-seq数据分析,以探索CpG...
源码解析工具源码解析工具
11-11
源码解析工具源码解析工具
网页源代码查看分析
11-16
抓取网页资源,分析网页结构及代码,方便查找网页上的漏洞。
JSON代码解析工具
11-16
JSON代码解析工具,点击打开就能使用,这里提供了32位和64位的。
代码分析工具Scientific.Toolworks.Understand.5.0.960-Linux-64bit
09-19
代码分析工具Scientific.Toolworks.Understand.5.0.960-Linux-64bit【内含几个序列号,适用月x64 Linux 平台
源码分析工具joern使用教程
SHELLCODE_8BIT的博客
10-05 2765
Joern 是一个对源代码、字节码和二进制代码进行稳健分析的平台。它生成代码属性图,一种用于跨语言代码分析代码图形表示。代码属性图存储在自定义图数据库中。这允许使用以基于 Scala 的特定领域查询语言制定的搜索查询来挖掘代码。Joern 的开发目标是为静态程序分析中的漏洞发现和研究提供有用的工joern 现在支持的语言:NameBased onMaturityC/C++HighC/C++Highx86/x64GhidraMediumJVMSootMediumLLVM。
代码分析工具】starTool,代码地图,代码阅读加速器
杉杉的博客
06-09 7301
“starTool可以解析工程中的代码,使用图表的方式展示工程下代码关系,可以帮助代码阅读者更好的一览整个工程代码的关键点和入手点,特别适用于缺少文档支持的开源项目代码阅读” 【日记】 新增UI版,无需指导,直接上手,链接:https://download.csdn.net/download/weixin_39020940/10611966 效果预览:www.englishbox.top ...
代码分析工具 - SonarQube
Janet的博客
04-13 8655
1. 常见代码质量分析工具 1. DeepSource DeepSource是一种静态分析工具,可以智能化测试代码,帮助弄清楚几个关键方面的问题,比如性能、反模式、缺陷风险、安全漏洞、样式和文档问题。 功能: 可使用配置文件生成器进行简单配置。可对每个合并请求(PR)进行连续分析。误报较少。缺点: 目前只有SaaS Web应用程序这个版本,CLI版仍在开发中。2. embold embold使您可以对软件项目进行静态分析,并提供代码质量报告,其中包括检测到的问题的热图,可帮助您直观地查看导致代码
代码属性图cpg java
10-15
代码属性图(Code Property Graph,CPG)是一种对程序代码进行建模和分析的技术。CPG程序代码转换为图形结构,其中节点表示程序元素(例如类、方法、变量等),边表示它们之间的关系(例如方法调用、类继承等)。...
写文章

热门文章

  • 代码解析工具汇总 15512
  • 程序分析-对程序依赖图(PDG)的理解 9829
  • C语言常见漏洞-缓冲区溢出 7517
  • code embedding研究系列一-基于token的embedding 6836
  • C/C++漏洞数据集 5933

分类专栏

  • 静态代码检测 31篇
  • 程序分析 38篇
  • 指针分析 7篇
  • 程序分析工具 13篇
  • 系统安全 4篇
  • 调用分析 1篇
  • Fuzzing 2篇
  • code embedding 14篇
  • 代码生成 1篇
  • 会议论文分享 4篇
  • 符号执行 9篇
  • 可解释性研究 7篇
  • 漏洞研究 6篇
  • PE学习 3篇
  • 恶意代码 7篇
  • php 3篇
  • webshell研究 3篇
  • CTF的writeup 8篇
  • CTF参赛记录 2篇

最新评论

  • C/C++漏洞数据集

    huang_chongyang: 博主是北航的么表情包

  • code embedding研究系列十一 - VulDeeLocator

    I still …: 可以参考下:https://github.com/jumormt/DeepWukong

  • code embedding研究系列十一 - VulDeeLocator

    MC.F: 楼主可以讲一讲DeepWukong那个项目是流程是什么样的环境怎么复现吗

  • 用Joern-cli分析代码

    MC.F: 如何构建老版本的joern呢 求指导 生成csv文件的

  • text-generation-inference使用

    dcjklkmm: 由于网络不好导致在docker中下载HF上的模型报错,我手动将HF上模型权重保存在本地,运行docker时我要如何指定本地模型权重呢

大家在看

  • 阿里巴巴国际站数据采集软件|阿里国际站商家信息采集软件 24
  • 基于SSM的特产销售系统【附源码+文档】
  • Lumen5——AI视频制作,提取关键信息生成带有视觉效果的视频
  • django项目添加测试数据的三种方式 1
  • gpt4最新保姆级教程 988

最新文章

  • c++ virtual call分析
  • 改进版field-sensitive指针分析算法
  • Versioned Staged Flow-Sensitive Pointer Analysis
2024年11篇
2023年10篇
2022年13篇
2021年42篇
2020年17篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司湖南网站seo优化代理黄山网站优化排名代理商济源优惠网站优化哪家好百科网站优化营销青浦区谷歌网站优化定制方案德州优化网站公司西安网站万词优化友好区网站seo优化排名黄山网站整站优化平台效果长沙网站优化全包台州网站优化电池充电东莞网站优化托管公司廊坊推荐网站推广优化网站优化智搜宝官网推广香蜜湖网站优化方案昌乐网站推广优化外包网站排名优化服务公司青岛智能营销网站优化公司什么是网站流量优化北京教育网站优化番禺专业网站优化seo网站建设前的优化手机版网站应该怎么优化奉化网站优化网站优化需要注意的几个地方优化网站关键词怎么做许昌网站排名优化服务商上海网站优化选哪家优化网站是否需要天天更新酒泉网站怎么优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化