先进接口看护理念:模型化表达接口一棵树,逆向分析,自动化看护。

举报
冰释流水 发表于 2021/08/25 10:53:04 2021/08/25
【摘要】 建立一套自动化的接口看护机制是比较困难的。具体困难源于如下几点:接口多样化,如何定义和描述接口?搜遍大江南北,国内国外,没有找到统一标准的模型化接口表达语言。技术栈多样化,不同语言都有独立的格式文件,每一款都不一定都有逆向分析的方法。接口那么多,即使解决1、2点,也无法完全保证100%覆盖。当然,我们无法完美解决,但是我们可以逐步解决。毕竟“谁谁谁”说过:建立一套可进化的机制会比研究某个技术...

建立一套自动化的接口看护机制是比较困难的。具体困难源于如下几点:

  • 接口多样化,如何定义和描述接口?搜遍大江南北,国内国外,没有找到统一标准的模型化接口表达语言。
  • 技术栈多样化,不同语言都有独立的格式文件,每一款都不一定都有逆向分析的方法。
  • 接口那么多,即使解决1、2点,也无法完全保证100%覆盖。

当然,我们无法完美解决,但是我们可以逐步解决。毕竟“谁谁谁”说过:建立一套可进化的机制会比研究某个技术方法更为重要。我们的目的是建立一套可演进的自动化机制,逐步完善和解决。如果没有,我们就自己创造。

非标准的接口模型化表达

因为接口是广义的,显性可见的接口全部来源于对外软件包,需要从外到里建立一个通用的模型,涉及包(压缩包、文件夹)、文件、类、函数、类型、变量等等。

Interface:

  • Code:接口编号,唯一确定一个接口。
  • Name:接口名称,可重复,可以是文件名、函数名、变量名等等
  • Type:接口类型,基于不同类型接口,描述具体接口。

PkgInf:

  • StructureDes:包目录结构。常常下游软件构建时会依赖上游软件的包结构。
  • Size:包大小。软件包大小常常会影响最终的资源开销,一般是有要求和限制的。
  • md5sum:部分tar包内容是固定的,一般不允许变化,变化意味着接口变化。

FileInf:

  • Priv:文件默认权限,特别是构建脚本需要带有一定的可执行权限。
  • Size:文件大小。文件大小常常会影响最终的资源开销,一般是有要求和限制的。
  • md5sum:部分文件内容是固定的,一般不允许变化,变化意味着接口变化。

FunctionInf:

  • ArgType: 参数类型集合。
  • RetType:返回参数类型。

TypeDef:

  • TypeDef:类型定义。

(* ̄︶ ̄):模型不一定准确,可以留言交流。

基于该模型,实例化表达举例:

接口一棵树

所有显性接口按格式记录后,软件包涉及的所有接口都可以最终组织成一颗树。

image-20210219113828950

接口数据可以以任意方式记录(数据库、git仓库),在接口评审环节,更新对应接口库中接口描述,这样将所有接口管控起来。

采用逆向分析的方法,看护所有显性接口

对于包、文件的逆向分析较为简单,不再一一例举。对于不同语言的编译结果文件,可以采用对应语言的逆向分析工具,一一进行分析。如:

  • Java逆向分析方法。java编译结果一般是jar包,一堆class文件的集合,每个class文件可以采用java原生自带javap反向分析工具进行分析。
$ javap -public FramworkHelper.class
Compiled from "FramworkHelper.java"
public class com.example.logicanalyse.main.helper.FramworkHelper {
  public com.example.logicanalyse.main.helper.FramworkHelper();
  public static com.example.logicanalyse.main.helper.FramworkHelper getDefault();
  public java.util.Map<java.lang.String, java.lang.String> getAllView();
  public java.util.Map<java.lang.String, java.lang.String> getAllCategoryView(java.lang.String);
  public static java.util.ArrayList<java.lang.String> getAllMainView(java.lang.String);
  public static java.util.ArrayList<java.lang.String> getAllConsoleView(boolean);
  public static void refreshStartPage();
  public static boolean validateString(java.lang.String, java.lang.String);
  • c/go逆向分析方法。C/GO最终编译是elf格式文件。可以采用elf工具进行逆向分析,如:readelf、objdump等等 。
host-206-8-9-133:~ # readelf -s /workspace/target/csf_new/lib/libexample.so  | head -n 100

Symbol table '.dynsym' contains 6590 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000001781d0     0 SECTION LOCAL  DEFAULT    8 
     2: 000000000026344e   135 FUNC    WEAK   DEFAULT   10 _ZNKSt6vectorI16tagServic
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sem_destroy@GLIBC_2.2.5 (2)
     4: 00000000001b4692    11 FUNC    WEAK   DEFAULT   10 _ZN9__gnu_cxx13new_alloca
     5: 00000000001b799c    57 FUNC    WEAK   DEFAULT   10 _ZNSt8_Rb_treeINSt7__cxx1
     6: 0000000000195286    57 FUNC    WEAK   DEFAULT   10 _ZNSt8_Rb_treeIPKcSt4pair
     7: 0000000000301e85   544 FUNC    GLOBAL DEFAULT   10 TRAN_WebSocketCleanup

在代码合入过程中,门禁中可以增加此类看护机制,全面做得接口自动化看护。

image-20210219115144628

image-20210219115159384

本文只是给出一些问题解决的思路,技术方案上并非完全清楚,欢迎大家留言多多指正和交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。