-
-
[shellcode框架(6)] 多文件shellcode框架 兼容x64
-
发表于:
2018-3-9 17:56
4786
-
[shellcode框架(6)] 多文件shellcode框架 兼容x64
经过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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)