首先声明咱不玩DOTA类游戏的说 (咱是前/伪wow饭/wow剧情饭 总觉得这类游戏有点那啥?非引起战争...dota饭别打我 掩面逃.....)
唔 这个就是看了前几天的那个帖子后想到的 本来想用来试试某游戏 结果好像是自己不给力(貌似有调用/堆栈检测 重载后进程直接奔溃......)所以就发上来啦
感谢lidagogo大指出的一个疏忽造成的错误的说......
顺带求各位大大怎么学习逆向的说 单条x86汇编指令都看的懂 它们加一起咱就不认识它们了 在没有符号文件的情况下看OD/WINDBG就是两眼一抹黑....就算有符号文件也能看API的调用什么的....函数内部各种瞎 求教各位大牛逆向应该看那些书 怎么入门才行的说
顺带想到个ring3下hook GetThreadContext的想法 : 吧ZwGetContextThread mov eax,0x87 (服务号)改成jmp 在自己的函数里吧pContext->flag和 除了CONTEXT_DEBUG_REG位为0其他位为1的数 做 位与 操作 然后给eax赋值服务号 跳回 mov ebx,kifastsystemcall(是ebx么?忘了.......) 的地方
BOOL SetProtect()
{
//char s[1024] = {0};
ULONG i = 0;
NTSTATUS status;
PSYSTEM_PROCESSES pSysProcess;
PSYSTEM_THREADS pSysThread;
DWORD retlen,truelen;
PVOID buf,pbuf;
ThreadInfo hThread[1024] = {0};
BOOL Ret,IsBreak;
DWORD MayId = GetCurrentThreadId();
DWORD old;
NtResumeThread MyResThread = (NtResumeThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtResumeThread");
NtSuspendThread MySusThread = (NtSuspendThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtSuspendThread");
MyGetContext = (NtGetContextThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtGetContextThread");
MySetContext = (NtSetContextThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtSetContextThread");
NTQUERYSYSTEMINFORMATION NtQSIM = (NTQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"ZwQuerySystemInformation");
if(MyResThread == NULL || MySusThread == NULL || MyGetContext == NULL || MySetContext == NULL || NtQSIM == NULL)
return FALSE;
status = NtQSIM(SystemProcessInformation,NULL,0,&retlen);
pbuf = VirtualAlloc(NULL,retlen,MEM_COMMIT,PAGE_READWRITE);
if(pbuf == NULL)
return FALSE;
truelen = retlen;
status= NtQSIM(SystemProcessInformation,pbuf,truelen,&retlen);
buf=pbuf;
IsBreak = FALSE;
do
{
pSysProcess=(PSYSTEM_PROCESSES)buf;
if(pSysProcess->ProcessId == GetCurrentProcessId())
{
pSysThread=pSysProcess->Threads;
for ( i=0;i<pSysProcess->ThreadCount;i++)
{
if((DWORD)pSysThread->ClientID.UniqueThread != MayId)
{
hThread[i].ThreadStarAddr = (DWORD)pSysThread->StartAddress;
hThread[i].hThread = OpenThread(THREAD_ALL_ACCESS,FALSE,(DWORD)pSysThread->ClientID.UniqueThread);
MySusThread(hThread[i].hThread,NULL);
}
pSysThread++;
}
IsBreak = TRUE;
}
if (pSysProcess->NextEntryDelta==0 || IsBreak)
{
break;
}
buf = (PVOID)((DWORD)buf + pSysProcess->NextEntryDelta);
} while (1);
VirtualFree(pbuf,truelen,NULL);
if(CopyModule())
{
HookKiDispatch();
VirtualProtect((PVOID)ModuleBase,ModuleSize-1,PAGE_READWRITE,&old); //如果是PAGE_NOACCESS的话 读这段内存不也会触发异常?CRC怎么办?
//SetMemProtect(); //有些模块没有text节区?
for(ULONG j=0;j<=i;j++)
{
CONTEXT ct;
ct.ContextFlags = CONTEXT_ALL;
NTSTATUS status = MyGetContext(hThread[j].hThread,&ct);
if(NT_SUCCESS(status))
{
if(ct.Eip >= ModuleBase && ct.Eip <= ModuleBase+ModuleSize)
{
ct.Eip = ct.Eip + JmpOffset;
status = MySetContext(hThread[j].hThread,&ct);
}
}
}
ZeroMemory(NewModuleBase,1024); //防MZ暴力搜索←_←
RtlCopyMemory(NewModuleBase,"NewTraget",sizeof("NewTraget")); //给自己留个记号←_←
//OutputDebugStringA("内存拷贝和保护设置成功!");
Ret = TRUE;
}
else
{
Ret = FALSE;
}
for(ULONG j=0;j <= i;j++)
{
MyResThread(hThread[j].hThread,NULL);
CloseHandle(hThread[j].hThread);
}
return Ret;
}
ps:代码各种抄 请各位大牛不要建议的说 代码也写的比较乱........
ps2:代码中删掉了一些私货 不过应该不影响主要功能......
ps3:吐槽下VS2010娘生成的代码好大......只能丢度娘网盘共享了
ps4:静态链接的MFC DLL生成的文件比易语言的还大.....下次谁说易语言生成的文件大可以拿这个打脸了23333
ps5:最后抱怨下该死的扫yellow打x 良心大大的的大数字网盘不能分享了....
http://pan.baidu.com/s/1ntJmDpZ 下载地址.....
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)