mysoftlove 发表于 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;
    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 == 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 编辑 ]

bobo712 发表于 2009-5-23 12:25:39

强大啊。楼主我支持你!!

influx 发表于 2009-5-23 23:23:13

强大啊。楼主我支持你!!

Luckly 发表于 2009-5-24 00:25:58

不错... DebugApi的简单应用

tianxj 发表于 2009-5-24 08:08:01

强悍,支持!!

my1229 发表于 2009-5-24 12:26:33

学习楼主的方法,支持!

rxzcums 发表于 2009-5-24 14:12:19

厉害。。希望能对付双进程

sey 发表于 2009-5-30 00:28:18

看不懂,需要学的东西太多了

wuhanqi 发表于 2009-6-2 00:20:59

确实强悍!不过由于易语言方面有大大写模块拉!
哈哈,可以很方便的写注册机。我就用易语言好了。嘿嘿。/:001

剑哥 发表于 2009-6-5 13:18:38

楼主我支持你!!
页: [1] 2 3 4 5
查看完整版本: 手写内存注册机初次尝试