R-R, 发表于 2021-1-12 19:20

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

本帖最后由 R-R, 于 2021-1-12 19:37 编辑

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


#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 =
      {
                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;
                        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里的限制项,里面分别有天数,次数 到期时间以及其他到限制项,所以只需要改掉其项即可。

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

觉今是而昨非 发表于 2021-1-12 20:03

学到新知识了,百度了一下Safengine,原来是一个具有反调试、反附加、动态自效验等功能,同时提供了对代码的变形、乱序和虚拟化等功能的应用程序保护壳

董督秀 发表于 2021-1-12 20:28

直接keygen也可以吧。

xie83544109 发表于 2021-1-12 19:40

{:1_927:}
学习了,多谢楼主分享哟

天空の幻像 发表于 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

楼主可否有详细的去除教程感谢
页: [1] 2 3
查看完整版本: [原创]Safengine 2.4.0 系统到期时间去除,告别改系统时间删注册表。