WinAPI problem

WinAPI problem

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Da pokusam da objasnim Smile
Pisem DLL koji koristi iskljucivo WinAPI. Problem je u tome sto u unitima koje koristim (prevedeni C++ headeri iz Win SDK) nije definisana vrednost konstante FILE_DELETE_ON_CLOSE potrebne za funkciju NtOpenFile (deo ntdll.dll).

Ubih se trazeci na netu vec dva dana, i ne mogu da nadjem koja je vrednost te konstante (binarna vrednost, mislim da je DWORD).

Bio bih zahvalan ukoliko iko moze da mi pomogne.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

/* Excerpt from <ddk>/inc/wdm.h */ #define FILE_DIRECTORY_FILE                     0x00000001 #define FILE_WRITE_THROUGH                      0x00000002 #define FILE_SEQUENTIAL_ONLY                    0x00000004 #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008 #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010 #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020 #define FILE_NON_DIRECTORY_FILE                 0x00000040 #define FILE_CREATE_TREE_CONNECTION             0x00000080 #define FILE_COMPLETE_IF_OPLOCKED               0x00000100 #define FILE_NO_EA_KNOWLEDGE                    0x00000200 #define FILE_OPEN_FOR_RECOVERY                  0x00000400 #define FILE_RANDOM_ACCESS                      0x00000800 #define FILE_DELETE_ON_CLOSE                    0x00001000 #define FILE_OPEN_BY_FILE_ID                    0x00002000 #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000 #define FILE_NO_COMPRESSION                     0x00008000



offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

To je ta grupa konstanti, hvala puno, isprobacu sutra (ili veceras ako mi zenica da dozvolu da visim kraj kompa do 4 ujutru Smile )

Javljam rezultate.

Dopuna: 06 Jan 2007 23:27

Srki, da mi je sada onaj link na kojem one zivuljke kazu milion puta "Thank You"...
Poljubio bih te da mogu (ali necu posto si neobrijan na avataru) Smile

@all (kojima ikada zatreba)
Sledi source code za anti-delete DLL.
Potreban je MadshiCodeHook za Delphi da bi se ovo iskompajliralo:
http://madshi.net/
kao i prevedeni headeri iz Win SDK (DDK), koje je malo teze naci.

library WatcherHook; {$IMAGEBASE $5a000000} {Copyrigth: Boban Spasic  Credits: Srki82 and madshi} uses   Windows,   Native,   JwaWinType,   JwaWinBase,   madCodeHook,   madStrings; var NtOpenFileNext : function (FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; ShareAccess: ULONG; OpenOptions: ULONG): NTSTATUS; stdcall; NtCreateFileNext: function (FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; AllocationSize: PLARGE_INTEGER; FileAttributes: ULONG; ShareAccess: ULONG; CreateDisposition: ULONG; CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; NtDeleteFileNext: function (ObjectAttributes: POBJECT_ATTRIBUTES): NTSTATUS; stdcall; NtSetInformationFileNext: function (FileHandle: HANDLE; IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: PVOID; FileInformationLength: ULONG; FileInformationClass: FILE_INFORMATION_CLASS): NTSTATUS; stdcall; function NtOpenFileCallback(FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; ShareAccess: ULONG; OpenOptions: ULONG): NTSTATUS; stdcall; begin   if ((OpenOptions and $00001000) <> 0) then OpenOptions := OpenOptions and not $00001000;   Result := NtOpenFileNext(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions); end; function NtCreateFileCallback(FileHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIO_STATUS_BLOCK; AllocationSize: PLARGE_INTEGER; FileAttributes: ULONG; ShareAccess: ULONG; CreateDisposition: ULONG; CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; begin   if ((CreateOptions and $00001000) <> 0) then CreateOptions := CreateOptions and not $00001000;   Result := NtCreateFileNext(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength); end; function NtDeleteFileCallback(ObjectAttributes: POBJECT_ATTRIBUTES): NTSTATUS; stdcall; begin   Result := 0; end; function NtSetInformationFileCallback(FileHandle: HANDLE; IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: PVOID; FileInformationLength: ULONG; FileInformationClass: FILE_INFORMATION_CLASS): NTSTATUS; stdcall; begin   if FileInformationClass = FileDispositionInformation then Result := 0   else Result := NtSetInformationFileNext(FileHandle, IoStatusBlock, FileInformation, FileInformationLength, FileInformationClass); end; begin   CollectHooks;   HookAPI('ntdll.dll', 'NtOpenFile', @NtOpenFileCallback, @NtOpenFileNext);   HookAPI('ntdll.dll', 'NtCreateFile', @NtCreateFileCallback, @NtCreateFileNext);   HookAPI('ntdll.dll', 'NtDeleteFile', @NtDeleteFileCallback, @NtDeleteFileNext);   HookAPI('ntdll.dll', 'NtSetInformationFile', @NtSetInformationFileCallback, @NtSetInformationFileNext);   FlushHooks; end.

Ukoliko se ovaj DLL injectuje System wide, ni jedan program na sistemu ne moze da obrise ni jedan jedini fajl. Prebacivanje fajla u Recycle Bin se ne racuna, posto to ne spada pod brisanje.

Meni ovo konkretno znaci da cu moci da raspakujem sve moguce vrste instalera, arhivera, exe-pakera i embeded fajlova.
Kako?
E to vec necu da vam kazem Smile

Dopuna: 07 Jan 2007 16:00

Uf, nije bas sve kako treba... Sad

Nastaje sledeci problem:
- program je napravio temp fajl i postavio FILE_DELETE_ON_CLOSE flag
- pri zatvaranju fajla program ocekuje da je to ime (recimo ~DF001.tmp) slobodno
- pokusava da kreira drugi fajl pod istim imenom
- BSOD Sad

Nije mi jasno zasto BSOD, zar ne bi trebao neki Access Denied ili bilo sta drugo?

Kontam da treba uraditi sledece:
- zapamtiti Handle koji je program dobio za temp fajl
- kada bude pozvan neki CloseHandle (jos ne znam tacno ime funkcije) da preimenujem fajl ili da ga negde prebacim
- da moj DLL obrise temp fajl tako da ime bude slobodno

Ima li neko tacnu ideju sta treba uraditi?
Meni je problem sto nisam siguran kako i sta treba uraditi s obzirom da postoje vise instanci ovog DLL-a, tj. na sta treba da obratim paznju da ne bi bilo interferenci izmedju instanci.

Dopuna: 07 Jan 2007 21:25

Hmmm... ovo zadnje gore nisam vise mogao da ponovim... izgleda da nije to sto sam mislio da jeste.

Sada imam drugu muku:
- program napravi tmp fajl i u njega iskopira neki sadrzaj
- ne brise fajl
- postavi Length := 0 i u njega upise drugi sadrzaj

Treba sada da vidim kako da hooknem onaj momenat kada "prazni" temp fajl, pa da iskopiram sadrzaj pre toga.

Ko je trenutno na forumu
 

Ukupno su 1179 korisnika na forumu :: 53 registrovanih, 9 sakrivenih i 1117 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., antonije64, Areal84, bozo13, celik, cikadeda, crnitrn, dane007, Dimitrise93, draganca, dragoljub11987, Duh sa sekirom, dushan, flash12, FOX, Griffon vulture, hatman, hologram, hooraay, Ivica1102, janbo, Karla, kjkszpj, Koridor, ksyyaj, kybonacci, laganini123, Leonov, Lieutenant, mackenzie, marsovac 2, mercedesamg, Metanoja, milenko crazy north, miodrag, Mixelotti, Ne doznajem se u oružje, Oscar, Parker, pavlo, pein, procesor, radoznao, ruger357, styg, Trpe Grozni, uruk, Valter071, Vlad000, Webb, wolf431, yrraf, žeks62