飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 18473|回复: 40

[原创] 手写内存注册机初次尝试

  [复制链接]

该用户从未签到

发表于 2009-5-23 12:22:40 | 显示全部楼层 |阅读模式
学了一段时间破解,经常会用到注册机生成工具,以前不知道是怎么实现的,于是学习了一下,
初步了解了内存注册机的原理,动手实现了一下,希望在此和大家分享。

要破解的程序是超级RM转换大师 V1.20,破文地址在这里
https://www.chinapyg.com/viewthread.php?tid=46587&extra=page%3D1
由于我实现的比较简单,没有界面,只用了一个MessageBox来显示注册码,
所以代码也比较少,在此全部贴出来
#include <windows.h>
void main()
{
    PROCESS_INFORMATION pi;
STARTUPINFO si;
DEBUG_EVENT devent;
    CONTEXT Regs;
    Regs.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL;
   
    ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
    LPVOID breakAddr = (LPVOID)0x004BDB38;  //这是断点地址,就是用工具生成注册机时要填的那个地址
    BYTE firstByte = 0x58;      //同样是生成注册机时要填的那个第一字节
    BYTE bp = 0xCC;
    DWORD real;
    BYTE buf[64];
    int nCount = 0;
    DWORD way;
    //用调试方式创建需要破解的程序进程
    if(CreateProcess("RMConver.exe", NULL, NULL, NULL, FALSE,
        DEBUG_ONLY_THIS_PROCESS | DEBUG_PROCESS, NULL, NULL, &si, &pi))
    {
        //调试循环体
        while(TRUE)
        {
            //等待调试事件
            if(WaitForDebugEvent(&devent, INFINITE))
            {
                way = DBG_EXCEPTION_NOT_HANDLED;
                switch(devent.dwDebugEventCode)
                {
                case EXIT_PROCESS_DEBUG_EVENT:  //进程退出事件
                    //return;
                    break;
                case EXCEPTION_DEBUG_EVENT:     //异常事件
                    {
                        if(devent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
                        {
                            nCount++;
                            //创建进程后会产生第一次异常中断,此时可以设置断点
                            if(nCount == 1)
                            {
                                //读取第一个字节进行效验
                                ReadProcessMemory(pi.hProcess, breakAddr, buf, 1, &real);
                                if(buf[0] == firstByte)               
                                {
                                    //设置断点
                                    DWORD oldProtect;
                                    VirtualProtectEx(pi.hProcess, breakAddr, 1, PAGE_READWRITE, &oldProtect);
                                    WriteProcessMemory(pi.hProcess, breakAddr, &bp, 1, &real);
                                    VirtualProtectEx(pi.hProcess, breakAddr, 1, oldProtect, NULL);
                                }
                                way = DBG_CONTINUE;
                            }
                            //如果是在断点处暂停,就可以读取内存中的注册码
                            else if(devent.u.Exception.ExceptionRecord.ExceptionAddress == breakAddr)
                            {
                                GetThreadContext(pi.hThread, &Regs);
                                ReadProcessMemory(pi.hProcess, (char *)Regs.Edx, buf, 64, &real);  //读取注册码
                                MessageBox(NULL, (char *)buf, "注册码", 0);
                                //去除断点
                                DWORD oldProtect;
                                VirtualProtectEx(pi.hProcess, breakAddr, 1, PAGE_READWRITE, &oldProtect);
                                WriteProcessMemory(pi.hProcess, breakAddr, &firstByte, 1, NULL);
                                VirtualProtectEx(pi.hProcess, breakAddr, 1, oldProtect, NULL);
                                //回到断点处继续执行
                                Regs.Eip = (DWORD)breakAddr;
                                SetThreadContext(pi.hThread, &Regs);
                                way = DBG_CONTINUE;
                            }
                        }
                        break;
                    }
                }
                ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, way);
            }
        }
    }
    else
        MessageBox(NULL, "请将该程序和要破解程序放在同一目录下", NULL, 0);
}
内存注册机是一个Loader程序,放在要破解程序的同一目录下即可

[ 本帖最后由 mysoftlove 于 2009-5-23 12:25 编辑 ]

RMLoader.rar

10 KB, 下载次数: 75, 下载积分: 飘云币 -2 枚

源代码

评分

参与人数 1威望 +80 飘云币 +400 收起 理由
tianxj + 80 + 400 感谢您发布的原创作品!

查看全部评分

PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-23 12:25:39 | 显示全部楼层
强大啊。楼主我支持你!!
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-23 23:23:13 | 显示全部楼层
强大啊。楼主我支持你!!
PYG19周年生日快乐!

该用户从未签到

发表于 2009-5-24 00:25:58 | 显示全部楼层
不错... DebugApi的简单应用
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-5-16 14:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-5-24 08:08:01 | 显示全部楼层
    强悍,支持!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 11:19
  • 签到天数: 1660 天

    [LV.Master]伴坛终老

    发表于 2009-5-24 12:26:33 | 显示全部楼层
    学习楼主的方法,支持!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-24 14:12:19 | 显示全部楼层
    厉害。。希望能对付双进程
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-30 00:28:18 | 显示全部楼层
    看不懂,需要学的东西太多了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-6-2 00:20:59 | 显示全部楼层
    确实强悍!不过由于易语言方面有大大写模块拉!
    哈哈,可以很方便的写注册机。我就用易语言好了。嘿嘿。/:001
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-2-19 17:19
  • 签到天数: 52 天

    [LV.5]常住居民I

    发表于 2009-6-5 13:18:38 | 显示全部楼层
    楼主我支持你!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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