首页
社区
课程
招聘
[原创]内存注册机源码
发表于: 2015-5-14 21:00 6483

[原创]内存注册机源码

2015-5-14 21:00
6483
不喜勿喷,用到了写了下,分享出来。
MyGetMemoryRegCode.h
#pragma once

#include <windows.h>

#define BUFFERCOUNT 0x100                   //存储注册码的空间大小
#define REGCODEINREX (LPVOID)tagContext.Esi //出现注册码的寄存器


MyGetMemoryRegCode.cpp
#include "MyGetMemoryRegCode.h"

/************************************************************************
函数名字:TCHAR* MyGetMemoryRegCode(TCHAR *pExeName, PVOID pCmdLine, DWORD dwAddr)
功    能:获取某寄存器的内容
参  数 1:pExeName 软件文件名
参  数 2:pCmdLine 软件启动参数,没有填NULL
参  数 3:dwAddr   出现注册码的地址
返 回 值:成功返回存储注册码的指针,失败返回NULL
************************************************************************/
TCHAR* MyGetMemoryRegCode(TCHAR *pExeName, PVOID pCmdLine, DWORD dwAddr)
{
    BOOL bRet = FALSE;
    STARTUPINFO tagStartupInfoa = { 0 };
    PROCESS_INFORMATION tagProcInfo = { 0 };
    CONTEXT tagContext = { 0 };
    TCHAR *pRegCode = new TCHAR[BUFFERCOUNT];
    WORD wReadBuf = 0;
    WORD wHookByte = 0xFEEB;

    tagStartupInfoa.cb = sizeof(STARTUPINFO);
    memset(pRegCode, 0, BUFFERCOUNT);

    bRet = ::CreateProcess(pExeName, (LPWSTR)pCmdLine, NULL, NULL, FALSE,
        CREATE_SUSPENDED, NULL, NULL, &tagStartupInfoa, &tagProcInfo);
    if (bRet == FALSE)
    {
        goto EXIT_FUN;
    }

    bRet = ::ReadProcessMemory(tagProcInfo.hProcess,
        (PVOID)dwAddr, &wReadBuf, 2, NULL);
    if (bRet == FALSE)
    {
        ::OutputDebugString(TEXT("读取进程内存失败,请检查是否错误."));
        goto EXIT_FUN;
    }

    bRet = ::WriteProcessMemory(tagProcInfo.hProcess,
        (LPVOID)dwAddr, &wHookByte, 2, NULL);
    if (bRet == FALSE)
    {
        ::OutputDebugString(TEXT("写入进程内存失败,请检查是否错误."));
        goto EXIT_FUN;
    }

    ::ResumeThread(tagProcInfo.hThread);
    tagContext.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS;

    while (true)
    {
        ::GetThreadContext(tagProcInfo.hThread, &tagContext);

        if (tagContext.Eip == dwAddr)
        {
            bRet = ::ReadProcessMemory(tagProcInfo.hProcess,
                REGCODEINREX,
                pRegCode, BUFFERCOUNT, NULL);
            if (bRet == FALSE)
            {
                ::OutputDebugString(TEXT("恢复异常,请检查是否错误."));
                goto EXIT_FUN;
            }
            bRet = ::WriteProcessMemory(tagProcInfo.hProcess, (LPVOID)dwAddr,
                &wReadBuf, 2, NULL);
            if (bRet == FALSE)
            {
                goto EXIT_FUN;
            }
            else
            {
                break;
            }
        }
    }

EXIT_FUN:
    if (tagProcInfo.hThread != NULL)
    {
        ::CloseHandle(tagProcInfo.hThread);
        tagProcInfo.dwThreadId = NULL;
    }
    if (tagProcInfo.hProcess != NULL)
    {
        ::CloseHandle(tagProcInfo.hProcess);
        tagProcInfo.hProcess = NULL;
    }
    return pRegCode;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
来看咯,才做到第四课,卡住了,
2015-5-15 00:39
0
雪    币: 221
活跃值: (2256)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
例子中dwAddr 应如何填写? 比如在EXE引入的DLL中出现 注册码?
2015-5-16 20:22
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
4
我比较推荐的方法是不管exe还是dll都采用imagebase+offset的形式来填写
2015-5-17 14:47
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
0xFEEB 什么意思?
2015-5-18 17:43
0
游客
登录 | 注册 方可回帖
返回
//