先进接口看护理念:模型化表达接口一棵树,逆向分析,自动化看护。
【摘要】 建立一套自动化的接口看护机制是比较困难的。具体困难源于如下几点:接口多样化,如何定义和描述接口?搜遍大江南北,国内国外,没有找到统一标准的模型化接口表达语言。技术栈多样化,不同语言都有独立的格式文件,每一款都不一定都有逆向分析的方法。接口那么多,即使解决1、2点,也无法完全保证100%覆盖。当然,我们无法完美解决,但是我们可以逐步解决。毕竟“谁谁谁”说过:建立一套可进化的机制会比研究某个技术...
建立一套自动化的接口看护机制是比较困难的。具体困难源于如下几点:
- 接口多样化,如何定义和描述接口?搜遍大江南北,国内国外,没有找到统一标准的模型化接口表达语言。
- 技术栈多样化,不同语言都有独立的格式文件,每一款都不一定都有逆向分析的方法。
- 接口那么多,即使解决1、2点,也无法完全保证100%覆盖。
当然,我们无法完美解决,但是我们可以逐步解决。毕竟“谁谁谁”说过:建立一套可进化的机制会比研究某个技术方法更为重要。我们的目的是建立一套可演进的自动化机制,逐步完善和解决。如果没有,我们就自己创造。
非标准的接口模型化表达
因为接口是广义的,显性可见的接口全部来源于对外软件包,需要从外到里建立一个通用的模型,涉及包(压缩包、文件夹)、文件、类、函数、类型、变量等等。
Interface:
- Code:接口编号,唯一确定一个接口。
- Name:接口名称,可重复,可以是文件名、函数名、变量名等等
- Type:接口类型,基于不同类型接口,描述具体接口。
PkgInf:
- StructureDes:包目录结构。常常下游软件构建时会依赖上游软件的包结构。
- Size:包大小。软件包大小常常会影响最终的资源开销,一般是有要求和限制的。
- md5sum:部分tar包内容是固定的,一般不允许变化,变化意味着接口变化。
FileInf:
- Priv:文件默认权限,特别是构建脚本需要带有一定的可执行权限。
- Size:文件大小。文件大小常常会影响最终的资源开销,一般是有要求和限制的。
- md5sum:部分文件内容是固定的,一般不允许变化,变化意味着接口变化。
FunctionInf:
- ArgType: 参数类型集合。
- RetType:返回参数类型。
TypeDef:
- TypeDef:类型定义。
(* ̄︶ ̄):模型不一定准确,可以留言交流。
基于该模型,实例化表达举例:
接口一棵树
所有显性接口按格式记录后,软件包涉及的所有接口都可以最终组织成一颗树。
接口数据可以以任意方式记录(数据库、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
在代码合入过程中,门禁中可以增加此类看护机制,全面做得接口自动化看护。
本文只是给出一些问题解决的思路,技术方案上并非完全清楚,欢迎大家留言多多指正和交流。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)