首页
社区
课程
招聘
[shellcode框架(6)] 多文件shellcode框架 兼容x64
发表于: 2018-3-9 17:56 4591

[shellcode框架(6)] 多文件shellcode框架 兼容x64

2018-3-9 17:56
4591
   经过2年的业余研究,shellcode框架已经初步完成了(还会有改动),目前x86和x64可以快速编译和切换。期间也积累不少经验,欢迎各位回帖交流。
    说到兼容x64这里要感谢微软visual studio 15 开发工具的支持,但是尴尬的是vs不支持x64汇编的内联,不过微软还是良心厂商,还是给我们提供了一些便利的函数的。
    所以为了支持x86和x64,我把所有的代码都用c语言实现。
获取PEB、TEB
sGetPEB()
{
	PPEB PebAddress;
#ifdef _WIN64
	PebAddress = (PPEB)__readgsqword(0x60);
#else 
	PebAddress = (PPEB)__readfsdword(0x30);
#endif
	return PebAddress;
}

GetTEB()
{
	return NtCurrentTeb();
}
这里是重定位
#pragma intrinsic( _ReturnAddress )

EXPORTAPI __declspec(noinline) ULONG_PTR caller(VOID) { return (ULONG_PTR)_ReturnAddress(); }
//////////////////////////////////////////////////////////////////////////

EXPORTAPI ULONG_PTR GetEIPPtr()
{
	ULONG_PTR rax;
	rax = caller();
	rax -= 9;
	return rax;
}

对了还要记得一些兼容x64的数据要使用 ULONG_PTR ,在x86下相当于DWORD x64下是ULONGLONG 。

偶有不得已的地方还是使用了汇编。。

如 64位数据除和取余,不过使用#ifdef 和_WIN64定义,优雅的解决了问题
#ifdef _WIN64
EXPORTAPI void UllDivDowrd(ULONGLONG* ullVal, DWORD dwDiv)
{
	ULONGLONG val = *ullVal / dwDiv;
	*ullVal = val;
	return val;
}
#else 
EXPORTAPI __declspec(naked) void UllDivDowrd(ULONGLONG* ullVal, DWORD ullDiv)
{
	_asm {
		push        ebx
		push        esi
		mov			esi, dword ptr[esp + 0ch]    // temp*
		mov         ecx, dword ptr[esp + 10h]  // div 
		mov         eax, dword ptr[esi + 4h] // hi dword 
		xor edx, edx
		div         ecx
		mov         ebx, eax
		mov         eax, dword ptr[esi] // lo dword
		div         ecx
		mov			dword ptr[esi ],eax
		mov         dword ptr[esi + 4h],ebx
		pop         esi
		pop         ebx
		ret         

	}
}
#endif
#ifdef _WIN64
EXPORTAPI __inline ULONG_PTR UllRemDword(ULONGLONG ullVal, DWORD dwDiv)
{
	return ullVal % dwDiv;
}
#else
EXPORTAPI __declspec(naked)  ULONG_PTR UllRemDword(ULONGLONG ullVal, DWORD dwDiv)
{
	__asm
	{
		push        ebx
		mov         ecx, dword ptr[esp + 10h]
		mov         eax, dword ptr[esp + 0Ch]
		xor edx, edx
		div  ecx       
		mov         eax, dword ptr[esp + 8]
		div         ecx
		mov         eax, edx
		pop         ebx
		ret         
	}
}
#endif





[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2347
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习一波~精巧的shellcode还是有点意思的~
2018-3-9 20:22
0
雪    币: 2899
活跃值: (438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习一波~
2018-3-10 16:23
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
学习一波
2018-3-12 06:05
0
游客
登录 | 注册 方可回帖
返回
//