吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 104596|回复: 314
收起左侧

[.NET逆向] 加密狗模拟破解「XX地图下载器」

    [复制链接]
爱飞的猫 发表于 2015-9-1 21:30
本帖最后由 云在天 于 2019-6-7 13:13 编辑

参考帖子:.NET破解之太乐地图下载器【非暴破】 <- 软件介绍相关请参考这篇
第一次写破解过程,如有错误还请指出。
★★ 仅供学习交流之用 请勿用于商业用途 ★★


单词表/工具
IDE: 开发环境,比如商用的 Visual Studio,免费开源的 Sharp Develop。
Encrypt: 加密
String: 字符串
Dog: 狗,在此处可理解为加密狗
.NET: 微软开发的变成框架,可使用 .NET Reflector 进行反编译。

使用到的逆向工具可以在爱盘找到:http://down.52pojie.cn/Tools/NET/
IDE 请自行搜索 :3

一、拆解文件,寻找验证
脱壳这个很简单 扔到 de4dot 神器自动脱掉了。

把处理后的文件扔到 .NET Reflector 里面,右键模组 -> Go To Entry Point 进入入口点
跳至入口.png

观察代码,程序在入口点通过建立互斥体检测程序是否已经运行,然后进入「MainForm」窗口。
[C#] 纯文本查看 复制代码
[STAThread]
private static void Main()
{
    try
    {
        bool flag;
        Mutex mutex = new Mutex(true, Application.ProductName, out flag);
        if (flag)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Class2.np6LKJCzZAthI();                                 // 空的函数,不用管 (可点进去看到)
            Application.Run(new MainForm());                        // 主窗口为 MainForm, 我们点进去查看内容
            mutex.ReleaseMutex();
        }
        else
        {
            MessageBox.Show(null, "软件已开启,请确认AZMap.exe进程关闭后再启动软件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            Application.Exit();
        }
    }
    catch (Exception exception)
    {
        LogUtil.Error(exception.Message, exception);
    }
}


在主窗口初始化的代码内,「初始化运行环境」的下面有一行很可疑,「InitLicense 初始化授权」:
[C#] 纯文本查看 复制代码
public MainForm()
{
    Class2.np6LKJCzZAthI();
    this._useCache = true;
    this._useHistory = true;
    this.lastPoint = new PointLatLng();
    Control.CheckForIllegalCrossThreadCalls = false;
    this._loginWindow = new Login();
    new Thread(new ThreadStart(this.startLoginWindow)).Start();
    this.setLoginWindowsStatus("初始化运行环境...");
    this.InitializeComponent();
    this.InitLicense();                                            // 初始化授权,点进去看看
    this._commands = new MetroCommands();
    // 代码省略 ...


看到代码后,可以发现我们没有找错,许可授权在这里读取:
[C#] 纯文本查看 复制代码
private void InitLicense()
{
    try
    {
        SN.RegisterProductCode = "wfg783X8Joo=";                     // 后面写了个工具解密这类文字,我们的目标是加密狗因此这行并没有什么卵用
        LicenseType lic = SN.Registered(RegisterProduct.Desktop);    // 取得授权状态。
        this.RefreshFormTitle(lic);                                  // 启用、禁用各类功能 (根据授权)
        this.StartDogListener();                                     // 开始监听加密狗事件,真直白的名字。
        // 代码省略 ...

SN 全名 Serial Number[序列号],这个类名也很直白,就是我们研究的目标了。

二、拆解验证,糊点代码
点进去 SN 这个类,然后单击 Reflector 界面最底部的「Expand Methods」展开这个类所有代码,方便分析:
展开代码.png

把全部文件拷贝到 Visual Studio 或文字编辑器备份,定位到 Registered 这个方法:
[C#] 纯文本查看 复制代码
    public static LicenseType Registered(RegisterProduct regProduct = 1)
    {
        if (NTFind() == 0)
        {
            if (NTLogin() && NTReadIv())
            {
                return NTReadLicense();
            }
            return LicenseType.Trial;
        }
        string path = GetLocalAZMapPath(regProduct) + "azmap_4";
        string str2 = GetLocalPath(regProduct) + "azmap_check_4";
        // 代码省略 ...

这段代码,表示程序会优先检查加密狗内部的授权。若是加密狗不存在,则进行序列号的校验。

把狗相关的函数提取出来,分析一下调用:
[C#] 纯文本查看 复制代码
    private static int NTFind()
    {
        return NT88API.NTFindFirst(NTCode);
    }

    private static bool NTLogin()
    {
        bool flag = false;
        try
        {
            if (NT88API.NTLogin(string_0) == 0)
            {
                flag = true;
            }
        }
        catch (Exception)
        {
        }
        return flag;
    }

    private static bool NTReadIv()
    {
        bool flag = false;
        try
        {
            byte[] pData = new byte[7];
            if ((NT88API.NTRead(0, 7, pData) == 0) && (Encoding.Default.GetString(pData) == NTIv))
            {
                flag = true;
            }
        }
        catch (Exception)
        {
        }
        return flag;
    }

NTFind:   调用 API 「NTFindFirst」 查询第一个加密狗的存在,返回 0 表示成功。
NTLogin:  调用 API 「NTLogin」 尝试登录,返回 0 表示成功 (加了容错处理,所以代码看起来比较怪),方法返回 true 表示成功。
NTReadIv: 调用 API 「NTRead」 读入加密狗数据,并与内置的密文进行比对验证,方法返回 true 表示获取成功并验证通过。
NTReadLicense: 读取狗上面的数据,根据数据返回相应的授权信息。

前两个,直接在 DLL 修改为返回 0 即可:
[Asm] 纯文本查看 复制代码
xor eax, eax
retn 04h


后面一个有点麻烦,因为需要读取数据到内存进行验证,而数据又不能凭空出现。
把「NTReadIv」这个方法的功能翻译成白话大概就是:
1. 申请 7 个字节的数据块。
2. 读取狗的数据:从 0 开始读取 7 个字节,读到的内容写到刚才申请的数据块里面。
3. 如果数据块的内容与「NTIv」这个变量的内容一致则验证成功,否则失败。

而在此之前,我们需要知道所谓的密文是什么内容;回到构建函数 (SN -> .cctor)
[C#] 纯文本查看 复制代码
static SN()
{
    Class3.lQUOYnkznSKeP();   // 不用管,空函数,删掉即可
    NTCode = EncryptString.ThisIsLegalString("h9puNortcwP/Y2Kl6MDz4A0obLNWW4uD");
    string_0 = EncryptString.ThisIsLegalString("kWzdAyI6OhVUwAE69SdTMW4skDH2i+uEM2mrsvDGcdiv2wWi2xU8/A==");
    NTIv = EncryptString.ThisIsLegalString("jztU+R63Ke4=");
    // 代码省略 ...


到这里就比较简单了,进去 EncryptString 这个类全部拷贝到 IDE,然后简单做一个界面 [自行美化吧~]:
逆向辅助-文字解密.png

解密按钮的事件代码按照程序里的写法糊进去就行:
[C#] 纯文本查看 复制代码
        private void btnDecrypt_Click(object sender, EventArgs e)
        {
            txtPlain.Text = EncryptString.ThisIsLegalString(txtSource.Text);
        }

解密后,可以看到这样的内容:
NTCode: 1234567890arctiler
string_0: 3eee0d60fbb583e1bf33c6990d5f9e0d
NTIv: azmap09
顺便: SN.RegisterProductCode 的文字解密后是「desktop」,可理解为桌面版。

此时,可以知道加密狗从 0 到 7 的内容是 azmap09 这一串字符了,记录下来:
狗数据.png

当这三个验证都通过后,程序就会调用 NTReadLicense 读取狗上面记录的内容;
[C#] 纯文本查看 复制代码
private static LicenseType NTReadLicense()
{
    LicenseType free = LicenseType.Free;
    try
    {
        byte[] pData = new byte[2];
        if (NT88API.NTRead(0x10, 0x12, pData) != 0)
        {
            return free;
        }

    // 代码省略 ...


又看到了熟悉的 NTRead 函数。此时,读取的是 0x10(16) 开始的两个字节一直到 0x12 的位置。
接着往下看,一系列的判断分支,根据分支内容判断授权版本。在此之前,调查一下程序定义的授权类型:
[C#] 纯文本查看 复制代码
public enum LicenseType
{
    Enterprise,    // 企业版
    Professional,  // 专业版
    Standerd,      // 标准版
    Trial,         // 试用版
    Free,          // 免费版
    Given          // 到处发广告后挺通知作者获取的推广版授权
}

目标很清晰,就是我们功能最多、最全的「企业版」。

因此,把代码优化、精简一下:
[C#] 纯文本查看 复制代码
private static LicenseType NTReadLicense()
{
    LicenseType license = LicenseType.Free;
    
    // 读入加密狗数据
    byte[] pData = new byte[2];
    if (NT88API.NTRead(0x10, 0x12, pData) != 0)
    {
        return LicenseType.Free;
    }
    
    string str = Encoding.Default.GetString(pData);
    if (str != null)
    {
        // 根据应用版本判断授权版本
        switch (ApplicationConfig.Version) {
            case 0:
                switch(str) {
                    case "-1":
                        license = LicenseType.Enterprise;     // 企业版
                        break;
                    case "-3":
                        license = LicenseType.Professional;
                        break;
                    case "-5":
                        license = LicenseType.Standerd;
                        break;
                    
                    default:
                        license = LicenseType.Free;
                }
                break;
            case 1:
                switch(str) {
                    case "-2":
                        license = LicenseType.Professional;
                        break;
                    case "-4":
                        license = LicenseType.Standerd;
                        break;
                    
                    default:
                        license = LicenseType.Free;
                }
                break;
            case 2:
                if (str == "-9") {
                    license = LicenseType.Enterprise;         // 企业版
                } else {
                    license = LicenseType.Free;
                }
                break;
        }
    }
    R.Instance.SetLicenseType(license);
    R.Instance.SetDogLicenseType(license);
    return license;
}


得出结论,加密狗授权信息是根据加密狗里面的数据以及 ApplicationConfig.Version 里面的数据判断的。而 Version 这个数据需要调查一下是 0、1 还是 2:
[C#] 纯文本查看 复制代码
// 取得版本
public static int get_Version()
{
    int result = 1;
    if (getValue("Version") != null)
    {
        int.TryParse(getValue("Version"), out result);  // 读取 Version 属性
    }
    return result;
}

// 取得属性值
private static string getValue(object key)
{
    try
    {
        // 竟然是一个 SQLite 数据库
        object obj2 = SQLiteHelper.ExecuteScalar(conn, "select value from Config where key = @key", new SQLiteParameter[] { new SQLiteParameter("@key", key) });
        if (obj2 == null)
        {
            return null;
        }
        return obj2.ToString();
    }
    catch
    {
        return null;
    }
}

// 回到类初始化查看初始化代码 ..
static ApplicationConfig()
{
    Class3.lQUOYnkznSKeP();
    conn = null;
    connLock = new object();
    inited = false;
    initedObject = new object();
    if (conn == null)
    {
        lock (connLock)
        {
            if (conn == null)
            {
                // 数据库文件是 Config 文件,里面又一个 Config 表
                conn = SQLiteHelper.GetSQLiteConn("Config");
                if (!SQLiteHelper.ContainTable(conn, "Config"))
                {
                    SQLiteHelper.ExcuteNoneQuery(conn, "create table Config(key nvarchar(256) primary key,value nvarchar(256))", null, null);
                }
            }
        }
    }
}


而当我把数据库用工具打开时,却提示我数据库被加密或无效.. 走进去「GetSQLiteConn」看看怎么处理:

[C#] 纯文本查看 复制代码
        // 代码省略 ..
        connection = new SQLiteConnection {
            ConnectionString = builder.ToString()
        };
        connection.SetPassword(DB_PASSWORD);        // 有密码
        connection.Open();
        // 代码省略 ..

// 回到类的构造函数看初始化
static SQLiteHelper()
{
    Class3.lQUOYnkznSKeP();      // 空的函数,无视它
    DB_PASSWORD = EncryptString.ThisIsLegalString("jztU+R63Ke4=");
    SQLITE_PAGE_SIZE = 0x8000;
}

熟悉的加密文字,扔到工具里解密看看,还真是这个「azmap09」。

于是糊了几行代码,取得数据库储存的代码号是 0。因此如果想让版本为企业版,加密狗的内容必须是 -1 了。
加密狗数据-完整.png

三、戏弄程序,编写狗狗
首先摸清目标狗的导出函数:
狗函数.png

然后编写个相同的导出函数;我这里首先用的是 C++
[C++] 纯文本查看 复制代码
// 文件: FakeLib.h

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the FAKELIB_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// FAKELIB_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef FAKELIB_EXPORTS
#define FAKELIB_API extern "C" __declspec(dllexport) int __stdcall
#else
#define FAKELIB_API __declspec(dllimport)
#endif

FAKELIB_API _NT3DESCBCDecrypt(char* vi, char* pDataBuffer, int length);
FAKELIB_API _NT3DESCBCEncrypt(char* vi, char* pDataBuffer, int length);
FAKELIB_API _NTCheckLicense(int licenseCode);

FAKELIB_API _NTFindFirst(char* NTCode);
FAKELIB_API _NTGetHardwareID(char* hardwareID);

FAKELIB_API _NTLogin(char* LoginCode);
FAKELIB_API _NTLogout();
FAKELIB_API _NTRead(int address, int Length, char* pDataBuffer);
FAKELIB_API _NTWrite(int address, int Length, char* pDataBuffer);


[C++] 纯文本查看 复制代码
// FakeLib.cpp : Defines the exported functions for the DLL application.
//

#include <windows.h>
#include "FakeLib.h"

int __stdcall _NT3DESCBCDecrypt(char* vi, char* pDataBuffer, int length)
{
    return 0;
}

int __stdcall _NT3DESCBCEncrypt(char* vi, char* pDataBuffer, int length)
{
    return 0;
}

int __stdcall _NTCheckLicense(int licenseCode)
{
    return 0;
}

int __stdcall _NTFindFirst(char* NTCode)
{
    return 0;
}

int __stdcall _NTGetHardwareID(char* hardwareID)
{
    return 0;
}

int __stdcall _NTLogin(char* LoginCode)
{
    return 0;
}

int __stdcall _NTLogout()
{
    return 0;
}

char* _dogData = "azmap09.........-1";
int __stdcall _NTRead(int address, int endAddress, char* pDataBuffer)
{
    int size = endAddress - address;
    DWORD oldProtect;
    VirtualProtect(pDataBuffer, size, PAGE_READWRITE, &oldProtect);
    memcpy(pDataBuffer, _dogData + address, size);
    VirtualProtect(pDataBuffer, size, oldProtect, &oldProtect);
    return 0;
}

int __stdcall _NTWrite(int address, int Length, char* pDataBuffer)
{
    return 0;
}


最后带上修正导出表的 def 文件:
LIBRARY FakeLib
EXPORTS
    NT3DESCBCDecrypt=_NT3DESCBCDecrypt
    NT3DESCBCEncrypt=_NT3DESCBCEncrypt
    NTCheckLicense=_NTCheckLicense
    NTFindFirst=_NTFindFirst
    NTGetHardwareID=_NTGetHardwareID
    NTLogin=_NTLogin
    NTLogout=_NTLogout
    NTRead=_NTRead
    NTWrite=_NTWrite
编译后更名 NT88.dll,扔进去看看:
太乐地图-主界面.png
关于界面.png
企业版。嘛,就这样了 :3

附、汇编重写
使用 FASM 制作,生成的文件超级小。
还有个原因就是 MSVC 编译器会加一些奇怪的导出函数不会改.. 太不美观了!

[Asm] 纯文本查看 复制代码
format PE GUI 4.0 DLL
entry DllMain
include 'win32ax.inc'

section '.text' code readable executable

; 入口函数
proc DllMain hinstDLL,fdwReason,lpvReserved
  mov al, 1
  ret
endp

; 读取狗数据
; int NTRead(int address, int endAddress, char* pDataBuffer);
proc NTRead address,endAddress,pDataBuffer
  local oldProtect:DWORD
  push esi
  push edi
  
  mov ecx, [endAddress]
  mov esi, [address]
  sub ecx, esi
  push ecx
  mov edi, [pDataBuffer]
  
  lea eax, [oldProtect]
  push eax                      ; OldProtect
  push PAGE_READWRITE              ; New Protect
  push ecx                      ; Size
  push edi                      ; Source Address
  call [VirtualProtect]
  
  ; 回写数据
  mov ecx, [esp]              ; pop ecx  &  push ecx
  mov esi, _dogData              ; 指向模拟狗的数据
  add esi, [address]
  cld
  rep movsb
  
  pop ecx
  lea eax, [oldProtect]
  push eax                      ; OldProtect
  push [oldProtect]              ; New Protect
  push ecx                      ; Size
  sub edi, ecx                      ; edi 会增加, 所以改回去
  push edi                      ; Source Address
  call [VirtualProtect]
  pop edi
  pop esi
  
  xor eax, eax
  ret
endp

; 填充用函数 - 3 参数
proc NT3Arg a1, a2, a3
  xor eax, eax
  ret
endp

; 填充用函数 - 1 参数
proc NT1Arg a1
  xor eax, eax
  ret
endp

; 填充用函数 - 0 参数
proc NT0Arg
  xor eax, eax
  retn
endp

; 狗数据
section '.data' data readable writeable
  _dogData db 'azmap09.........-1'

; 导入表
section '.idata' import data readable writeable
  library kernel,'KERNEL32.DLL'
  import kernel,\
    VirtualProtect, 'VirtualProtect'

; 导出表
section '.edata' export data readable
  export 'NT88.DLL',\
    NT3Arg,'NT3DESCBCDecrypt',\
    NT3Arg,'NT3DESCBCEncrypt',\
    NT1Arg,'NTCheckLicense',\
    NT1Arg,'NTFindFirst',\
    NT1Arg,'NTGetHardwareID',\
    NT1Arg,'NTLogin',\
    NT0Arg,'NTLogout',\
    NTRead,'NTRead',\
    NT3Arg,'NTWrite'

section '.reloc' fixups data readable discardable


★★ 仅供学习交流之用 请勿用于商业用途 ★★

P.s. 没看错的话 NT88.dll 还可以直接写数据到狗里面。

太乐逆向辅助工具[C# 源码-VS2015].7z (414.43 KB, 下载次数: 651)
fake_NT88_fix1.7z (1.63 KB, 下载次数: 964)

Fix1:
修正 Windows 7+ 系统的崩溃问题,感谢 my1229 的测试。

--- 存档用,有错误;修正版请看上面
fake_NT88.7z (1.55 KB, 下载次数: 416)

免费评分

参与人数 73吾爱币 +11 热心值 +72 收起 理由
sunnylds7 + 1 + 1 用心讨论,共获提升!
misran + 1 + 1 谢谢@Thanks!
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
renzhejun + 1 + 1 这个是怎么玩的啊????
tchivs + 2 + 1 谢谢@Thanks!
tianexe + 1 谢谢@Thanks!
仅有的执着 + 1 + 1 更新到5.19了 新的好像没反应了
南城以南得南 + 1 + 1 谢谢@Thanks!
adsl96 + 1 我很赞同!
b95588 + 1 + 1 我有个程序能不能帮我破解一下啊,急用
gdf19871119 + 1 + 1 谢谢@Thanks!
交流学习 + 1 + 1 大牛,好棒。http://pan.baidu.com/s/1misfUNA,请给教程。谢谢
mormas + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sxhytds + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kka950 + 1 谢谢@Thanks!
99910369 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Shock + 1 用心讨论,共获提升!
RPAL + 1 用心讨论,共获提升!
wenfanzheng + 1 谢谢@Thanks!
shenhaiyu + 1 不给加分太对不起作者了
丶丿夏灬末 + 1 我很赞同!
Va1 + 1 谢谢@Thanks!
rong578951269 + 1 不明觉厉
qq763469703 + 1 热心回复!
罗大伊 + 1 虽然不用也不懂,不过觉得很厉害的样子!!.
邪恶精灵 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
xyyit + 1 膜拜大神!
F_雪 + 1 谢谢@Thanks!
易水若寒 + 1 鼓励转贴优秀软件安全工具和文档!
偷袭大师 + 1 我很赞同!
tlld1234 + 1 太强悍了
毛线没有团团 + 1 热心回复!
牧谷娜娜 + 1 我很赞同!
lxcjy + 1 谢谢@Thanks!
灵影 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
晨曦男神 + 1 我很赞同!
干鸡毛 + 1 已答复!
qaz003 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
rainisa + 1 导出函数的参数怎么确定?
wfl6 + 1 谢谢@Thanks!
long7854874 + 1 谢谢@Thanks!
c_ailu001 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
HonDmOon + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
kw7142 + 1 热心回复!
jacky520510 + 1 我很赞同!
朝太阳奔跑 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
lsyq5647 + 1 94楼,无 法安装原版,什么原因了。
yuan3718 + 1 谢谢@Thanks!
asdnasiudn + 1 我很赞同!
2286390676 + 1 谢谢@Thanks!
chsatar + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
这只猪 + 1 大神威武!
ygh520 + 1 热心回复!
tzxinqing + 1 膜拜汇编大神
麦秸 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
Monitor + 1 热心回复!
do141414 + 1 我很赞同!
Tortoise + 1 谢谢@Thanks!
so丶小静 + 1 谢谢@Thanks!
雷霆 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
看我名字的SB + 1 已经处理,感谢您对吾爱破解论坛的支持!
我也是个傻瓜 + 1 看了大神的文章,我想去把我的帖子删掉!
yicong135 + 1 膜拜写汇编的高手
katkat + 1 我很赞同!
ljrlove2008 + 1 膜拜玩狗的……
wu0687050 + 1 亲测可用,佩服会玩狗的。
元O帅 + 1 谢谢@Thanks!
ghostfish + 1 我很赞同!
my1229 + 1 支持楼主的详细教程,学习了!
myqqq + 1 支持大神作品
逍遥枷锁 + 1 谢谢@Thanks!
djyag10 + 1 评个分,求眼熟
hyj5719 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 爱飞的猫 发表于 2015-9-10 05:24
cinesejin 发表于 2015-9-10 03:48
请问各位破解加密狗的软件  必须先自己买个 加密狗的吗

不一定。这篇帖子通过反编译程序代码逆向出了应该在加密狗上的数据。

但是,新版本可能会针对模拟狗的不完善之处进行防破解措施,例如随机读取其它位置的内容进行验证。
xzdzbj 发表于 2015-11-24 13:32
技术贴,虽然我是个搬砖的,但是对于这种高科技人才,我是佩服的五体投地。请收下我的膝盖在地上砸的坑吧。    出了太乐地图5.0.2版本了  以后还会出破解吗?
狼牙 发表于 2015-9-1 21:34
FantasyOwl 发表于 2015-9-1 21:37
分析的好详细,感谢分享
来自星星的我 发表于 2015-9-1 21:38
沙发么??太激动了,撸主的文章让在下受益匪浅!!!
hyj5719 发表于 2015-9-1 21:48
前来学习技术贴。
xyzxf 发表于 2015-9-1 21:58
汇编很流弊。。。。
segasonyn64 发表于 2015-9-1 23:00
看样子是龙脉的加密狗啊,这个加密狗貌似挺简单的,可以直接在读写狗的DLL里面修改返回信息
my1229 发表于 2015-9-1 23:10
本帖最后由 my1229 于 2015-9-1 23:29 编辑

支持楼主的详细教程,学习了!将NT88.dll扔进去安装目录复盖原文件,软件运行出错?
QQ图片20150901232744.png
zailush 发表于 2015-9-1 23:17
谢谢分享,学习学习
 楼主| 爱飞的猫 发表于 2015-9-2 00:16
my1229 发表于 2015-9-1 23:10
支持楼主的详细教程,学习了!将NT88.dll扔进去安装目录复盖原文件,软件运行出错?

我只在 xp 下测试过,待我扔 7 里面看看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-18 12:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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