亚历山大 Skrevet 2. desember 2009 Del Skrevet 2. desember 2009 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 Lenke til kommentar
GeirGrusom Skrevet 2. desember 2009 Del Skrevet 2. desember 2009 Hva lurer du egentlig på? Lenke til kommentar
亚历山大 Skrevet 2. desember 2009 Forfatter Del Skrevet 2. desember 2009 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
Giddion Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 (endret) Hvor feiler loadingen og har du noen feilkoder? Endret 3. desember 2009 av Giddion Lenke til kommentar
GeirGrusom Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 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); Lenke til kommentar
亚历山大 Skrevet 3. desember 2009 Forfatter Del Skrevet 3. desember 2009 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
亚历山大 Skrevet 5. desember 2009 Forfatter Del Skrevet 5. desember 2009 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
Entropy Skrevet 10. januar 2010 Del Skrevet 10. januar 2010 (endret) 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 10. januar 2010 av Entropy Lenke til kommentar
Dead_Rabbit Skrevet 10. januar 2010 Del Skrevet 10. januar 2010 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
Emancipate Skrevet 7. februar 2010 Del Skrevet 7. februar 2010 Det er ganske ulurt å bruke Windows-funksjoner som starter på Rtl, disse kan nemlig endres uforutsett mellom forskjellige versjoner av Windows, og da sitter du der med et program som krasjer i hytt og gevær. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå