内存注册机原理

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


 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值