天天看点

内存注册机原理

【文章标题】: 内存注册机原理

【文章作者】: 125096

【软件名称】: Memory.exe

【加壳方式】: 无

【编写语言】: vs2008

【使用工具】: vs2008,OllyDbg

【操作平台】: 盗版WIN7操作系统

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

---------------------------------------------------------------------------------------------------------------------------------------------------------

【详细过程】

  由于工作需要,需要实现这个功能,读取A进程执行到00401000地址后取eax的值

   群里和好友上问了许多人,这个貌似类似内存注册机的东西可以实现,以前也是一直有用过,但是不知道是咋实现的。反正就是找到地址,比如00401000,然后是寄存器eax或者ebx之类的,点击注册按钮,注册码就会自动出现。看起来很神奇的样子。

  在网上找到一个内存注册机的软件,刚好里面有带例子,ollydbg反汇编了下,是asm编写的。看起来就方便多了。基本都是调用api的无编译器产生的垃圾信息。基本实现原理是这样的过程QQ群:193541151

  1.暂停状态创建A进程

  2.读取A进程00401000的2个字节,修改为0xFEEB,也就是jmp到自身地址

  3.激活进程执行状态

  4.获取A进程的执行状态

  5.如果A进程执行到00401000处,就读取eax的值,然后还原修改的地方。使A进程能正常执行

  下面是vs2008下编译通过的代码

#include <windows.h>
 
#include <tchar.h>
 

TCHAR strname[]=TEXT("a123.exe");  //程序名称
 
DWORD address=0x4113fd;            //读取地址
 
WORD  ebfe=0xFEEB;                 //程序暂停在此
 

int main (void)
 
{
 
//创建进程
 
STARTUPINFOA psiStartInfo={0};     //STARTUPINFOW  //UNICODE
 
PROCESS_INFORMATION pProcInfo={0};
 
CreateProcess(strname,NULL,NULL,NULL,NULL,CREATE_SUSPENDED,NULL,NULL,&psiStartInfo,&pProcInfo);
 

//进程创建成功
 
if (pProcInfo.hProcess)
 
{
 
        TCHAR strbuff[32]={0};LPDWORD lpNumberOfBytesRead=NULL;WORD source=0;
 
        //读取地址下的值保存
 
        if (!ReadProcessMemory(pProcInfo.hProcess,(LPVOID)address,&source,sizeof(source),lpNumberOfBytesRead))return false;
 
        //写入字节EBFE
 
        if (WriteProcessMemory(pProcInfo.hProcess,(LPVOID)address,&ebfe,2,NULL))
 
        {
 
                //激活线程
 
           ResumeThread(pProcInfo.hThread);
 
           CONTEXT context={0};
 
           context.ContextFlags=CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS;
 
           while (true)
 
           {
 
                   //获取进程执行状态
 
                   GetThreadContext(pProcInfo.hThread,&context);
 
                   if (context.Eip==address)
 
                   {
 
                           //读内存
 
                           if (ReadProcessMemory(pProcInfo.hProcess,(LPVOID)context.Eax,strbuff,sizeof(strbuff),lpNumberOfBytesRead))
 
                           {
 
                                   MessageBox(NULL,strbuff,NULL,MB_OK);
 
                                   WriteProcessMemory(pProcInfo.hProcess,(LPVOID)address,&source,2,NULL);//还原A进程代码
 
                           }
 
                   }
 
           } 
        }
 
}
 
return 0;
 
}
           

继续阅读