手写内存注册机初次尝试
学了一段时间破解,经常会用到注册机生成工具,以前不知道是怎么实现的,于是学习了一下,初步了解了内存注册机的原理,动手实现了一下,希望在此和大家分享。
要破解的程序是超级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 编辑 ] 强大啊。楼主我支持你!! 强大啊。楼主我支持你!! 不错... DebugApi的简单应用 强悍,支持!! 学习楼主的方法,支持! 厉害。。希望能对付双进程 看不懂,需要学的东西太多了 确实强悍!不过由于易语言方面有大大写模块拉!
哈哈,可以很方便的写注册机。我就用易语言好了。嘿嘿。/:001 楼主我支持你!!