发表于 2018-12-1 14:02

对.net的程序添加加密狗验证功能(以加壳的ScanID为例)

1、申 请 I D:l403091644   (第一个是字母L)
2、个人邮箱:gdrz815@126.com
3、原创技术文章:对.net的程序添加加密狗验证功能


对.net的程序添加加密狗验证功能(原创)

【研究作者】 WayneLee
【使用工具】 Dnspy、VS2015、ET199加密狗及写狗软件、ScanId、de4dot
【研究平台】 win7x64
【软件名称】 ScanId.exe(仅以此软件制作教程,方法可以适用于任何软件)
【研究日期】 2018-11-30
【程序+代码下载】 申请通过之后上传所有附件和代码。
简介:最近破解了一款国外的商业软件,由于该软件盗版查的很严,破解之后也不敢直接给同事用,怕他们拿出去乱搞,于是就想了给软件在增加以下验证,避免被同事二次变卖等等。为了保护被破解软件的隐私,这里就用大家常用的ScanID来做教程。
1:找到一个空的加密狗,我用的ET199,据说这款加密狗硬复制难度不小。用加密狗写狗工具写入种子号和ATR(其实ATR没什么卵用,主要是靠种子号生成的客户号)。                              2.读取并记录下种子号。 3.制作ET199加密狗验证的工程文件(为了降低学习难度,这里就不进行加密锁算法验证,直接用种子号验证)。修改工程文件中的ATR和客户号为刚才记录的信息。4.重新生成此工程,得到ET199验证程序。将此程序丢入Dnspy中,复制加密狗验证部分的代码。之所以先生成代码,在复制而不是直接在dnspy中编写时为了让dnspy出错的概率降低,毕竟VS编译的出来的程序鲁棒性更好。 需要复制的内容如下:                   // Token:0x06000007 RID: 7                                      publicstatic extern uint ETEnum(byte[] pETContextList, ref uint dwET199Count);                  // Token:0x06000008 RID: 8                                     public static extern uint ETOpen(byte[]pETContextList);                  // Token:0x06000009 RID: 9                                      publicstatic extern uint ETClose(byte[] pETContextList);                  // Token:0x0600000A RID: 10                                      publicstatic extern uint ETEraseDir(byte[] pETContextList, string lpszDirID);                  // Token:0x0600000B RID: 11                                      publicstatic extern uint ETVerifyPin(byte[] pETContextList, byte[] pbPin, uintdwPinLen, uint dwPinType);                  // Token:0x0600000C RID: 12                                      publicstatic extern uint ETChangePin(byte[] pETContextList, byte[] pbOldPin, uintdwOldPinLen, byte[] pbNewPin, uint dwNewPinLen, uint dwPinType, bytebyPinTryCount);                  // Token:0x0600000D RID: 13                                      publicstatic extern uint ETCreateFile(byte[] pETContextList, string lpszFileID, uintdwFileSize, byte bFileType);                  // Token:0x0600000E RID: 14                                      publicstatic extern uint ETWriteFile(byte[] pETContextList, string lpszFileID, uintdwOffset, byte[] pBuffer, uint dwBufferSize);                  // Token:0x0600000F RID: 15                                      publicstatic extern uint ETExecute(byte[] pETContextList, string lpszFileID, byte[]pInBuffer, uint dwInbufferSize, byte[] pOutBuffer, uint dwOutBufferSize, refuint pdwBytesReturned);                  // Token:0x06000010 RID: 16                                      publicstatic extern uint ETControl(byte[] pETContextList, uint dwCtlCode, byte[]pInBuffer, uint dwInbufferSize, byte[] pOutBuffer, uint dwOutBufferSize, refuint pdwBytesReturned);                  // Token:0x06000011 RID: 17                                      publicstatic extern uint RSAData(byte[] pbPubKey, uint ulPubKeyLen, byte[] pbData,uint ulDataLen);                  // Token:0x04000001 RID: 1                   public constuint ET_S_SUCCESS = 0u;                  // Token:0x04000002 RID: 2                   public constuint ET_E_KEY_REMOVED = 4026531841u;                  // Token:0x04000003 RID: 3                   public constuint ET_E_INVALID_PARAMETER = 4026531842u;                  // Token:0x04000004 RID: 4                   public constuint ET_E_COMM_ERROR = 4026531843u;                  // Token:0x04000005 RID: 5                   public constuint ET_E_INSUFFICIENT_BUFFER = 4026531844u;                  // Token:0x04000006 RID: 6                   public constuint ET_E_NO_LIST = 4026531845u;                  // Token:0x04000007 RID: 7                   public constuint ET_E_DEVPIN_NOT_CHECK = 4026531846u;                  // Token:0x04000008 RID: 8                   public constuint ET_E_USERPIN_NOT_CHECK = 4026531847u;                  // Token:0x04000009 RID: 9                   public constuint ET_E_RSA_FILE_FORMAT_ERROR = 4026531848u;                  // Token:0x0400000A RID: 10                   public constuint ET_E_DIR_NOT_FOUND = 4026531849u;                  // Token:0x0400000B RID: 11                   public constuint ET_E_ACCESS_DENIED = 4026531850u;                  // Token:0x0400000C RID: 12                   public constuint ET_E_ALREADY_INITIALIZED = 4026531851u;                  // Token:0x0400000D RID: 13                   public constuint ET_E_INCORRECT_PIN = 4026534912u;                  // Token:0x0400000E RID: 14                   public constuint ET_E_DF_SIZE = 4026531853u;                  // Token:0x0400000F RID: 15                   public constuint ET_E_FILE_EXIST = 4026531854u;                  // Token:0x04000010 RID: 16                  public const uint ET_E_UNSUPPORTED =4026531855u;                  // Token:0x04000011 RID: 17                   public constuint ET_E_FILE_NOT_FOUND = 4026531856u;                  // Token:0x04000012 RID: 18                   public constuint ET_E_ALREADY_OPENED = 4026531857u;                  // Token:0x04000013 RID: 19                   public constuint ET_E_DIRECTORY_EXIST = 4026531858u;                  // Token:0x04000014 RID: 20                   public constuint ET_E_CODE_RANGE = 4026531859u;                  // Token:0x04000015 RID: 21                   public constuint ET_E_INVALID_POINTER = 4026531860u;                  // Token:0x04000016 RID: 22                   public constuint ET_E_GENERAL_FILESYSTEM = 4026531861u;                  // Token:0x04000017 RID: 23                   public constuint ET_E_OFFSET_BEYOND = 4026531862u;                  // Token:0x04000018 RID: 24                   public constuint ET_E_FILE_TYPE_MISMATCH = 4026531863u;                  // Token:0x04000019 RID: 25                   public constuint ET_E_PIN_BLOCKED = 4026531864u;                  // Token:0x0400001A RID: 26                   public constuint ET_E_INVALID_CONTEXT = 4026531865u;                  // Token:0x0400001B RID: 27                   public constuint ET_E_SHARING_VIOLATION = 4026531866u;                  // Token:0x0400001C RID: 28                   public constuint ET_TOOMUCHTHREAD = 4026531867u;                  // Token:0x0400001D RID: 29                   public constuint ET_E_ERROR_UNKNOWN = 4294967295u;                  // Token:0x0400001E RID: 30                   public constuint ET_E_LOAD_FILE_FAILED = 4026535937u;                  // Token:0x0400001F RID: 31                   public constuint MAX_ATR_LEN = 16u;                  // Token:0x04000020 RID: 32                   public constuint MAX_ID_LEN = 8u;                  // Token:0x04000021 RID: 33                   public constuint ET_USER_PIN = 0u;                  // Token:0x04000022 RID: 34                   public constuint ET_DEV_PIN = 1u;                  // Token:0x04000023 RID: 35                   public constuint ET_CREATE_NEW = 0u;                  // Token:0x04000024 RID: 36                   public constuint ET_UPDATE_FILE = 1u;                  // Token:0x04000025 RID: 37                   public constuint ET_CREATE_ROOT_DIR = 0u;                  // Token: 0x04000026RID: 38                   public constuint ET_CREATE_SUB_DIR = 1u;                  // Token:0x04000027 RID: 39                   public constuint ET_LED_UP = 1u;                  // Token:0x04000028 RID: 40                   public constuint ET_LED_DOWN = 2u;                  // Token:0x04000029 RID: 41                   public constuint ET_LED_WINK = 3u;                  // Token:0x0400002A RID: 42                   public constuint ET_GET_DEVICE_TYPE = 17u;                  // Token:0x0400002B RID: 43                   public constuint ET_GET_SERIAL_NUMBER = 18u;                  // Token:0x0400002C RID: 44                   public constuint ET_GET_DEVICE_USABLE_SPACE = 19u;                  // Token:0x0400002D RID: 45                   public constuint ET_GET_DEVICE_ATR = 20u;                  // Token:0x0400002E RID: 46                   public constuint ET_GET_CUSTOMER_NAME = 21u;                  // Token:0x0400002F RID: 47                   public constuint ET_GET_MANUFACTURE_DATE = 22u;                  // Token: 0x04000030RID: 48                   public constuint ET_GET_DF_AVAILABLE_SPACE = 23u;                  // Token:0x04000031 RID: 49                   public constuint ET_GET_EF_INFO = 24u;                  // Token:0x04000032 RID: 50                   public constuint ET_GET_COS_VERSION = 25u;                  // Token:0x04000033 RID: 51                   public constuint ET_SET_DEVICE_ATR = 33u;                  // Token:0x04000034 RID: 52                   public constuint ET_SET_DEVICE_TYPE = 34u;                  // Token:0x04000035 RID: 53                   public constuint ET_SET_SHELL_KEY = 35u;                  // Token:0x04000036 RID: 54                   public constuint ET_SET_CUSTOMER_NAME = 36u;                  // Token:0x04000037 RID: 55                   public constuint ET_RESET_DEVICE = 49u;                  public bool getinfo()                   {                            uintdwET199Count = 0u;                            uintdwRet = MainWindow.ETEnum(null, ref dwET199Count);                            byte[]pET199 = new byte;                            dwRet= MainWindow.ETEnum(pET199, ref dwET199Count);                            boolflag = dwRet > 0u;                            boolresult;                            if(flag)                            {                                     result= false;                            }                            else                            {                                     dwRet= MainWindow.ETOpen(pET199);                                     boolflag2 = dwRet > 0u;                                     if(flag2)                                     {                                             result= false;                                     }                                     else                                     {                                             uintbytesReturned = 0u;                                             byte[]OutBuffer = new byte;                                             dwRet= MainWindow.ETControl(pET199, 17u, null, 0u, OutBuffer, 1u, refbytesReturned);                                             boolflag3 = dwRet > 0u;                                             if(flag3)                                             {                                                      result= false;                                             }                                             else                                             {                                                      OutBuffer= new byte;                                                      dwRet= MainWindow.ETControl(pET199, 18u, null, 0u, OutBuffer, 8u, refbytesReturned);                                                      boolflag4 = dwRet > 0u;                                                      if(flag4)                                                      {                                                               result= false;                                                      }                                                      else                                                      {                                                               OutBuffer= new byte;                                                               dwRet= MainWindow.ETControl(pET199, 19u, null, 0u, OutBuffer, 4u, refbytesReturned);                                                               boolflag5 = dwRet > 0u;                                                               if(flag5)                                                               {                                                                           result= false;                                                               }                                                               else                                                                  {                                                                           OutBuffer= new byte;                                                                           dwRet= MainWindow.ETControl(pET199, 20u, null, 0u, OutBuffer, 16u, refbytesReturned);                                                                           boolflag6 = dwRet > 0u;                                                                           if(flag6)                                                                           {                                                                                    result= false;                                                                           }                                                                           else                                                                           {                                                                                    stringATRID = "";                                                                                    foreach(byte b in OutBuffer)                                                                                    {                                                                                             ATRID+= b.ToString("X").PadLeft(2, '0');                                                                                    }                                                                                    boolflag7 = ATRID != "31323300000000000000000000000000";                                                                                    if(flag7)                                                                                    {                                                                                             result= false;                                                                                    }                                                                                    else                                                                                    {                                                                                             OutBuffer= new byte;                                                                                             dwRet= MainWindow.ETControl(pET199, 21u, null, 0u, OutBuffer, 4u, refbytesReturned);                                                                                             boolflag8 = dwRet > 0u;                                                                                             if(flag8)                                                                                             {                                                                                                       result= false;                                                                                             }                                                                                             else                                                                                             {                                                                                                       stringUserID = "";                                                                                                       foreach(byte b2 in OutBuffer)                                                                                                       {                                                                                                                UserID+= b2.ToString("X").PadLeft(2, '0');                                                                                                       }                                                                                                       boolflag9 = UserID != "7467B7FA";                                                                                                       if(flag9)                                                                                                       {                                                                                                                result= false;                                                                                                       }                                                                                                       else                                                                                                       {                                                                                                                OutBuffer= new byte;                                                                                                                dwRet= MainWindow.ETControl(pET199, 23u, null, 0u, OutBuffer, 4u, refbytesReturned);                                                                                                                boolflag10 = dwRet > 0u;                                                                                                                if(flag10)                                                                                                                {                                                                                                                         result= false;                                                                                                                }                                                                                                                else                                                                                                                {                                                                                                                         OutBuffer= new byte;                                                                                                                         dwRet= MainWindow.ETControl(pET199, 25u, null, 0u, OutBuffer, 2u, ref bytesReturned);                                                                                                                         boolflag11 = dwRet > 0u;                                                                                                                         if(flag11)                                                                                                                         {                                                                                                                                 result= false;                                                                                                                         }                                                                                                                         else                                                                                                                         {                                                                                                                                 OutBuffer= new byte;                                                                                                                                 dwRet= MainWindow.ETControl(pET199, 22u, null, 0u, OutBuffer, 8u, refbytesReturned);                                                                                                                                 boolflag12 = dwRet > 0u;                                                                                                                                 if(flag12)                                                                                                                                 {                                                                                                                                          result= false;                                                                                                                                 }                                                                                                                                 else                                                                                                                                 {                                                                                                                                          MainWindow.ETClose(pET199);                                                                                                                                          result= true;                                                                                                                                 }                                                                                                                         }                                                                                                                }                                                                                                       }                                                                                             }                                                                                    }                                                                           }                                                               }                                                      }                                             }                                     }                            }                            returnresult;                   } 5.用De4dot对ScanID进行脱壳。得到ScanId-cleaned文件。不脱壳的话dnspy容易编译报错。 6.将ScanId-cleaned拖入dnspy-x86.exe中点击启动找到程序入口点位置。 7.找到入口点之后将刚才提取出来的代码贴到程序入口点所在的类中。此时编译会报错,这是我们需要修改错误内容。 将getinfo函数设置为静态。 将MainWindow替换为当前类。 添加对System.Runtime.InteropServices的引用; 然后错误就改完了,此时dnspy编译通过。8.在程序入口点增加对加密狗检测验证函数的调用。程序设定为没有找到加密狗则弹出对话框并kill掉自己。(如果想增加破解难度,可以把对话框去掉。) 9.保存修改后的程序并验证 插上加密狗时程序可以正常使用。10.为了增加破解难度,可以再进行二次混淆,比如用DNGuard混淆加壳等。

Hmily 发表于 2018-12-3 14:23

这文章从哪复制过来的?没法看了。

发表于 2018-12-4 02:30

不是复制的呀,花了两个小时一个字一个字码出来的,中间那部分代码不看的话文章应该还是可以看的,明天我把源码、工具和word版都打包发一份

发表于 2018-12-4 09:29

链接:https://pan.baidu.com/s/1jsgh1ADrf7ed8D5rO-AoQw
提取码:ipam
word版的文章+源代码+所有用到的工具,希望您再看一下。

Hmily 发表于 2018-12-4 17:51

游客 222.182.188.x 发表于 2018-12-4 09:29
链接:https://pan.baidu.com/s/1jsgh1ADrf7ed8D5rO-AoQw
提取码:ipam
word版的文章+源代码+所有用到 ...

帖子发在看雪了?我看下载地址写的是看雪地址?

发表于 2018-12-6 02:02

没有发看雪,这个是复制的之前别人申请成功的模板然后在word里面改的。。。

Hmily 发表于 2018-12-7 14:53

游客 113.118.42.x 发表于 2018-12-6 02:02
没有发看雪,这个是复制的之前别人申请成功的模板然后在word里面改的。。。

过程有些简单,再补充一些技术分析吧。

发表于 2018-12-7 22:02

接触破解脱壳也才一个多月,也就只有这点水平了,一般的.net程序搞起来问题不大,主要是没有找到合适的案例。我已经够买了一个注册码。

nxstone 发表于 2018-12-14 11:48

shoucang xaile
页: [1]
查看完整版本: 对.net的程序添加加密狗验证功能(以加壳的ScanID为例)