- UID
- 60657
注册时间2009-4-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
学了一段时间破解,经常会用到注册机生成工具,以前不知道是怎么实现的,于是学习了一下,
初步了解了内存注册机的原理,动手实现了一下,希望在此和大家分享。
要破解的程序是超级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 编辑 ] |
评分
-
查看全部评分
|