本文是一个开胃用的(最近论坛不少抛砖的,就是玉石不出啊)。核心内容是怎么搞死SOD的Anti Anti Attach功能。
上一篇Anti中调戏了OD的附加和硬件断点,但是对于SOD而言,反附加还是太苍白,于是突然想起多年前,曾经被大神们使用的一个技巧,于是特来调戏一番SOD。当SOD中开启神秘功能 Anti Anti Attach时,OD附加后暂停的EIP代码中,如果用OD单步 F7会看到如下的一段代码:
附件 84634
这里不难看到一个native级的api,作为一个常年混迹于黑暗世界的调戏师立刻就心生歹意。
如果在这Native API上做个文章,比如取出其返回地址进行一番计较,会不会十分精彩呢。
编译运行,用OD(SOD全开模式!)附加后,正常,按F9直接退出。显示如图:
附件 84635
开胃菜到这里结束了。
主菜请等下一篇。
PS:
IGS游戏安全技术培训
QQ群:48715131
欢迎有兴趣研究各类游戏安全相关技术的人员加入。
上一篇Anti中调戏了OD的附加和硬件断点,但是对于SOD而言,反附加还是太苍白,于是突然想起多年前,曾经被大神们使用的一个技巧,于是特来调戏一番SOD。当SOD中开启神秘功能 Anti Anti Attach时,OD附加后暂停的EIP代码中,如果用OD单步 F7会看到如下的一段代码:
附件 84634
这里不难看到一个native级的api,作为一个常年混迹于黑暗世界的调戏师立刻就心生歹意。
如果在这Native API上做个文章,比如取出其返回地址进行一番计较,会不会十分精彩呢。
代码:
#include "stdafx.h"
#include <winternl.h>
#include "inlinehook.h"
DWORD GetModuleImageSize(PVOID lphModule);
typedef void (__stdcall *_RtlExitUserThread)(NTSTATUS ExitStatus);
_RtlExitUserThread OldRtlExitUserThread = NULL;
DWORD ntdllBase = 0;
DWORD ntdllSize = 0;
void __stdcall OnRtlExitUserThread(NTSTATUS ExitStatus)
{
void* __ebp = &__ebp + 2;
DWORD Eip = *(DWORD *)((DWORD)__ebp+4);
if (Eip>ntdllBase&&Eip<ntdllBase+ntdllSize)
{
OldRtlExitUserThread(ExitStatus);
}
else
{
TerminateProcess(GetCurrentProcess(),0);
}
return ;
}
DWORD WINAPI AAAAThread(LPVOID lparam)
{
BYTE g_backcode[10]={0};
ntdllBase = (DWORD)GetModuleHandle(TEXT("ntdll.dll"));
ntdllSize = GetModuleImageSize((PVOID)ntdllBase);
PVOID pfnRtlExitUserThread = (PVOID)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"RtlExitUserThread");
InlineHook((void *)pfnRtlExitUserThread,(void *)OnRtlExitUserThread,(void **)&OldRtlExitUserThread);
RtlCopyMemory((void *)g_backcode,pfnRtlExitUserThread,10);
while(1)
{
if (memcmp(pfnRtlExitUserThread,g_backcode,10)!=0)
{
TerminateProcess(GetCurrentProcess(),0);
}
//!!
Sleep(5000);
}
return 0;
}
void InitAAAA()
{
::CreateThread(NULL,0,AAAAThread,NULL,0,NULL);
}
附件 84635
开胃菜到这里结束了。
主菜请等下一篇。
PS:
IGS游戏安全技术培训
QQ群:48715131
欢迎有兴趣研究各类游戏安全相关技术的人员加入。