内存注册机原理

来源:互联网 发布:mac office2011卸载 编辑:程序博客网 时间:2024/04/29 22:55

【文章标题】: 内存注册机原理
【文章作者】: 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; }


 

0 0