Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› Работа с занятыми файлами.
Посл.ответ Сообщение


Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 14:21
· Личное сообщение · #1

Вообщем такое дело, написал прогу и драйвер, прога через иоктл шлет запрос драйверу передавая в параметре адрес того файла когорого надо скопировать. Как я знаю файл SAM занят системой , проба на нем прошла успешно , файл скопировался. Я сделал теперь запрос на другой файл занятый , он не скопировался , точнее скопировался но пустой а инфа не прочиталась. Я думал что если САМ файл скопировало то и тот текстовик скопирует. Текстовый файл , лежит в скрытом режиме может это причина скопированного файла с 0 байтами?

Исаев сделал пробу на своем коме с другой прогой , она через
Code:
  1.     Switch uMsg
  2.       Case WM_COMMAND
  3.       Case WM_DROPFILES

копирует файл тоже, странно то что файл у меня скопировался , но на другом компе скопировался файл с 0 байтами.
У кого какое мнение ?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 05 сентября 2008 14:30
· Личное сообщение · #2

mak пишет:
Текстовый файл , лежит в скрытом режиме

Этот текстовый файл отрывается следующим образом:
Code:
  1. 0012E438   0040BB7B  /CALL to CreateFileA from proga.0040BB79
  2. 0012E43C   00ED4DE8  |FileName = "[Path]\name.txt"
  3. 0012E440   001F01FF  |Access = 1F01FF
  4. 0012E444   00000000  |ShareMode = 0
  5. 0012E448   00000000  |pSecurity = NULL
  6. 0012E44C   00000003  |Mode = OPEN_EXISTING
  7. 0012E450   00000006  |Attributes = HIDDEN|SYSTEM
  8. 0012E454   00000000  \hTemplateFile = NULL

тут наверное всё что нужно знать для того, чтобы получить к нему доступ

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 сентября 2008 18:14
· Личное сообщение · #3

Разбирать надо прогу твою, файлы, коды ошибок смотреть, чо это за вопрос то, гадать что ли? Как вариант-Рема статью почитай про занятые файлы.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 20:40 · Поправил: mak
· Личное сообщение · #4

Поэксперименитровал и понял разницу

Code:
  1. CopyFile proc uszDeviceName:DWORD
  2. local oa:OBJECT_ATTRIBUTES
  3. local iosb:IO_STATUS_BLOCK
  4. local hFile:HANDLE
  5. local p:PVOID
  6. local cb:DWORD
  7. local fsi:FILE_STANDARD_INFORMATION
  8. local usDeviceName:UNICODE_STRING
  9. invoke RtlInitUnicodeString, addr usDeviceName,uszDeviceName ; offset uszDeviceName
  10.     InitializeObjectAttributes addr oa,addr usDeviceName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL


addr usDeviceName эта переменная дается с ехе программы через иоктл , я точно не уверен но наверное причина в том что поданная сточка не соотвествует любимому формату драйверов.После попадания в драйвер делается RtlInitUnicodeString где addr usDeviceName это уникод строка а последний праметр это адрес нахождения пути до файла которого надо копировать. Поэтому дровина отрабатывает создавая вариант пустого файла но не записывающего данные ибо путь то не был верен.


Если я пишу строку
Code:
  1. $CCOUNTED_UNICODE_STRING("\SystemRoot")


в месте


InitializeObjectAttributes addr oa,$CCOUNTED_UNICODE_STRING("\SystemRoot"),OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL
то тогда копируется все на ура. Это означает что я неправильно подаю данные в драйвер или чего то еще не хватает. В приложении скомпиленная прога с дровиной. В папке сам должнасоздать копию сам с именем ver. То есть это вариант без $CCOUNTED_UNICODE_STRING.

Вопрос ? Как передать правильно строку в драйвер в понятном для него формате динамически , разблокируемый файл может быть каждый раз разный.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 20:46
· Личное сообщение · #5

файл

bb6b_05.09.2008_CRACKLAB.rU.tgz - Xen.rar

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 21:03
· Личное сообщение · #6

Вот еще забыл момент с буфером
Code:
  1.         .if [edi].Parameters.DeviceIoControl.IoControlCode == мой код
  2.    mov edx, [esi].AssociatedIrp.SystemBuffer
  3.    assume edx:ptr DWORD
  4.    invoke CopyFile,edx


в SystemBuffer будет лежать моя строка или адрес строки которые пришли с приложения?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 сентября 2008 21:34
· Личное сообщение · #7

Обычно в таких случаях я сам просто беру и смотрю это в сайсе, что проще-взять воткнуть в дров __asm int 3, в сайсе поставить bpint 3 и посмотреть, что интересно. По-моему, это гораздо лучше, чем тыкать народ на форуме, тем более, что это можно легко глянуть самому.




Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 05 сентября 2008 22:56 · Поправил: MACKLIA
· Личное сообщение · #8

mak пишет:
файл

bb6b_05.09.2008_CRACKLAB.rU.tgz - Xen.rar

mak у меня после старта твоей проги комп сразу ребутнулся ,как будто я какой то выжный системный процес кильнул

-----
Что один человек сделал , другой всегда сломать может...





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 22:57
· Личное сообщение · #9

Archer спсб хороший метод , все верно в функцию идет адрес файла которого потом проходит RtlInitUnicodeString переводит и потом даже крит файл открывает все супер , а падение было вот тут

Code:
  1. invoke ZwQueryInformationFile, hFile, addr iosb, addr fsi, sizeof fsi, FileStandardInformation
  2.          mov    eax, fsi.EndOfFile.LowPart
  3.          inc    eax
  4.          mov    cb, eax
  5.          invoke ExAllocatePool, PagedPool, cb
  6.          mov    p, eax
  7.          invoke RtlZeroMemory, p, cb


на коде invoke ExAllocatePool, PagedPool, cb
вернуло 0 ну а потом естественно пишет в файл 0 байт но создает его . Самое интеерсное что при строке $CCOUNTED_UNICODE_STRING работает а с динамическим адресом не работает. Какая может быть разница ?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 23:01
· Личное сообщение · #10

MACKLIA не не , там ничего не киляет , у меня пока не было такого с этим кодом что тут. Было синий экран с другой версией , но там ясно было не так адреса выделяллись. Тут же я проверял с $CCOUNTED_UNICODE_STRING копирует , а без нее просто пустой файл создает.

Извиняюсь за такое последствие

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 05 сентября 2008 23:08
· Личное сообщение · #11

mak мак за эксперемент никаких претензий ,просто сообщил как у меня комп отреагировал.

-----
Что один человек сделал , другой всегда сломать может...





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 05 сентября 2008 23:25 · Поправил: mak
· Личное сообщение · #12

=) нашел ошибку всетаки точную , память не выделяется потому что имя файла подается не правильно ,в IOCTL передается строка адрес файла , далее в драйвере берется буфер проверил в софтайсе , с правильным адресом файла , но адрес не сформирован как строка DW нужная для драйвера , в свою очередь я видел в дровине работы с реестром , там адреса не имеют формата DWно делают RtlInitUnicodeString.

В итоге ошибка тут , как ее решить честно не знаю ..

Code:
  1. local usDeviceName:UNICODE_STRING
  2. invoke RtlInitUnicodeString, addr usDeviceName,uszDeviceName
  3.     InitializeObjectAttributes addr oa,addr usDeviceName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL


где uszDeviceName адрес на буфер с адресом файла в виде например C:\windows\xxx\
а далее в InitializeObjectAttributes параметр addr usDeviceName идет уже готовая уникод строка , но как получается как раз она и неверная.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 110.7 (ветеран)
Активность: 0.070
Статус: Участник
~ tPORt ~

Создано: 06 сентября 2008 12:28
· Личное сообщение · #13

mak, смотрите коды ошибок ну и на коды бсодов тоже внимание обращайте.. а то падает тут а почему хз)

имя файла хоть с \??\ начинается то? 6)
а то без сырцов даже непоймешь где ошибка то




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 06 сентября 2008 17:19 · Поправил: mak
· Личное сообщение · #14

имя файла обыкновенный путь вида С:\tmpDrv.sys требуется вот что ..

Code:
  1. drvnameW   dw "c",":","","t","m","p","D","r","v",".","s","y","s",0
  2. drvname    db 'c:\tmpDrv.sys',0


Перевести строку динамически drvname в drvnameW , естественно оба буфера будут пустые до перевода и поиска файла

P.S
это уже сделал , оказалось просто
Code:
  1. invoke lstrlen,addr adwInBuffer
  2. mov cchWideChar,eax
  3. invoke MultiByteToWideChar,CP_ACP,0,addr adwInBuffer,cchWideChar,addr adwInBufferW, sizeof adwInBufferW
  4. invoke SysAllocStringLen,addr adwInBufferW, eax
  5.          mov pBSTR,eax

теперь у драйвера есть уникод строка .... ноооо опять же есть ошибка , вариант такой по моему мнению я 2слэша не сделал в пути вместо одного. Значит после получения пути нужно парсить и вставлять второй флэш ?! Может есть апи упрощающая действие ?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2008 10:25 · Поправил: requiem4
· Личное сообщение · #15

Правильное имя файла должно быть:
"\\??\\c:\\tmpdrv.sys" (Си строка)



Ранг: 110.7 (ветеран)
Активность: 0.070
Статус: Участник
~ tPORt ~

Создано: 08 сентября 2008 10:53 · Поправил: LazzY
· Личное сообщение · #16

ога ну а поруски это будет \??\c:\tmpdrv.sys
add:почитайте не много стотей Four-F на васме




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 сентября 2008 13:13
· Личное сообщение · #17

requiem4 LazzY Спасибо за замечание , это и так ястно

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 сентября 2008 22:27
· Личное сообщение · #18

вообщем сделал я подачу Уникод строки в дровину и добавление слэшей , файл не открылся и тут сразу возник вопрос такой

Code:
  1. local usDeviceName:UNICODE_STRING
  2. invoke RtlInitUnicodeString, addr usDeviceName,edx ; offset uszDeviceName
  3.     InitializeObjectAttributes addr oa,offset usDeviceName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL

сработает ли InitializeObjectAttributes , когда подаешь динамически строку ? в edx Адрес правильной строки в юникод формате , но при ZwCreateFile в еах с0000033 ошибка

А вот ее код STATUS_OBJECT_NAME_INVALID = $C0000033 , значит ошибка в InitializeObjectAttributes. Проверял правильность адресов в софтайсе поставив инт3 в код драйвера перед Пуш едх и колл адрес где в едх адрес уникод строки.

39b5_08.09.2008_CRACKLAB.rU.tgz - Driver.rar

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 сентября 2008 08:48
· Личное сообщение · #19

InitializeObjectAttributes это очень простенькая функция

#define InitializeObjectAttributes(p,n,a,r,s)
do {
(p)->Length = sizeof(OBJECT_ATTRIBUTES);
(p)->RootDirectory = r;
(p)->Attributes = a;
(p)->ObjectName = n;
(p)->SecurityDescriptor = s;
(p)->SecurityQualityOfService = NULL;
} while (0)

Непонятно в последнем примере что именно ты пытаешься открыть: файл или драйвер?
Если драйвер, то код будет таким

RtlInitUnicodeString(&uDriver,L"\\DosDevices\\DriverName");

InitializeObjectAttributes(&ObjectAttributes,
&uDriver,
OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE ,
NULL,
NULL);

Скидывай исходник или кусок его, чтобы вопросов было меньше.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 09 сентября 2008 11:47 · Поправил: mak
· Личное сообщение · #20

Как заполняется эта структура? есть пример ? Я писал уже что не играет роли драйвер это или файл , в приложенной проге идет работа только с файлом соответсвенно и строка готовится к иоктл для файла а не драйвера. Если есть разница заполнения InitializeObjectAttributes с драйверами то какая ?

По выше приведенному коду я показл участок где макрос вроде бы не выполняет своих функций , как можно инициализировать то чего нету. С другой стороны в коде дровины инициализация присуствует. Но судя по всему она неверная.


PS . я щас побегал по даресам структур , и понял что строки моей передаваемой уже подавно , нету я подал адрес на
mov edx, [esi].AssociatedIrp.SystemBuffer
assume edx:ptr DWORD
далее идет

invoke RtlInitUnicodeString, addr usDeviceName,edx
RtlInitUnicodeString вроде заполняет структуру в usDeviceName где последний параметр должен быть адрес на строку мою, но во первых там нету почему то адреса а во вторых по адресу в едх который я запомнил уже нет более моей строки , а если в структуру пишется только указатель на едх это значит что кто то стер мою строку и это RtlInitUnicodeString !

далее InitializeObjectAttributes addr oa,addr usDeviceName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL

где опять же лажовый адрес без имени моего и звКритфайл говорит неправильно емя. Странно ..
А вот прототипы структур
Code:
  1. OBJECT_ATTRIBUTES struct 
  2.     Len ULONG ?
  3.     RootDirectory HANDLE ?
  4.     ObjectName PVOID ?
  5.     Attributes ULONG ?
  6.     SecurityDescriptor PVOID ?
  7.     SecurityQualityOfService PVOID ?
  8. OBJECT_ATTRIBUTES ends
  9. UNICODE_STRING struct
  10.   Len USHORT  ?
  11.   MaximumLen USHORT  ?
  12.   Buffer PWSTR  ?
  13. UNICODE_STRING ends


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 сентября 2008 13:43
· Личное сообщение · #21

> Если есть разница заполнения InitializeObjectAttributes с драйверами то какая ?
Сравни мои 2 поста и заметишь.
> код таким не будет , потому что строка в ртлинит неизвестная на момент инициализации
Какая разница то?
RtlInitUnicodeString(&str,buffer);
Наверное ты запутался в указателях на выделяемую память.

можно тебе поможет с опцией выделением памяти
RtlAnsiStringToUnicodeString

Но лучше показывай текущее свое творение


 eXeL@B —› Программирование —› Работа с занятыми файлами.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати