欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][原创]调戏:纯应用层的Anti本地调试器(2)

[原创][原创]调戏:纯应用层的Anti本地调试器(2)

本文是一个开胃用的(最近论坛不少抛砖的,就是玉石不出啊)。核心内容是怎么搞死SOD的Anti Anti Attach功能。
上一篇Anti中调戏了OD的附加和硬件断点,但是对于SOD而言,反附加还是太苍白,于是突然想起多年前,曾经被大神们使用的一个技巧,于是特来调戏一番SOD。当SOD中开启神秘功能 Anti Anti Attach时,OD附加后暂停的EIP代码中,如果用OD单步 F7会看到如下的一段代码:

这里不难看到一个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);

}


编译运行,用OD(SOD全开模式!)附加后,正常,按F9直接退出。显示如图:

开胃菜到这里结束了。
主菜请等下一篇。
PS:
IGS游戏安全技术培训
QQ群:48715131
欢迎有兴趣研究各类游戏安全相关技术的人员加入。

上传的附件 图片1.png
图片2.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功