Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Интересненький вопросик!!

1.9K
12 сентября 2006 года
Borland_prog
149 / / 25.01.2006
Народ дело вот в чем:
Длл цыпляется ко всем процессам атвтоматом (в реестре App_InsDlls стоит моя длл)
в этой длл создается поток, который постоянно выполняется
В этом потоке постоянно записываются данные в реестр и кое-что еще выполняется (не важно :) )
Короче у меня вылетает ошибка при запуске (например блокнота) такого содержания (программа обратилась по адресу "адресс" и не может быть wriiten)
в чем косяк я смутно понял:
из-за advapi32.dll то есть обращения к реестру
Но мне очень надо что-бы это обязательно присутствовало.

Помогите плиз! Подскажите пока нече немогу понять!
547
12 сентября 2006 года
Hydra
488 / / 20.06.2006
Цитата:

в чем косяк я смутно понял:
из-за advapi32.dll то есть обращения к реестру


Не факт - может как раз из-за

Цитата:

...и кое-что еще выполняется ...

286
12 сентября 2006 года
misha_turist
572 / / 28.11.2005
Не обжайся, но для ответа ты очень мало рассказал.

А ошибка может быть где угодно и скорее всего в твоей библиотеке...
257
12 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
misha_turist прав. только ошибка не скорее всего, а в твоей библиотеке. уж не знаю, что там за код выполняет твоя программа, но скажем попробуй сделать, чтоб твоя программа вызывала функцию messagebox - если все нормально, то ... а дальше нужно хоть что-нибудь, где можно ошибку поискать, если код приводить не хочешь(я подозреваю какое у него назначение), то бери в руки Ollydbg и ищи ошибку - че пальцем в небо тыкать!
1.9K
13 сентября 2006 года
Borland_prog
149 / / 25.01.2006
В моем коде ошибки нет это я проверил

Если длл подключать тупо к тестовой проге ошибок не возникает
А возникает лишь после того когда я прописываю в реестр в ключApp_InsDlls, т.е user32.dll сама подключает мою длл ко всем запускаемым GUI-процессам.

Я даже уже нашел где возникает ошибка воспользовавшись "Олей":
Ошибка возникает при вызове функции RegKeyOpen из advapi32.dll
причем не в моем коде а коде который добавляет сама делфа - функции инициализации, тама она обращается к своим ключам реестра (зачем-то??)
Причем ошибка возникает не во всех процессах
Например на домашнем компютере где стоит Windows XP Prof XP1 ошибка возникает при запуске Winamp, а при запуске блокнота, explorer-а, ворда, калькулятора и других не возникает
А на работе где стоит Windows XP SP2 возникает и в блокноте и rundll32.exe и калькуляторе и т.д


Так вот все равно не могу ни чего понять почему так?
547
13 сентября 2006 года
Hydra
488 / / 20.06.2006
ну попробуй в реестр через API лазить.
257
13 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
to Borland_prog
кинь сдесь длл или мне на мыло [email]kosfiz@mail.ru[/email] посмотрю у себя, а то чето странно она себя ведет. пропишу у себя в App_InsDlls и потестю (я не код прошу, а саму длл).
547
14 сентября 2006 года
Hydra
488 / / 20.06.2006
2kosfiz
Не боишься ;)
257
14 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
2Hydra
а я все на VMware тестирую - на всякий случай.
2Borland_prog
ну че давай потестю. просто не может быть, чтоб прога написанная на дельфях обращалась к дельфийским ключам реестра -> ведь дельфи же может быть и не установлена.
1.9K
18 сентября 2006 года
Borland_prog
149 / / 25.01.2006
2Hyndra так причем же мой код я говорю что сам компайлер делфы добавляет свою функцию инициализации (или че-го там) и добавляет туда обращения к реестру.

2Kosfiz Ну я же в ольке проверил -> делфа обращается к ключам (че то там Borland\ ты ры пыры.
1.9K
18 сентября 2006 года
Borland_prog
149 / / 25.01.2006
Пожалуйста

http://jobboris007.narod.ru/antik_dll.rar --- Длл (компальная)
http://jobboris007.narod.ru/Dll-sorc.rar --- Сорцы
257
21 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
вот тебе подправленные исходники. все отлично работает, никаких can't be written больше не вылазиет. поймешь в чем дело, когда код посмотришь. кстати вот тебе на заметку: есть у тебя строка в проге
 
Код:
RegSetString(HKEY_LOCAL_MACHINE, AppInit_DLLsKeyName, AppInit_DLLsKeyVal);

просто хочу обратить твое внимание на то, что в ключе AppInit_DLLs может быть записано еще какая-нибудь длл, так что наверное сначала надо получить значение оттуда, а потом к нему добавить свое и записать.
1.9K
22 сентября 2006 года
Borland_prog
149 / / 25.01.2006
RegSetString(HKEY_LOCAL_MACHINE, AppInit_DLLsKeyName, AppInit_DLLsKeyVal);

Не ну это понятно - я просто пробовал
Спасибо!!!!
1.9K
22 сентября 2006 года
Borland_prog
149 / / 25.01.2006
А еще как продолжение темы:
Я в коде потока хочу например в какой-нить файл писать что-нить
и нарушение доступа происходит
а как сделать чтоб небыло?
тоже использовать проекцию нужного файла или как?
257
22 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
[QUOTE=Borland_prog]
Не ну это понятно - я просто пробовал
Спасибо!!!![/QUOTE]
1) я так и понял, что ты пробовал, но просто решил тебе напомнить, чтобы ты не забыл.
2) да не за что - всегда рад помочь.
3) касательно нового вопроса:
добавил к коду ThreadFunc вот такое, т.е. просто попробовал что-нибудь записать в файл 1.txt с учетом того, что он существует:
 
Код:
var
 hFile,bw:dword;
...........
hFile:=CreateFile(pchar('c:\1.txt'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    WriteFile(hFile,'string',6,bw,0);
    CloseHandle(hFile);

и все получилось без ошибок - так что пробуй. только тебе, есстественно, надо будет добавлять данные, т.е. перейти в конец файла и записать то, что нужно.
1.9K
22 сентября 2006 года
Borland_prog
149 / / 25.01.2006
Я тут сразу не протестил то что ты мне написал, а потом:
Спасибо большое за помощь, но есть маленький нюанс:
То что ты мне написал конечно правильно (я честно сказать не додумался бы), но все же...
Вообщем ошибка не исчезла
Делфийский компайлер добавляет свой код вызовом по адресу 00409AEF функции инициализации (или еще-чего)
В этой функции инициализации происходит вызов System::LoadResString, которая в свою
очередь вызывает = call sub_404928, та вызывает = call sub_4048E0. В которой есть проверка
на какое-то условие:
cmp dword ptr [ebx+10h], 0
jnz short loc_40491B
Если оно не выполняется то далее вызывается call sub_404B1C
В которой и просходит вызов функции call RegOpenKeyExA (аж 3 раза, но это неважно).
Открытие ключа реестра (прокопав далее ошибка происходит в ntdll.dll)

Так у меня вопрос: почему????


Кстати из всего этого можно сделать вывод:
Люди знайте: ЕСЛИ ВЫ ПРОГРАММИРУЕТЕ НА ДЕЛФЕ ПРИ КАЖДОМ ВЫЗОВЕ ВАМИ LoadResString из System
ПРОИСХОДИТ КАК МИНИМУМ ТРИ ОбРАЩЕНИЯ К РЕЕСТРУ!!!!
Так же там вызывается и RegQueryValueExA (два раза)


Далее куски декампайлерного кода полученные с помощью IDAG
Адресса естественно мои личные (в смысле для моего компа)
Код:
CODE:00404B1C sub_404B1C      proc near               ; CODE XREF: sub_4048E0+27p
CODE:00404B1C
                            ...
                            ...
CODE:00404B41                 lea     eax, [ebp+hKey]
CODE:00404B44                 push    eax             ; phkResult
CODE:00404B45                 push    0F0019h         ; samDesired
CODE:00404B4A                 push    0               ; ulOptions
CODE:00404B4C                 push    offset SubKey   ; lpSubKey
CODE:00404B51                 push    80000001h       ; hKey
CODE:00404B56                 call    RegOpenKeyExA --> вот здесь и происходит ошибка (Память не может быть "written")
                            ...
                            ...
CODE:00404C20                 retn

/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

CODE:004048E0 sub_4048E0      proc near               ; CODE XREF: sub_404928+1Bp
                            ...
                            ...
CODE:004048EA                 cmp     dword ptr [ebx+10h], 0
CODE:004048EE                 jnz     short loc_40491B --> а здесь я отчаившись пропатчил на безусловный переход (и все сработало)
CODE:004048F0                 push    105h            ; nSize
CODE:004048F5                 lea     eax, [esp+10Ch+Filename]
CODE:004048F9                 push    eax             ; lpFilename
CODE:004048FA                 mov     eax, [ebx+4]
CODE:004048FD                 push    eax             ; hModule
CODE:004048FE                 call    GetModuleFileNameA
CODE:00404903                 mov     eax, esp
CODE:00404905                 mov     dl, 1
CODE:00404907                 call    sub_404B1C --> Вот здесь вызывается предыдущая функция (в которой и есть то самое обращение к реестру)
CODE:0040490C                 mov     esi, eax
CODE:0040490E                 mov     [ebx+10h], esi
CODE:00404911                 test    esi, esi
CODE:00404913                 jnz     short loc_40491B
CODE:00404915                 mov     eax, [ebx+4]
CODE:00404918                 mov     [ebx+10h], eax
CODE:0040491B
CODE:0040491B loc_40491B:                             ; CODE XREF: sub_4048E0+Ej
CODE:0040491B                                         ; sub_4048E0+33j
CODE:0040491B                 mov     eax, [ebx+10h]
CODE:0040491E                 add     esp, 108h
CODE:00404924                 pop     esi
CODE:00404925                 pop     ebx
CODE:00404926                 retn
CODE:00404926 sub_4048E0      endp

/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

CODE:00404928 sub_404928      proc near               ; CODE XREF: System::LoadResString(System::TResStringRec *)+2Bp
CODE:00404928                                         ; Sysutils::ExceptionErrorMessage(System::TObject *,void *,char *,int)+ECp ...
                        ...
                        ...
CODE:00404941                 mov     eax, edx
CODE:00404943                 call    sub_4048E0 --> здесь вызывается функция выше.
CODE:00404948                 retn

/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

CODE:00404EAC ; __fastcall System::LoadResString(System::TResStringRec *)
CODE:00404EAC @System@LoadResString$qqrp20System@TResStringRec proc near
CODE:00404EAC                                         ; CODE XREF: sub_4039A4+16p
CODE:00404EAC                                         ; SysUtils::_16679+2Ep ...
                        ...
                        ...
CODE:00404ED7                 call    sub_404928 --> здесь вызывается предыдущая функция
CODE:00404EDC                 push    eax             ; hInstance
CODE:00404EDD                 call    LoadStringA
CODE:00404EE2                 mov     ecx, eax
CODE:00404EE4                 mov     edx, esp
CODE:00404EE6                 mov     eax, esi
CODE:00404EE8                 call    @@LStrFromPCharLen$qqrr10AnsiStringpci ; __linkproc__ LStrFromPCharLen(AnsiString &,char *,int)
CODE:00404EED                 jmp     short loc_404EF9
                        ...
                        ...
CODE:00404F01                 retn
CODE:00404F01 @System@LoadResString$qqrp20System@TResStringRec endp


Вообщем вся эта байда вызывается из
CODE:00409AE4                 public start
CODE:00409AE4 start:
CODE:00409AE4                 push    ebp
CODE:00409AE5                 mov     ebp, esp
CODE:00409AE7                 add     esp, 0FFFFFFC4h
CODE:00409AEA                 mov     eax, offset dword_409A84
CODE:00409AEF                 call    sub_4051EC --> вот здесь происходит вызов функции которую добавляет делфовый компайлер
                        ...
                        ...
                        Дальше идет все мое
257
23 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
странно, перед тем как исправленную выложить специально проверял - все ок было, теперь опять че-то на некоторых экзехах не работает. все сделали по науке, а нам шишь. будь проклят тот день, когда я решил писать на делфи. да и еще, если я не ошибаюсь этот код добавляется во все длл и всегда, следовательно возникают вопросы:
1) зачем при инициализации идет обращение к реестру?
2) и как же все это сделать чтоб работало без проблем?
самому теперь интересно стало.
1.9K
25 сентября 2006 года
Borland_prog
149 / / 25.01.2006
Вроде бы делфа ищет свои локалии или что.
Я исходники Sytem.pas посорел.
Надо вообщем покопаться поизучать. Все таки почему?
257
25 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
2Borland_prog
хочу поделиться с тобой результатами своих раскопок по вопросу, который нас обоих интересует, вообщем system.pas не виновник этих проблем, а вся эта фигня из-за SysUtils.pas. пробовал по-всякому если sysutils не заюзан, то ошибок не вылазиет, а если подключен, то ошибка. Так что, наверное или скорее всего, в твоем случае надо попытаться обойтись без него или узнать где там ошибочка и её убрать, вообщем решай сам.
1.9K
26 сентября 2006 года
Borland_prog
149 / / 25.01.2006
Вообще прикол в чем:
Ошибка же возникает только когда длл грузится во все процессы
А я протестил на своей, т.е.: не прописывая ключ в реестре AppInst_Dlls и все работает прога подключает длл и все путем

Так вот о чем это я:
На самом деле user32.dll при своей загрузке в процесс (а он грузится почти во все процессы) и подрубает к процессу к которому он подключается все длл перечисленные в AppInst_Dlls
:) Ну это все ты конечно знаешь

Просто я хочу сказать может мы ищем не там косяк:
Зачем копаться в делфе, если это может быть (скорее всего) (да точно) зависит от устройства винды (не знаю там: защиты, виртуальной памяти или еще чего)

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

Короче я сделал вывод:
Буду по новой Рихтера читать:)
257
26 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
Я тоже считаю, что Рихтера нужно почитать, даже сам начал перечитывать нужную главу, но все же попробую переправить некоторый код в длл, чтобы не использовать SysUtils, и если длл не будет выдавать ошибок при аттаче, то начну исследовать подозрительного "пациента"(т.е. SysUtils).
257
26 сентября 2006 года
kosfiz
1.6K / / 18.09.2005
обошелся и без sysutils.pas(правил всего в двух местах). все вроде работает. ошибок вроде нет(проверил все проги, что установлены на компе). хотел бы узнать твое мнение.
и еще я внимательно присмотрелся, но так и не понял: зачем ты в processes.pas в процедуре GetProcessesList определяешь 98 винда или NT/2000/XP - ведь код стоящий для 98 винды без проблем работает на 2000 и XP?
1.9K
06 октября 2006 года
Borland_prog
149 / / 25.01.2006
[QUOTE=kosfiz]и еще я внимательно присмотрелся, но так и не понял: зачем ты в processes.pas в процедуре GetProcessesList определяешь 98 винда или NT/2000/XP - ведь код стоящий для 98 винды без проблем работает на 2000 и XP?[/QUOTE]

Да я просто функцию брал с DW //// не обращал внимание
:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог