Sketchup 逆向工程 (五)从sketchup api入手

系列文章

一、逆向工程
Sketchup 逆向工程(一)逆向分析.skp文件数据结构
Sketchup 逆向工程(二)三维模型数据结构
Sketchup 逆向工程(三)软件逆向工程从何处入手
Sketchup 逆向工程(四)分析结果的利用 钩子 外挂 代码注入

二、OpenGL渲染模型
Python+OpenGL绘制3D模型(一)Python 和 PyQt环境搭建
Python+OpenGL绘制3D模型(二)程序框架PyQt5
Python+OpenGL绘制3D模型(三)程序框架PyQt6
Python+OpenGL绘制3D模型(四)绘制线段
Python+OpenGL绘制3D模型(五)绘制三角面

三、成果
疫情期间关在家里实在没事干,破解了Sketchup,成功做出可以读取并显示.skp文件的程序SuViewer

前言

Sketchup作为目前设计院最为流行的设计软件(非工程制图软件),深受设计师的喜爱,软件小巧,而功能强大,有不少为之开发的插件应运而生,不过呢,关于底层数据结构和工作原理相关的文章少之又少,本文意在填补一下这方面的空缺,通过逆向软件分析,展示软件内部奥秘。本文用到的工具:IDA Pro,Immunity Debugger,Visual Studio (逆向工程三件套)提示:数据结构属于机密数据:

版本问题

sketchup 从2017之后,只有x64的版本,对于逆向分析来说,x64编译出来的反编译难度要大很多,esp ebp edi esi这种看了就知道代码要干什么的寄存器,变成了带编号的通用寄存器,所以反汇编,最好从32位编译版入手。现在官网能下载到最老的C API版本是2015的。

C API

sketchup C API 是一套提供给C语言的接口,主要用来访问.skp文件的数据结构,可以用在standalone程序,包括模型导入/导出插件,缩略图插件,都会用到这个api

如何在主程序插件中用到C API

主程序的插件,主要是Ruby插件,如果要用到C API,可以把Ruby中得到的对象,转给C API来处理,当然,不能直接用C API中全局模型相关的接口,比如SUCreateSketchupModelFromFile,C API中有一个全局对象 ActiveModel,和主程序中的全局对象想在不同的程序段中,所以要以主程序中的ActiveModel来访问数据

api文件组织

在这里插入图片描述
这是C-Api的目录,主要用到的接口有:

// initialize.h
// api第一次调用前需要初始化
SU_EXPORT void SUInitialize();
SU_EXPORT void SUTerminate();

模型数据的接口
这个头文件,定义.skp文件顶层的对象SketchupModel,以及SketchupModel中的成员对象,如Entites,Materials,Layers,Camera,OptionManagers,等全局管理器

// model/model.h

// .skp文件的读写操作
SU_RESULT SUModelCreateFromFile(SUModelRef* model, const char* file_path);
SU_RESULT SUModelSaveToFile(SUModelRef model, const char* file_path);


// 模型的所有实体,编组的对象会放在ComponentDefinitions中,这里的对象,只有未成组的零散面或线,点不属于实体对象
SU_RESULT SUModelGetEntities(SUModelRef model,
                             SUEntitiesRef* entities);

SU_RESULT SUModelGetComponentDefinitions(SUModelRef model, size_t len,
                                         SUComponentDefinitionRef components[],
                                         size_t* count);
SU_RESULT SUModelGetMaterials(SUModelRef model, size_t len,
                              SUMaterialRef materials[], size_t* count);
SU_RESULT SUModelGetCamera(SUModelRef model, SUCameraRef* camera);
SU_RESULT SUModelGetLayers(SUModelRef model, size_t len,
                           SULayerRef layers[], size_t* count);

面相关的接口
访问面相关的线,点,并不是直接通过GetEdge访问的,而是通过OuterLoop->EdgeUse->Edge这样的路线访问的

// model/face.h
SU_EXPORT SUFaceRef SUFaceFromEntity(SUEntityRef entity);
SU_RESULT SUFaceGetOuterLoop(SUFaceRef face, SULoopRef* loop);
SU_RESULT SUFaceGetFrontMaterial(SUFaceRef face, SUMaterialRef* material);
  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SketchUp是一款功能强大的3D建模软件,而Python是一种强大且易于使用的编程语言。结合SketchUpPython,可以提供更多的自定义建模功能和自动化设计过程。 首先,Python可以方便地使用SketchUpAPI(应用程序接口),通过编写Python脚本来控制和操作SketchUp软件。这样,用户可以根据自己的需求自定义各种建模操作,例如创建几何体,设置材质和颜色,调整模型尺寸等。使用Python脚本,可以将常见的重复性工作自动化,提高建模效率,并减少错误。 其次,PythonSketchUp的结合还可以拓展SketchUp的功能。Python拥有丰富的库和模块,可以用于数据处理、计算、图形化等方面。利用这些库和模块,用户可以将SketchUp模型与其他数据源进行连接,进行更复杂的数据分析、可视化或模拟。例如,可以将地理数据与SketchUp模型结合,创建地理信息系统(GIS)应用程序;还可以使用Python的机器学习库,让SketchUp模型具备智能分析和预测能力。 除此之外,Python还可以用于SketchUp的插件开发。通过编写Python脚本并将其打包为插件,用户可以为SketchUp添加各种额外功能和工具。这些插件可以实现更复杂的建模操作,满足用户的个性化需求,并且可以与其他用户共享和交流。 综上所述,SketchUpPython的结合能够为用户提供更多的建模灵活性和自定义性,同时也拓展了SketchUp的功能和应用场景。无论是自定义建模操作、自动化设计过程,还是插件开发和数据分析,SketchUpPython的结合都能带来更多的可能性和创造力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值