对.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混淆加壳等。 这文章从哪复制过来的?没法看了。 不是复制的呀,花了两个小时一个字一个字码出来的,中间那部分代码不看的话文章应该还是可以看的,明天我把源码、工具和word版都打包发一份 链接:https://pan.baidu.com/s/1jsgh1ADrf7ed8D5rO-AoQw
提取码:ipam
word版的文章+源代码+所有用到的工具,希望您再看一下。 游客 222.182.188.x 发表于 2018-12-4 09:29
链接:https://pan.baidu.com/s/1jsgh1ADrf7ed8D5rO-AoQw
提取码:ipam
word版的文章+源代码+所有用到 ...
帖子发在看雪了?我看下载地址写的是看雪地址? 没有发看雪,这个是复制的之前别人申请成功的模板然后在word里面改的。。。 游客 113.118.42.x 发表于 2018-12-6 02:02
没有发看雪,这个是复制的之前别人申请成功的模板然后在word里面改的。。。
过程有些简单,再补充一些技术分析吧。 接触破解脱壳也才一个多月,也就只有这点水平了,一般的.net程序搞起来问题不大,主要是没有找到合适的案例。我已经够买了一个注册码。 shoucang xaile
页:
[1]