系列文章
一、逆向工程
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 (逆向工程三件套)提示:数据结构属于机密数据:
正文
用IDA Pro分析得出的数据结构,只要正确,马上可以拿来利用,包括(钩子,外挂,代码注入)
typedef struct { void* ptr; } SULoopRef;
typedef struct { void* ptr; } CEdgeUse;
SU_RESULT(*SUFaceGetOuterLoop)(SUFaceRef face, SULoopRef* loop);
SU_RESULT(*SULoopGetEdgeUses)(SULoopRef loop, size_t len, SUEdgeUseRef edge_uses[], size_t* count);
这是之前用的SketchupAPI,由于官方不开放源代码和数据结构,返回的对象都是个void*指针,虽然明知道这个就是内部数据,但是得到的指针还是漆黑一片
这就需要对数据结构进行逆向分析,也是软件逆向工程最重要,也是工作量最大的是(算法分析还排其次)
下面是对分析的数据结构进行定义
// 分析得出的数据结构
struct CLoop
{
CEntity Entity;
CFace* parent_face;
CEdgeUse* edge_use;
bool is_outerloop;
bool is_convex;
__int16 pad;
};
struct CEdgeUse
{
CEntity Entity;
CEdge* edge;
bool is_edge_reversed;
CLoop* parent_cloop;
CEdgeUse* link_prev;
CEdgeUse* link_next;
CEdgeUse* link_partners;
int unknow11;
};
// 重新定义的API
typedef struct { CVertex* ptr; } CLoop;
typedef struct { CVertex* ptr; } CEdgeUse;
SU_RESULT(*SUFaceGetOuterLoop)(SUFaceRef face, SULoopRef* loop);
SU_RESULT(*SULoopGetEdgeUses)(SULoopRef loop, size_t len, SUEdgeUseRef edge_uses[], size_t* count);
稍微修改一下sketchup api的头文件slapi.h
写一段测试代码,进入调试
现在返回的指针,里面的数据就全部能看到了
现在就可以用实际的测试数据,来验证了