吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11375|回复: 39
收起左侧

[原创] 利用TitanEngine简单制作补丁

  [复制链接]
A-new 发表于 2017-12-28 18:53
本帖最后由 A-new 于 2019-1-10 18:04 编辑

这个源于@mohao 的一个求助帖https://www.52pojie.cn/thread-649625-1-1.html
mohao想做一下它的内存注册机,不过网上常用的几款内存注册机工具都有局限性,不能在特定模块下断点读取注册码,也就是只能在主程序exe中读取注册码(也可能是我能力有限不会用),而帖子中提到的软件注册码出现在regcode.dll中,所以就有了此文,在此先感谢一下@Kido 牛,早些时候指导偶学会使用TitanEngine,扯多了开始正题吧
求助帖中软件获取注册码步骤仅需三步
1、主程序加了UPX,下断点到OEP
[Asm] 纯文本查看 复制代码
01BCCECC    FFD5            call    ebp
01BCCECE    58              pop     eax
01BCCECF    61              popad
01BCCED0    8D4424 80       lea     eax, dword ptr [esp-0x80]
01BCCED4    6A 00           push    0x0
01BCCED6    39C4            cmp     esp, eax
01BCCED8  ^ 75 FA           jnz     short 01BCCED4
01BCCEDA    83EC 80         sub     esp, -0x80
01BCCEDD  - E9 78B8E0FE     jmp     009D875A                         ; 跳到OEP此处下断
01BCCEE2    0000            add     byte ptr [eax], al


2、加载regcode.dll处下断点
[Asm] 纯文本查看 复制代码
010F5FA2    89A5 E4FEFFFF   mov     dword ptr [ebp-0x11C], esp
010F5FA8    68 30C75D01     push    015DC730                         ; \RegCode.dll
010F5FAD    68 A4FB7D01     push    017DFBA4
010F5FB2    51              push    ecx
010F5FB3    E8 A8D532FF     call    00423560
010F5FB8    83C4 0C         add     esp, 0xC
010F5FBB    E8 50A50C00     call    011C0510
010F5FC0    83C4 04         add     esp, 0x4
010F5FC3    84C0            test    al, al
010F5FC5    0F84 92020000   je      010F625D
010F5FCB    68 30C75D01     push    015DC730                         ; \RegCode.dll
010F5FD0    8D95 E0FEFFFF   lea     edx, dword ptr [ebp-0x120]
010F5FD6    68 A4FB7D01     push    017DFBA4
010F5FDB    52              push    edx
010F5FDC    E8 7FD532FF     call    00423560
010F5FE1    8B00            mov     eax, dword ptr [eax]
010F5FE3    83C4 0C         add     esp, 0xC
010F5FE6    50              push    eax
010F5FE7    FF15 94254A01   call    dword ptr [0x14A2594]            ; kernel32.LoadLibraryW
010F5FED    8BF0            mov     esi, eax                         ; 加载RegCode.dll完毕,此处下断点


3、RegCode.dll出现注册码的地方下断点
[Asm] 纯文本查看 复制代码
6F831281    85C9            test    ecx, ecx
6F831283    75 0A           jnz     short 6F83128F
6F831285    68 05400080     push    0x80004005
6F83128A    E8 910A0000     call    6F831D20
6F83128F    8B5D E4         mov     ebx, dword ptr [ebp-0x1C]
6F831292    50              push    eax
6F831293    53              push    ebx
6F831294    E8 885D0F00     call    6F927021
6F831299    83C4 08         add     esp, 0x8                         ; 注册码出现在ebx,此处下断点


具体如何找到此处自己慢慢找,不是本文讨论重点
关键部分
写注册机
TitanEngine的基本流程
初始化InitDebug
The InitDebug function is used to initialize the debugging process. This function is always used first and
it is creating a process which will be debugged.

然后开始调试流程DebugLoop
DebugLoop starts the debugging process. Always call this function or DebugLoopEx after initializing the
debugger with one of the initialization functions. Set at least one breakpoint before running the
debugged or the application whose process is being debugged will run. DebugLoop will not return until
the debugger is finished and the debugged application has been terminated.

初始化一般用InitDebugEx
[C] 纯文本查看 复制代码
void* __stdcall InitDebug(
char* szFileName,  //调试文件
char* szCommandLine,  //启动参数
char* szCurrentFolder,  //调试进程工作路径
LPVOID EntryCallBack //回调函数
);
Return value
If it succeeds, InitDebugEx returns a pointer to a PROCESS_INFORMATION structure, otherwise
it returns NULL.

详细的自己查阅TitanEngine的SDK,这里就不一个一个复制粘贴了
这里就不多介绍了就几行代码注释也算比较详细了
[C] 纯文本查看 复制代码
#include <Windows.h>
#include "direct.h"
#include "TitanEngine.h"
#pragma comment (lib, "TitanEngine.lib")

////////////////////////////////////////////////////////
///////////////////全局变量/////////////////////////////
char *FileName,*CmdLine,*CurrentPath,*RegCode;
PE32Struct peInfo;
LPPROCESS_INFORMATION pInfo;
DWORD Upxbrk;
DWORD LoadDllbrk;
DWORD Dllbrk;
////////////////////////////////////////////////////////
////////////////////函数定义////////////////////////////

void init();                        //初始化
void GetRegCode();
void SetupDebug();
void cbSetupDebug();        //初始化回调函数设置0x01BCCEDD处断点
void cbLoadDll();                //UPX跳转OEP处回调函数设置0x010F5FED 处加载RegCode.dll断点
void cbDllbrk();                //设置RegCode.dll 0x6F831299 处注册码出现处断点
void cbGetRegCode();        //读取注册码

int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
        GetRegCode();
        return 0;
}

void GetRegCode()
{
        init();
        SetupDebug();
}

void SetupDebug()
{
        pInfo = (LPPROCESS_INFORMATION)InitDebugEx(FileName,CmdLine,CurrentPath,cbSetupDebug);
        DebugLoop();
}

void init()
{
        FileName = (char *)malloc(MAX_PATH);
        CmdLine = (char *)malloc(MAX_PATH);
        CurrentPath = (char *)malloc(MAX_PATH);
        memset(FileName,0,MAX_PATH);
        memset(CmdLine,0,MAX_PATH);
        memset(CurrentPath,0,MAX_PATH);
        CurrentPath = _getcwd(NULL,0);
        strcpy_s(FileName,MAX_PATH,CurrentPath);
        strcat(FileName,"\\SjmsCAD.exe");
}
void cbLoadDll()
{
        LoadDllbrk = (DWORD)GetDebuggedFileBaseAddress();        //基址
        LoadDllbrk += 0x00CF5FED;
        SetBPX(LoadDllbrk,UE_BREAKPOINT_TYPE_INT3,cbDllbrk);
}
void cbDllbrk()
{
        Dllbrk = GetContextData(UE_EAX);//基址
        Dllbrk += 0x1299;
        SetBPX(Dllbrk,UE_BREAKPOINT_TYPE_INT3,cbGetRegCode);
}

void cbGetRegCode()
{
        RegCode = (char *)malloc(MAX_PATH);
        memset(RegCode,0,MAX_PATH);
        GetRemoteString(pInfo->hProcess,(LPVOID)GetContextData(UE_EBX),RegCode,256);        //读取注册码
        RemoveAllBreakPoints(UE_OPTION_REMOVEALL);        //清除所有断点
        DetachDebuggerEx(pInfo->dwProcessId);                //剥离进程
        StopDebug();                                                                //结束调试
        MessageBoxA(NULL,RegCode,"SN",MB_OK);
}

void cbSetupDebug()
{
        Upxbrk += (DWORD)GetDebuggedFileBaseAddress();        //基址
        Upxbrk += 0x017CCEDD;
        SetBPX(Upxbrk,UE_BREAKPOINT_TYPE_INT3,cbLoadDll);        //设置断点
}

代码比较挫,能用就好
TitanEngine建议用x64dbg的pluginsdk中的
TitanEngine SDK文档在原版:TitanEngine v. 2.0.3
link:https://www.reversinglabs.com/open-source/titanengine

x64dbg用的版本修正了原版的一些bug等,其实可以直接使用x64dbg里的X64dbg\pluginsdk\TitanEngine就好了
https://bitbucket.org/titanengineupdate/titanengine-update
源码打包
内存注册机.rar (26.32 KB, 下载次数: 82) TitanEngine - SDK.rar (1.95 MB, 下载次数: 135)

免费评分

参与人数 10威望 +1 吾爱币 +21 热心值 +10 收起 理由
Poner + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Eagle徐 + 1 + 1 谢谢@Thanks!
allan147 + 1 + 1 我很赞同!
2864095098 + 1 + 1 热心回复!
锋霜 + 1 + 1 已答复!
mohao + 1 + 1 热心回复!
ZMZwise + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 1 + 1 前排支持
很快再相见123 + 1 + 1 我很赞同!
610100 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

Catshark 发表于 2017-12-30 17:33
six six six

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
走_心 + 1 + 1 我很赞同!

查看全部评分

 楼主| A-new 发表于 2019-1-10 17:47

菜鸟而已,如果要对系统函数下断点,应该有两种方法
方法一:

是断在引用处比如
[Asm] 纯文本查看 复制代码
00403E50  |.  E8 AFFCFFFF   CALL    <JMP.&kernel32.LoadLibraryW>     ; \LoadLibraryW


或者
[Asm] 纯文本查看 复制代码
00403B04   $- FF25 74714000 JMP     NEAR DWORD PTR DS:[<&kernel32.Lo>;  kernel32.LoadLibraryW


00407174 >754E481B  kernel32.LoadLibraryW

这种的话你可以先获取LoadLibraryW的函数地址(754E481B)然后搜索这个地址找到(00407174 )再根据(00407174 )找到call或者jmp引用的地址下断,这种的话需要输入表中有这个函数才有用。
方法二:

直接获取LoadLibraryW的函数地址(754E481B),然后直接对这个地址下断点。这种方法未测试过。

方法一,根据之前的代码,方法一麻烦点,如果他是导入函数,应该是可用的,你可以测试反馈一下,偶很少写代码,只做原理性研究
yuanmengxiaozi 发表于 2017-12-28 19:26
pxhb 发表于 2017-12-28 19:41
感谢分享
xlxxb 发表于 2017-12-28 19:48
谢谢分享
苏紫方璇 发表于 2017-12-28 20:36
支持下A牛大神,以前我用过这种方法
zchpojie 发表于 2017-12-28 20:37
看不懂,但是支持
DCO 发表于 2017-12-28 23:09
前排膜拜A牛
mohao 发表于 2017-12-29 00:02
谢谢版主,但那个内存补丁怎么用的啊?

点评

给的是源码自己编译一下,拉上TitanEngine.dll放入程序目录运行补丁就好了  详情 回复 发表于 2017-12-31 11:40
mygod123 发表于 2017-12-29 08:29
感谢分享
xiangniao10 发表于 2017-12-29 08:46
论坛里的大神真多,学习中
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 16:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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