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