highflybird 发表于 2019-5-8 18:04:27

[飞鸟集]去教育版讨论及源码(ARX,LISP版)

本帖最后由 highflybird 于 2019-9-17 12:36 编辑

CAD教育版戳记有时候很讨厌,一旦图中有这个戳记,就会传染到其它图中。就是说从有戳记的图中拷贝到没戳记的,没戳记的也会带上。
而且这个戳记不太好消除。
对于2015-2018,Autodesk公司似乎已经把这个戳记移除掉了,也就是说,用这些版本的CAD打开图,看不到戳记,也不会弹出那个戳记警告框。保存之后,图中不会再有了(这点我没有每个版本验证)。但该死的是到了2019后,这个又出现了,不知道autodesk公司在玩什么。

关于去教育版有很多方式,ARX的方式最有效。我这里提供用了ARX源码。以及附带的生成的ARX程序。
这个程序的源码 是从网上的 wdzhangsl 引申过来,特此深表感谢!
程序的原理是从数据库指针找到戳记的偏移地址,修改此处的值,便达到了消除。
因为原代码有些重复和繁琐,特此精简,并且升级到2019。经过测试,程序有效。
因为有些CAD版本我是没办法在自己机器安装,就没有一个个CAD版本进行测试其中的偏移地址。
如果有网友能测试到我程序中没有的CAD版本的值,请告诉我或者跟帖。多谢!

下面是程序的源码和已经编译好二进制文件的压缩包。欢迎各位捉虫子和提出建议。
程序的用法是:加载后,程序会自动消除戳记,也可以用手动输入命令QJYB 来消除。
如果你把此程序加载到启动组,以后每当打开有教育版的dwg后,程序会自动消除,你需要做的仅仅是保存文件而已。

此源码为开源代码,不得做商业用途!另外,此代码或二进制文件仅供参考,用户使用风险自担。


源码更新到2019,05,11.
更新如下:
1、代码更精简,添加了一些注释。
2、修改了几个偏移值。
3、使得核心文件合并到一个文件。



2019.5.12,增加了一个LISp版本,更有这两项突出功能:
1、消除打开戳记文件的错误警告框。
2、全面兼容各种CAD版本。
注意:如果出现“你没有注册DynamicWrapperX!或者没有权限 ”,请参考下面帖子:
http://bbs.mjtd.com/forum.php?mo ... ight=dynamicWrapper
http://bbs.mjtd.com/thread-85724-1-1.html


1005100717 发表于 2019-5-9 16:10:15

本帖最后由 1005100717 于 2019-5-9 16:12 编辑

自从用了net,发现还是net写起来方便,没有c++配置那么复杂我也来贡献一个net版的,2008-2019 32 64通杀
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.PlottingServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Customization
Imports System.Collections.Specialized
Imports System.Runtime.InteropServices

Public Class cadFunc
    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
    End Function
    <DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True)> _
    Private Shared Function GetProcAddress(ByVal hModule As IntPtr, ByVal procName As String) As IntPtr
    End Function
    <DllImport("kernel32.dll", SetLastError:=True)> _
    Public Shared Function ReadProcessMemory( _
    ByVal hProcess As IntPtr, _
    ByVal lpBaseAddress As IntPtr, _
    <Out()> ByVal lpBuffer As Byte(), _
    ByVal dwSize As Integer, _
    ByRef lpNumberOfBytesRead As Integer) As Boolean
    End Function
    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Public Shared Function VirtualProtect(ByVal lpAddress As IntPtr, ByVal dwSize As IntPtr, ByVal flNewProtect As UInteger, ByRef lpflOldProtect As UInteger) As Boolean
    End Function

    Public Shared Function getAcadVersion() As Double
      Return CDbl(Application.GetSystemVariable("acadver").ToString().Substring(0, 4))
    End Function


    Public Shared Function noEMR() As String
      Dim dllName As String = "acdb" + getAcadVersion().ToString.Substring(0, 2) + ".dll"
      Dim handle As IntPtr = GetModuleHandle(dllName)
      If handle = 0 Then Return "找不到模块:" + dllName

      Dim funcname As String
      If IntPtr.Size = 4 Then
            Dim bin() As Byte = {63}
            funcname = System.Text.Encoding.Unicode.GetString(bin) + "isEMR@AcDbDatabase@@QBE_NXZ"
      Else
            Dim bin() As Byte = {63}
            funcname = System.Text.Encoding.Unicode.GetString(bin) + "isEMR@AcDbDatabase@@QEBA_NXZ"
      End If

      Dim funcAdress As IntPtr = GetProcAddress(handle, funcname)
      If funcAdress = 0 Then Return "无法找指定函数:" + funcname

      '寻找关键字0x33,0x39,0x0f
      Dim ptr As IntPtr
      If IntPtr.Size = 4 Then
            ptr = New IntPtr(funcAdress.ToInt32() + 3)
      Else
            ptr = New IntPtr(funcAdress.ToInt64() + 4)
      End If

      If Not EMRcheckFunc(ptr, 51, 2) Then Return "无法验证函数体:0x33"
      Dim destPtr As IntPtr = ptr
      If Not EMRcheckFunc(ptr, 57, 6) Then Return "无法验证函数体:0x39"
      If Not EMRcheckFunc(ptr, 15, 2) Then Return "无法验证函数体:0x0F"

      '修改内存
      Dim flag As UInteger, tccc As UInteger
      If Not VirtualProtect(destPtr, 100, 64, flag) Then Return "内存模式修改失败!1"
      Marshal.WriteByte(destPtr, 137) '0x89
      VirtualProtect(destPtr, 100, flag, tccc)
      Return ""
    End Function

    Private Shared Function EMRcheckFunc(ByRef adress As IntPtr, ByVal val As Byte, ByVal len As Integer) As Boolean
      '检查是否时跳转,跳转符号 E9
      If Marshal.ReadByte(adress) = 233 Then
            If IntPtr.Size = 4 Then
                Dim pass As Integer = Marshal.ReadInt32(New IntPtr(adress.ToInt32() + 1))
                adress = New IntPtr(adress.ToInt32() + pass + 5)
            Else
                Dim pass As Integer = Marshal.ReadInt32(New IntPtr(adress.ToInt64() + 1))
                adress = New IntPtr(adress.ToInt64() + pass + 5)
            End If
      End If

      '检查是否为指定值,如果不是返回0
      If Marshal.ReadByte(adress) = val Then
            If IntPtr.Size = 4 Then
                adress = New IntPtr(adress.ToInt32() + len)
            Else
                adress = New IntPtr(adress.ToInt64() + len)
            End If
            Return True
      Else
            Return False
      End If
    End Function
End Class


highflybird 发表于 2019-5-9 15:09:36

mikewolf2k 发表于 2019-5-9 09:35
学习了,原来原理是木马,拷贝正常元素数据的同时,偷偷在另一个地方拷贝了个标志。
不知道能否告知详细一 ...

暴力寻找法,在某段地址一个个找,找到这个标志,就修改它,然后教育版就去掉了。对电脑来说,就相当于做几百次加减法,是一件很容易的事情。
DXF的办法我没用过,但应该会丢失DWG的一些信息,所以这种方法不完美。

依然小小鸟 发表于 2019-5-8 18:16:30

大神终于出现了

依然小小鸟 发表于 2019-5-8 18:17:13

论坛最近死气沉沉好多大神都不在论坛活跃了 希望版主能让论坛重振雄风

arcers 发表于 2019-5-8 19:05:11

本帖最后由 arcers 于 2019-5-8 19:10 编辑


飞鸟大神威武!!!

highflybird 发表于 2019-5-8 19:10:37

arcers 发表于 2019-5-8 19:05
飞鸟大神威武!!!

QJYB.R2019-2020.x64.arx 不就是的吗?

flythinking 发表于 2019-5-9 08:22:41

多谢飞鸟大大分享!

lkmfly 发表于 2019-5-9 09:06:53

飞鸟威武

angel066499 发表于 2019-5-9 09:35:21

大师好

mikewolf2k 发表于 2019-5-9 09:35:25

学习了,原来原理是木马,拷贝正常元素数据的同时,偷偷在另一个地方拷贝了个标志。
不知道能否告知详细一点的信息, 具体怎么找这个偏移地址?
另外不知道现在转成dxf再转回来的方法还是否适用?毕竟dxf是文本明码,如果多拷了个东西,容易被发现。

cairunbin 发表于 2019-5-9 10:26:04

赞一个!
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: [飞鸟集]去教育版讨论及源码(ARX,LISP版)