找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: w15994259099

[研讨] DWG图纸加密

[复制链接]

已领礼包: 271个

财富等级: 日进斗金

 楼主| 发表于 2018-5-14 16:59:26 | 显示全部楼层
理论上说,只要不借助插件就可以打开,并完整显示的加密图,都可以解开。
只要分析下DXF文件就知道。
如果象天正,没有插件不显示,就麻烦多了。可能要分析自定义对象的行为,重写自定义对象代码。
这种加密,太霸道,最没意思了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2018-5-14 21:44:10 来自手机 | 显示全部楼层
据说天正有它的解密方法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2018-5-16 08:43:02 | 显示全部楼层
w15994259099 发表于 2018-5-14 13:36
在高手面前,这种加密,解开它很容易。我也故意留有多个解开它的后门。
也没有什么技术,我只是利用了CAD ...

感谢分享源码,好期待哦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

 楼主| 发表于 2018-5-16 10:10:38 | 显示全部楼层
这个,是我学习ARXDBG时的副产品。但愿在特殊时候,给朋友们有点帮助。
原理很简单,这是实现细节:
1 选择要加密的实体,并克隆到匿名块定义中,删除或隐藏原实体; 我的程序留有后门,只是隐藏了。
2 定义一个自定义实体类,只一个数据成员:块引用; 如果不让打印,就设置为defpoints层。
3 定义一个匿名块,含有上面的自定义实体;
4 生成第3步中的块引用。
对第2,第3步中的匿名块定义,可以进行特殊处理,我的程序留有后门,没有处理。

好了,全部完成了。

当第三方打开这个图时,因为没有自定义对象的解释器程序,自定义对象变为代理对象。
这时:
代理对象在defpoints层,不能打印;
代理对象不能捕捉;
当炸开块时,代理对象会消失。

以下是核心代码。只是省略了自定义类C_TH_5476的实现代码

  1. void buildAllDepthEncryption()
  2. {
  3.         createLayer("defpoints", 7, "continuous");
  4.         //2.1
  5.         //因为AcDbPolyline,AcDbHatch在AutoCAD2002及以前版本,在代理实体中,不显示
  6.         //explode AcDbPolyline
  7.         struct resbuf* pFilter = acutBuildList(
  8.                 RTDXF0, "lwpolyline",
  9.                 0);
  10.         ads_name ss0;
  11.         if (acedSSGet("x", NULL, NULL, pFilter, ss0) != RTNORM)
  12.         {
  13.                 acutRelRb(pFilter);
  14.         }
  15.         else
  16.         {
  17.                 acutRelRb(pFilter);
  18.                 long len = 0;
  19.                 acedSSLength(ss0, &len);
  20.                 for (int i = 0; i < len; i++)
  21.                 {
  22.                         ads_name ename;
  23.                         AcDbObjectId objId;
  24.                         acedSSName(ss0, i, ename);
  25.                         acdbGetObjectId(objId, ename);
  26.                         AcDbEntity* pEnt = NULL;
  27.                         acdbOpenAcDbEntity(pEnt, objId, AcDb::kForWrite);
  28.                         if (pEnt->isKindOf(AcDbPolyline::desc()))
  29.                                 ;
  30.                         AcDbVoidPtrArray newEnts;
  31.                         acutPrintf("\n炸开多义线!");
  32.                         pEnt->explode(newEnts);
  33.                         pEnt->setVisibility(AcDb::kInvisible);
  34.                         pEnt->close();
  35.                         for (int index = 0; index < newEnts.length(); index++)
  36.                         {
  37.                                 AcDbObject* pSubEnt = static_cast<AcDbObject*>(newEnts[index]);
  38.                                 if (!pSubEnt)
  39.                                         continue;
  40.                                 if (NULL != pSubEnt->database())
  41.                                         pSubEnt->close();
  42.                                 else
  43.                                 {
  44.                                         //append
  45.                                         AcDbBlockTable* pBT;
  46.                                         AcDbBlockTableRecord* pMSRec;
  47.                                         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
  48.                                         pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
  49.                                         pBT->close();
  50.                                         pMSRec->appendAcDbEntity((AcDbEntity*&)pSubEnt);
  51.                                         pSubEnt->close();
  52.                                         pMSRec->close();
  53.                                 }
  54.                         }
  55.                 }
  56.                 acedSSFree(ss0);
  57.         }
  58.         //explode AcDbPolyline
  59.         //2.1

  60.         //2.2 选择实体
  61.         ads_name ss;
  62.         if (acedSSGet(NULL, NULL, NULL, NULL, ss) != RTNORM)
  63.         {
  64.                 acutPrintf("\n选择失败!");
  65.                 return;
  66.         }
  67.         long len = 0;
  68.         acedSSLength(ss, &len);
  69.         ads_name ename;
  70.         AcDbObjectId objId;
  71.         AcDbObjectIdArray objIdArr;
  72.         for (int i = 0; i < len; i++)
  73.         {
  74.                 acedSSName(ss, i, ename);
  75.                 acdbGetObjectId(objId, ename);
  76.                 objIdArr.append(objId);
  77.         }
  78.         acedSSFree(ss);
  79.         //2.2


  80.         AcDbBlockTableRecord* pMyRec = new AcDbBlockTableRecord();
  81.         AcDbBlockTable* pBT = NULL;
  82.         AcDbObjectId myRecId;
  83.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
  84.         pBT->add(myRecId, pMyRec);
  85.         pBT->close();
  86.         pMyRec->setOrigin(AcGePoint3d::kOrigin);
  87.         pMyRec->setName("*U");
  88.         pMyRec->close();
  89.         AcDbIdMapping idMap;
  90.         if (acdbHostApplicationServices()->workingDatabase()->deepCloneObjects(objIdArr, myRecId, idMap) != Acad::eOk)
  91.         {
  92.                 acutPrintf("\n深层克隆失败了!");
  93.                 acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
  94.                 pMyRec->erase();
  95.                 pMyRec->close();
  96.                 return;
  97.         }
  98.         //hide
  99.         for (i = 0; i < len; i++)
  100.         {
  101.                 AcDbEntity* pEnt = NULL;
  102.                 if (acdbOpenAcDbEntity(pEnt, objIdArr, AcDb::kForWrite) != Acad::eOk)
  103.                 {
  104.                         acutPrintf("\n写打开错误,退出程序!");
  105.                         acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
  106.                         pMyRec->erase();
  107.                         pMyRec->close();
  108.                         return;
  109.                 }
  110.                 pEnt->setVisibility(AcDb::kInvisible);
  111.                 pEnt->close();
  112.         }
  113.         //2.3

  114.         C_TH_5476* gCont = new C_TH_5476;
  115.         gCont->setBlockId(myRecId);
  116.         gCont->setLocation(AcGePoint3d::kOrigin);
  117.         gCont->setLayer("defpoints");
  118.         //2.4

  119.         //2.5 再建立匿名块定义,包含用户化对象
  120.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
  121.         AcDbBlockTableRecord* pMyRec1 = new AcDbBlockTableRecord();
  122.         AcDbObjectId recId1;
  123.         pBT->add(recId1, pMyRec1);
  124.         pBT->close();
  125.         pMyRec1->setOrigin(AcGePoint3d::kOrigin);


  126.         pMyRec1->setName("*U");

  127.         pMyRec1->appendAcDbEntity(gCont);
  128.         gCont->close();
  129.         pMyRec1->close();


  130.         //2.6 建立匿名块定义的引用实例
  131.         AcDbBlockReference* pRef = new AcDbBlockReference();
  132.         pRef->setPosition(AcGePoint3d::kOrigin);
  133.         pRef->setBlockTableRecord(recId1);
  134.         pRef->setScaleFactors(AcGeScale3d(1.0, 1.0, 1.0));
  135.         AcDbBlockTableRecord* pMSRec;
  136.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
  137.         pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
  138.         pBT->close();
  139.         pMSRec->appendAcDbEntity(pRef);
  140.         pRef->close();
  141.         pMSRec->close();
  142.         //2.6


  143.         const char* strFileName;
  144.         acdbHostApplicationServices()->workingDatabase()->getFilename(strFileName);
  145.         CString strNewFileName = strFileName;
  146.         int index = strNewFileName.ReverseFind('.');
  147.         if (index != -1)
  148.         {
  149.                 strNewFileName = strNewFileName.Left(index);
  150.                 if (strNewFileName.Find("_A", strNewFileName.GetLength() - 2) == -1)
  151.                 {
  152.                         strNewFileName += "_A";
  153.                 }
  154.                 strNewFileName += ".dwg";
  155.         }
  156.         else
  157.         {
  158.                 acutPrintf("\n为什么加密后的另存名文件不能加后缀:_A ?");
  159.         }
  160.         if (acdbHostApplicationServices()->workingDatabase()->saveAs(strNewFileName) != Acad::eOk)
  161.         {
  162.                 acutPrintf("\n文件另存出错!");
  163.                 //AfxMessageBox("外部文件存储,失败!");
  164.                 return;
  165.         }
  166. }

评分

参与人数 1D豆 +20 收起 理由
XDSoft + 20 有始有终奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2018-5-16 12:34:02 来自手机 | 显示全部楼层
C_TH_5476类也发上来吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

 楼主| 发表于 2018-5-16 12:43:55 | 显示全部楼层
从AcDbEntity随便派生个类,含有一个数据成员:AcDbObjectId,然后将匿名块的ID加入就可以了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2018-6-13 09:20:28 | 显示全部楼层
匿名块定义的特殊处理您是指?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2018-6-30 19:49:50 | 显示全部楼层
太简单了,无非是图元的Visible=false,炸开后Visible=true一下就可以了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-8-18 07:01:45 | 显示全部楼层
学习了学习了学习了学习了学习了学习了学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2018-9-21 20:32:02 | 显示全部楼层
感谢分享发布
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-2-5 16:23:40 | 显示全部楼层
感谢公开代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1487个

财富等级: 财源广进

发表于 2021-5-14 12:02:28 | 显示全部楼层
能看得到啊!
加密.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2023-11-1 14:45:51 | 显示全部楼层
有完整的代码吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2023-11-26 10:42:08 | 显示全部楼层
贴一个分解的代码
  1. acutPrintf(_T("\n选择需要分解的对象:\n"));
  2. ads_name ss;
  3. int res = acedSSGet(NULL, NULL, NULL, NULL, ss);
  4. if (res != RTNORM) return;
  5. Adesk::Int32 length = 0;
  6. acedSSLength(ss, &length);
  7. for (int i = 0; i < length; i++)
  8. {
  9.     ads_name eName;
  10.     acedSSName(ss, i, eName);
  11.     AcDbObjectId entId;
  12.     acdbGetObjectId(entId, eName);
  13.     AcDbObjectPointer<AcDbEntity>pEnt(entId, AcDb::kForWrite);
  14.     AcGeMatrix3d transform;
  15.     transform.setToTranslation(AcGeVector3d(0, 0, 0));
  16.     AcDbEntity *pCopyEnt = NULL;
  17.     // 派生类需用 getTransformedCopy
  18.     // AcDbPolyFaceMesh 不会将 xdata 复制到副本
  19.     pEnt->getTransformedCopy(transform, pCopyEnt);
  20.     pEnt->erase();
  21.     AcDbVoidPtrArray entitySet;
  22.     pCopyEnt->explode(entitySet);
  23.     for (int j = 0; j < entitySet.length(); j++)
  24.     {
  25.         AcDbEntity* pAddEnt = (AcDbEntity*)entitySet.at(j);
  26.         AcDbBlockTable* pBlockTable = NULL;
  27.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
  28.         AcDbBlockTableRecord* pBlockTableRecord = NULL;
  29.         pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  30.         pBlockTable->close();
  31.         AcDbObjectId objectId;
  32.         pBlockTableRecord->appendAcDbEntity(objectId, pAddEnt);
  33.         pBlockTableRecord->close();
  34.         pAddEnt->close();
  35.     }
  36.     pCopyEnt->close();
  37. }
  38. acedSSFree(ss);
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 23:26 , Processed in 0.445353 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表