Gå til innhold

Bruk av Rtl-funksjoner i eget program.


Anbefalte innlegg

Ey, jeg har rota litt rundt i ollydebugger nå ei stund og funnet ut av at operators som henter inn minne som for eks. allocate / Alloc / AllocateHeap / malloc / new osv. alle stammer fra LocalAlloc.

Neste steg er å bruke funksjonene fra LocalAlloc direkte fra ntdll.dll.

RtlAllocateHeap er vell det egentlig jeg er ute etter om jeg kan bruke direkte fra mitt program eller om jeg blir nødt til å skrive en driver for å bruke denne funksjonen.

 

Hvorfor jeg gjør dette? Jeg prøvde / prøver å finne ut hvordan windows behandler minne og skrive en wrapper / class for dette. Eventuelt en ny version av hele funksjonen LocalAlloc med mine egne spesifiseringer :p

Lenke til kommentar
Videoannonse
Annonse
Hva lurer du egentlig på?

 

Av en eller annen grunn så fikk jeg ikke til å loade Rtl funksjonene som brukes i LocalAlloc direkte via ntdll.dll.

Veit koden stemmer (tro meg, har testa utallige ganger og har aldri før hatt problemer med classen min til å loade funksjoner via andre dll filer) har gått igjennom alt flere ganger. Noen som har opplevd lignende?

Lenke til kommentar
Dokumentasjonen hevder at funksjonen LocalAlloc ligger i kernel32.dll.

Hvis du bare skal bruke LocalAlloc, så kan du jo bare legge til kernel32.lib og legge til

extern void* __stdcall LocalAlloc(unsigned int flags, size_t size);

 

Nei, skal ikke bare bruke LocalAlloc. Classen min skal ha full kontroll over minne behandling i windows. Jeg skal kunne se hvilken funksjon feilen oppstår i og dermed ha en mulighet for å fixe det og:P

Lenke til kommentar

Tenkte heller ikke 100 % rett der.

du har rett, kernel32.dll.

Men fortsatt ikke nådd målet.

NtHeapAlloc / RtlHeapAlloc osv. må også addes. (btw. RtlHeapAlloc som jeg egentlig sliter med. Var bare så fette full da jeg skrev dette at jeg må å rota litt)

 

Hvor feiler loadingen og har du noen feilkoder?

 

Får ingen feilkoder i det hele tatt. Men klarer ikke å calle funksjonen.

Lenke til kommentar
  • 1 måned senere...

Var ikke sikker på om jeg skjønte problemstillingen din. Du får ikke brukt RtlCreateHap/RtlAllocateHeap osv.?

 

Jeg lagde en liten kodesnutt for å vise hvordan man kan bruke de funksjonene. Jeg lagde noen prototyper for funksjonene og så importerte jeg ntdll og hentet ut adressene med GetProcAddress().

 

(Slang med en del structer som den ville ha siden jeg ikke har riktige headere på denne maskinen)

 

edit:

Etter å ha lest over innleggene dine en gang til virker det som du enten ikke har klart å kalle på funksjonene korrekt eller at du har feil i klassen din som henter ut adressene.

 

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

typedef LONG NTSTATUS;

typedef struct _RTL_HEAP_DEFINITION {
 ULONG				   Length;
 ULONG				   Unknown1;
 ULONG				   Unknown2;
 ULONG				   Unknown3;
 ULONG				   Unknown4;
 ULONG				   Unknown5;
 ULONG				   Unknown6;
 ULONG				   Unknown7;
 ULONG				   Unknown8;
 ULONG				   Unknown9;
 ULONG				   Unknown10;
 ULONG				   Unknown11;
 ULONG				   Unknown12;
} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;

typedef NTSTATUS (NTAPI *PRTL_HEAP_COMMIT_ROUTINE)(
IN PVOID Base,
IN OUT PVOID *CommitAddress,
IN OUT PSIZE_T CommitSize
);

typedef struct _RTL_HEAP_PARAMETERS {
ULONG Length;
SIZE_T SegmentReserve;
SIZE_T SegmentCommit;
SIZE_T DeCommitFreeBlockThreshold;
SIZE_T DeCommitTotalFreeThreshold;
SIZE_T MaximumAllocationSize;
SIZE_T VirtualMemoryThreshold;
SIZE_T InitialCommit;
SIZE_T InitialReserve;
PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
SIZE_T Reserved[ 2 ];
} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;

typedef PVOID (WINAPI *PRtlCreateHeap)( 
IN ULONG  Flags,
IN PVOID  HeapBase  OPTIONAL,
IN SIZE_T  ReserveSize  OPTIONAL,
IN SIZE_T  CommitSize  OPTIONAL,
IN PVOID  Lock  OPTIONAL,
IN PRTL_HEAP_PARAMETERS  Parameters  OPTIONAL
); 

typedef PVOID (WINAPI *PRtlAllocateHeap)( 
IN PVOID  HeapHandle,
IN ULONG  Flags,
IN SIZE_T  Size
);

typedef PVOID (WINAPI *PRtlDestroyHeap)( 
IN PVOID  HeapHandle
);

typedef BOOLEAN (WINAPI *PRtlFreeHeap)( 
IN PVOID  HeapHandle,
IN ULONG  Flags,
IN PVOID  HeapBase
);

typedef VOID (WINAPI*PRtlZeroMemory)(
IN VOID UNALIGNED  *Destination,
IN SIZE_T  Length
);

PRtlCreateHeap RtlCreateHeap;
PRtlAllocateHeap RtlAllocateHeap;
PRtlDestroyHeap RtlDestroyHeap;
PRtlFreeHeap RtlFreeHeap;
PRtlZeroMemory RtlZeroMemory;

int main(void)
{
HANDLE Heap;
RTL_HEAP_PARAMETERS heapParams;
/* Skal lage en liten "Hello World!" i denne pekeren. */
char *string;

HMODULE ntModule = LoadLibrary("ntdll.dll");

RtlCreateHeap = (PRtlCreateHeap) GetProcAddress(ntModule, "RtlCreateHeap");
RtlAllocateHeap = (PRtlAllocateHeap) GetProcAddress(ntModule, "RtlAllocateHeap");
RtlDestroyHeap = (PRtlDestroyHeap) GetProcAddress(ntModule, "RtlDestroyHeap");
RtlFreeHeap = (PRtlFreeHeap) GetProcAddress(ntModule, "RtlFreeHeap");
RtlZeroMemory = (PRtlZeroMemory) GetProcAddress(ntModule, "RtlZeroMemory");

if ( (!RtlCreateHeap) || (!RtlAllocateHeap) || (!RtlDestroyHeap) || (!RtlFreeHeap) || (!RtlZeroMemory) )
	return -1;


RtlZeroMemory(&heapParams, sizeof(heapParams));	
heapParams.Length = sizeof(RTL_HEAP_DEFINITION);	

Heap = RtlCreateHeap( 2, 0, 0x200, 0x100, 0, &heapParams );
if (!Heap)
	return -1;

string = RtlAllocateHeap(Heap, 0, 0xD); /* 12 bytes for Hello World! og en for \ 0 */
if (!string)
	return -1;

strncpy(string, "Hello World!", 12);
string[12] = 0x00; /* Fikk ikke \ 0 i posten her */

MessageBox(NULL, string, "Test", MB_OK);

/* Frigjør blokken vi har allokert */
RtlFreeHeap(Heap, 0, string);
/* Nå ødelegger vi Heapen. */
RtlDestroyHeap(Heap);

return 0;
}

Endret av Entropy
Lenke til kommentar
Dokumentasjonen hevder at funksjonen LocalAlloc ligger i kernel32.dll.

Hvis du bare skal bruke LocalAlloc, så kan du jo bare legge til kernel32.lib og legge til

extern void* __stdcall LocalAlloc(unsigned int flags, size_t size);

 

Nei, skal ikke bare bruke LocalAlloc. Classen min skal ha full kontroll over minne behandling i windows. Jeg skal kunne se hvilken funksjon feilen oppstår i og dermed ha en mulighet for å fixe det og:P

Nøyaktig hva er det du vil ha kontroll over som du ikke har kontroll over i dag? Og hvilken feil er det du snakker om?

Lenke til kommentar
  • 4 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...