capstone
143 строки · 2.6 Кб
1/**
2* @file libc.cpp
3* @author created by: Peter Hlavaty
4*/
5
6#include "libc.h"7#include <memory>8#include <Ntintsafe.h>9
10#pragma warning(push)11#pragma warning (disable : 4565)12
13#ifndef _LIBC_POOL_TAG14#define _LIBC_POOL_TAG 'colM'15#endif16
17// very nice for debug forensics!
18struct MEMBLOCK19{
20size_t size;21#pragma warning(push)22#pragma warning (disable : 4200)23__declspec(align(MEMORY_ALLOCATION_ALIGNMENT))24char data[0];25#pragma warning(pop)26};27
28EXTERN_C
29__drv_when(return!=0, __drv_allocatesMem(pBlock))30__checkReturn
31__drv_maxIRQL(DISPATCH_LEVEL)32__bcount_opt(size)33void*34__cdecl malloc(35__in size_t size
36)37{
38/* A specially crafted size value can trigger the overflow.39If the sum in a value that overflows or underflows the capacity of the type,
40the function returns nullptr. */
41size_t number_of_bytes = 0;42if (!NT_SUCCESS(RtlSizeTAdd(size, sizeof(MEMBLOCK), &number_of_bytes))){43return nullptr;44}45MEMBLOCK *pBlock = static_cast<MEMBLOCK*>(46ExAllocatePoolWithTag(47NonPagedPoolNxCacheAligned,48number_of_bytes,49_LIBC_POOL_TAG));50
51if (nullptr == pBlock)52return nullptr;53
54pBlock->size = size;55return pBlock->data;56}
57
58EXTERN_C
59__drv_when(return != 0, __drv_allocatesMem(p))60__checkReturn
61__drv_maxIRQL(DISPATCH_LEVEL)62__bcount_opt(size * n)63void*64__cdecl calloc(size_t n, size_t size)65{
66size_t total = n * size;67void *p = malloc(total);68
69if (!p) return NULL;70
71return memset(p, 0, total);72}
73
74EXTERN_C
75__drv_when(return!=0, __drv_allocatesMem(inblock))76__checkReturn
77__drv_maxIRQL(DISPATCH_LEVEL)78__bcount_opt(size)79void*80__cdecl realloc(81__in_opt void* ptr,82__in size_t size
83)84{
85if (!ptr)86return malloc(size);87
88std::unique_ptr<unsigned char> inblock = std::unique_ptr<unsigned char>(static_cast<unsigned char*>(ptr));89
90// alloc new block91void* mem = malloc(size);92if (!mem)93return nullptr;94
95// copy from old one, not overflow ..96memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data)->size, size));97return mem;98}
99
100EXTERN_C
101__drv_maxIRQL(DISPATCH_LEVEL)102void103__cdecl free(104__inout_opt __drv_freesMem(Mem) void* ptr105)106{
107if (ptr)108ExFreePoolWithTag(CONTAINING_RECORD(ptr, MEMBLOCK, data), _LIBC_POOL_TAG);109}
110
111#pragma warning(pop)112
113__drv_when(return!=0, __drv_allocatesMem(ptr))114__checkReturn
115__drv_maxIRQL(DISPATCH_LEVEL)116__bcount_opt(size)117void*118__cdecl operator new(119__in size_t size
120)121{
122return malloc(size);123}
124
125__drv_maxIRQL(DISPATCH_LEVEL)126void127__cdecl operator delete(128__inout void* ptr129)130{
131free(ptr);132}
133
134int135__cdecl vsnprintf(136char *buffer,137size_t count,138const char *format,139va_list argptr
140)
141{142return vsprintf_s(buffer, count, format, argptr);143}
144