:D:VMP加壳解码后还会对代码段来一次内存校检,此时While判断解码的方式就不是这么绝对的了。
:3:当然shadow dll 的话就over了,不过还是贴上来吧.. 老师们勿喷。可能还有一些壳对API头几个字节有检测
在主线程内,也可以用此方法来制作内存注册机....
:3:当然shadow dll 的话就over了,不过还是贴上来吧.. 老师们勿喷。可能还有一些壳对API头几个字节有检测
在主线程内,也可以用此方法来制作内存注册机....
代码:
//以挂起的方式启动进程
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&pi,0,sizeof(pi));
memset(&si,0,sizeof(si));
BOOL lRet= CreateProcess("test.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
if (lRet==FALSE)
{
MessageBoxA(0,"Not Find File!",0,0);
return;
}
BYTE command[]={0xEB,0xFE};//2个字节让代码一直jmp当前地址
HMODULE hModule=GetModuleHandle("user32.dll");
FARPROC lApi=GetProcAddress(hModule,"CreateWindowExA");//以CreateWindowExA为例
WriteProcessMemory(pi.hProcess,(LPVOID)lApi,&command,2,NULL);//向API写入EBFE
ResumeThread(pi.hThread);//恢复线程
BYTE OldApi[2]={0x8B,0xFF};
CONTEXT context;
context.ContextFlags=CONTEXT_FULL;
while(1)//等待到达CreateWindowExA
{
GetThreadContext(pi.hThread,&context);
if (context.Eip==(UINT)lApi)
{
SuspendThread(pi.hThread);//当到达API时,挂起进程
break;
}
}
//此处进行Patch
WriteProcessMemory(hProcess,(LPVOID)lApi,&OldApi,1,NULL);//恢复原指令
ResumeThread(pi.hThread);