吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10738|回复: 26
收起左侧

[Patchers] [原创]Safengine 2.4.0 系统到期时间去除,告别改系统时间删注册表。

  [复制链接]
R-R, 发表于 2021-1-12 19:20
本帖最后由 R-R, 于 2021-1-12 19:37 编辑

//玩过Safengine壳的都应该了解它的限制项都在注册表里,只需要删除注册表项就能从新打开
//但是有个系统到期时间很麻烦,要手动改掉系统时间才行。当然_也有更好的方式,直接KeyGen即可
//这里我就只讲述我去除的系统到期和补丁的编写
//下面是补丁代码
//补丁里使用了minhook 感兴趣的朋友可以在GitHub上下载,演示的程序没有 shadow api,所以有shadowapi的程序这个补丁代码可能不适应,但去除的方法同理。

[Asm] 纯文本查看 复制代码
#include "stdafx.h"
#include "include/MinHook.h"
#include <Windows.h>
#include <atlstr.h>

typedef void (WINAPI *OldGetSystemTime)(LPSYSTEMTIME);
OldGetSystemTime fpMyC = NULL;
DWORD SEaddress = 0;

void DoEvents()
{
        MSG msg;
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
}

int L = 0;

void search(){

        DWORD processId = GetCurrentProcessId();
        HANDLE Hprocess;


        unsigned char makecode[0x002A] =
        {
                0xe5, 0x07, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x07
        };
      //By R-R,
        DWORD makecodesize = sizeof(makecode);

        int len = 0;
        MEMORY_BASIC_INFORMATION buf;
        SIZE_T d_len = sizeof(MEMORY_BASIC_INFORMATION);
        LPCVOID p_Address = NULL;
        BOOL ret;
        Hprocess = OpenProcess(PROCESS_ALL_ACCESS, false, processId);

        while (VirtualQueryEx(Hprocess, (LPCVOID)p_Address, &buf, d_len) != 0)
        {
                DWORD Address = 0;

                if (buf.Protect != 16 && buf.Protect != 1 && buf.Protect != 512)
                {

                        BYTE *m_code = new BYTE[buf.RegionSize];
                        ret = ReadProcessMemory(Hprocess, (LPCVOID)p_Address, m_code, buf.RegionSize, 0);

                        if (*m_code != 0xcd)
                        {
                                len = buf.RegionSize;
                                for (int i = 0; i < len; i++)
                                {
                                        int ret = memcmp(makecode, m_code, makecodesize);
                                        if (ret != 0)
                                        {
                                                m_code = m_code + 1;
                                        }

                                        if (ret == 0)

                                        {


                                                Address = DWORD(p_Address) + i;
                                                L = L + 1;

                                                if (L == 3)
                                                {
                                                        //By R-R,
                                                        CString str;
                                                        str.Format(_T("Address:%#x"), Address);
                                                        MessageBox(0, str, L"", 48);
                                                        BYTE Data[] = { 0xE6 };
                                                        DWORD Datasize = sizeof(Data);
                                                        WriteProcessMemory(Hprocess, (LPVOID)Address, (LPVOID)Data, Datasize, NULL);

                                                }

                                                if (i < len)
                                                {
                                                        m_code = m_code + 1;
                                                }
                                        }
                                }
                        }
                }

                if ((DWORD)p_Address > 0x01000000)
                {
                        break;
                }
                p_Address = (LPCVOID)((DWORD)p_Address + buf.RegionSize);
                DoEvents();
        }

}


int i = 0;
void MyGetSystemTime(LPSYSTEMTIME lpSystemTime)
{
        MessageBoxA(NULL, "安装HOOK成功!", "HOOK成功! ", MB_OK);//进行功能hook 
        i = i + 1;
        if (i == 2)
        {
                search();
        }

        fpMyC(lpSystemTime);

}

void MyHook(){


        if (MH_Initialize() == MB_OK)
        {
                
                MH_CreateHook(&GetSystemTime, &MyGetSystemTime, reinterpret_cast<void**>(&fpMyC));
                MH_EnableHook(&GetSystemTime);

        }

}




//在经过一系列的捣鼓,我分析出Safengine在调用获取时间GetSystemTime之前会解密出Key里的限制项,里面分别有天数,次数 到期时间以及其他到限制项,所以只需要改掉其项即可。

//下图分别是在内存里解密出的系统到期时间和到期时间 次数 等其他限制,和显示的补丁操作。
1.png
3.gif

免费评分

参与人数 12吾爱币 +19 热心值 +11 收起 理由
jiangsg + 1 + 1 谢谢@Thanks!
sam喵喵 + 1 + 1 谢谢@Thanks!
Hmily + 6 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
willgoon + 1 + 1 有成品就更好了
songbing490 + 1 + 1 出个成品 谢谢大佬 这个很实用
qws1855 + 1 + 1 谢谢@Thanks!
微笑嘻嘻 + 1 我很赞同!
光之优雅 + 1 + 1 我很赞同!
dangducluan + 1 + 1 谢谢@Thanks!
amus + 1 + 1 我很赞同!
朱朱你堕落了 + 3 + 1 小白路过!

查看全部评分

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

觉今是而昨非 发表于 2021-1-12 20:03
学到新知识了,百度了一下Safengine,原来是一个具有反调试、反附加、动态自效验等功能,同时提供了对代码的变形、乱序和虚拟化等功能的应用程序保护壳
董督秀 发表于 2021-1-12 20:28
xie83544109 发表于 2021-1-12 19:40
天空の幻像 发表于 2021-1-12 20:00
学习了,还可以这么玩
夜炙 发表于 2021-1-12 21:22
我很赞同!
dangducluan 发表于 2021-1-12 22:18
多谢楼主分享哟, 请上传测试文件 1_se.exe, winspool.drv
willgoon 发表于 2021-1-12 22:40
本帖最后由 willgoon 于 2021-1-12 22:43 编辑

楼主可否有详细的去除教程  感谢
头像被屏蔽
我去年买了各表 发表于 2021-1-13 00:47
提示: 作者被禁止或删除 内容自动屏蔽
『Lin°』 发表于 2021-1-13 00:59
楼主可否有详细的去除教程  感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-17 04:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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