Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
1

Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB

29.12.2017, 14:02. Показов 4901. Ответов 77
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

А как обнаружить свой адрес при входе в функцию какой-либо DLL-ки ?
А по русски говоря: Сохранить регистр EIP.

У меня пришло на ум только это (в отладчике, asm-ом не занимаюсь):
Assembler
1
2
3
1000.1010     E8 0000.0000      Call xxxx.xxxx  // Тут ручками подбираем вызов "себе под нос"
1000.101E     59                Pop ecx
1000.101F     81E9 1E10.0000    Sub ecx, 101E   // Тут ручками подбираем до самого начала всей DLL-ки
Типа: Выцепили указатель на самое начало DLL (на header).

А не бывает ли на свете "ещё изящнее" решения ?

И это, ... все 52 фуни (!!! МОЕЙ !!!) DLL-ки поголовно при входе в EAX содержат свою точку входа.
Наверное это всё-таки "медвежья услуга" компилятора вызывающей программы ?
Стоит на это надеяться ? А то мож зря процедуру "себе под нос" затеваю ?

Заранее спасибо !
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2017, 14:02
Ответы с готовыми решениями:

Передача дополнительного аргумента в функцию stdcall/cdecl?
Всем доброго дня! Есть функция func вида: __stdcall void func() { cout<<"func"<<endl;...

Макрос для вызова подпрограмм с соглашением cdecl
как подключить в ассемблер Fasm соглашение вызова cdecl?

Передача структуры данных в DLL (stdcall)
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1:...

Конфликт forward и stdcall в dll-библиотеке
Добрый день. Есть некая библиотека library S_dll; uses ...; {$R *.res} var ... ...

77
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
14.01.2018, 12:54 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Gazzi Посмотреть сообщение
Не вижу ни одного слова про IDE !
Ты о чем?
Цитата Сообщение от Gazzi Посмотреть сообщение
В скомпилированном варианте "и так" всё работает отлично ...
Не работает.
Цитата Сообщение от Gazzi Посмотреть сообщение
Действительно, если ( КОМПИЛИРОВАННЫЙ ) Вася за мной-идиотом его восстанавливает.
Не восстанавливает.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
14.01.2018, 19:03  [ТС] 42
Старый Новый год в разгаре ?

... Не работает ...
... Не восстанавливает ...
Вложения
Тип файла: rar MOY2.rar (13.1 Кб, 6 просмотров)
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
14.01.2018, 19:47 43
Gazzi, что ты шлешь? Какая cdeclFunj? Ты хоть сам видел что прислал?
Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB

Цитата Сообщение от Gazzi Посмотреть сообщение
Старый Новый год в разгаре ?
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
14.01.2018, 19:59  [ТС] 44
Виноват, Начинаю Исправляться !
Вложения
Тип файла: rar MOY3.rar (13.1 Кб, 8 просмотров)
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
14.01.2018, 20:14 45
Цитата Сообщение от Gazzi Посмотреть сообщение
Начинаю Исправляться !
Нет.
Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB

В общем я не пойму что ты мне хочешь сказать. Говнокод с таймером вообще развеселил - вместо вызова функции в цикле городить таймер (мог бы поступить по-умнее и просто вызов cdecl функции обернуть в другую функцию). В том виде в котором ты вызываешь стек не восстанавливается после вызова функции, т.к. с Declare оператором декларируются только stdcall функции. Если это работает в каких-то отдельных случаях (из-за указателя кадра стека и т.д.), это не означает что это работает всегда - в любой момент после очередной перекомпиляции код просто перестанет работать.
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
14.01.2018, 20:26 46
Вот наипростейший код с вызовом твоей функции валит все приложение:
Visual Basic
1
2
3
4
5
Public Sub Main()
 
    cdeclFunj 0
 
End Sub
Вложения
Тип файла: rar MOY3.rar (4.7 Кб, 2 просмотров)
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
14.01.2018, 21:09  [ТС] 47
Это твой код (лимон раз вызвать без пауз, без обработки возврата, тоже кстати развеселил).
Даже не знаю, где-ж такое может понадобиться ?

Ты покажи-ка да расскажи-ка нам всем - как работает синяя кнопка.
И что там стек нам всем говорит (как он там не работает, не восстанавливается) ???
(Его наверное The_trick там восстанавливает ?)

В таймер я её засунул, чтоб ты видел, как "Наш дорогой Вася за мной-идиотом стек
восстанавливает".

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

... Declare оператором декларируются только stdcall функции ...
А мы вторым номером взяли, и задекларировали её (вот собаки страшные), и откуда-ж наш Вася будет знать,
что ему подсовывают, а может я ему подсуну moyDecl, и как же это он догадается, а ???

... Если это работает в каких-то отдельных случаях (из-за указателя кадра стека и т.д.),
это не означает что это работает всегда ...
Пример Пжлста !

... в любой момент после очередной перекомпиляции код просто перестанет работать ...
Пример Пжлста !

Не забудь, что:
"Нужно ДАВАТЬ возможность любимому Васе исправлять стек за всяческими идиотами"
Т.е. ДАВАТЬ ПАУЗУ, пока всяческий идиот не дошёл до миллионного вызова !

... стек не восстанавливается после вызова функции ...
А что ж он делает, если нашего васю прервать, а не добивать до лимона раз ?

... мог бы поступить по-умнее и просто вызов cdecl функции обернуть ...
Я и "обернул" RETN-ами, и прям во вражеском тылу, что ещё может быть "обернутестее" :

Или ты считаешь свою Inlain-высшим совершенством штоль ?

Ещё раз спрашиваю (при свидетелях) :

ВОССТАНАВЛИВАЕТСЯ СТЕК ИЛИ НЕТ ???

Добавлено через 17 минут
Ты давай теперь отмазки-то не клей задним числом (SubMain)
Оно до.уя где ещё может не запуститься ...

Чо там со стеком то происходит ???
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
14.01.2018, 22:03 48
Цитата Сообщение от Gazzi Посмотреть сообщение
Это твой код (лимон раз вызвать без пауз, без обработки возврата, тоже кстати развеселил).
Даже не знаю, где-ж такое может понадобиться ?
Во многих задачах, к примеру игровой цикл, цикл прокачки сообщений и т.п. любой цикл.
Цитата Сообщение от Gazzi Посмотреть сообщение
Ты покажи-ка да расскажи-ка нам всем - как работает синяя кнопка.
И что там стек нам всем говорит (как он там не работает, не восстанавливается) ???
(Его наверное The_trick там восстанавливает ?)
Он работает исключительно из-за того что ты вместо цикла делаешь через таймер и тебе повезло что в процедуре идет обращение через указатель кадра стека и нет инструкций сохраняющих состояние и восстанавливающих его между вызовами. Чуть поменяв код можно уронить его точно также как я уронил тут.
Цитата Сообщение от Gazzi Посмотреть сообщение
В таймер я её засунул, чтоб ты видел, как "Наш дорогой Вася за мной-идиотом стек
восстанавливает".
В таймер ты его засунул для того чтобы "по-кривому" обойти ограничение размера стека в одной процедуре. По-кривому, потому что это работает через раз. Естественно компилятор сделал адресацию через EBP и внутри нет вызовов PUSH POP между вызовами cdecl функции, но вот я чуть переделал твой код и он сразу же упал.
Цитата Сообщение от Gazzi Посмотреть сообщение
А мы вторым номером взяли, и задекларировали её (вот собаки страшные), и откуда-ж наш Вася будет знать,
что ему подсовывают, а может я ему подсуну moyDecl, и как же это он догадается, а ???
Да ты можешь что угодно туда подсунуть, вопрос корректно ли это будет работать?
Цитата Сообщение от Gazzi Посмотреть сообщение
Пример Пжлста !
Скидывал уже несколько примеров.
Цитата Сообщение от Gazzi Посмотреть сообщение
Пример Пжлста !
Пример с Sub Main, скомпилируй с оптимизациями - не работает, скомпилируй без оптимизаций - заработает. После очередной перекомпиляции код просто перестал работать.
Цитата Сообщение от Gazzi Посмотреть сообщение
Т.е. ДАВАТЬ ПАУЗУ, пока всяческий идиот не дошёл до миллионного вызова !
Где такое правило написано? Это для всех cdecl функций такое? Зайди на форум к сишникам и скажи такое.
Цитата Сообщение от Gazzi Посмотреть сообщение
А что ж он делает, если нашего васю прервать, а не добивать до лимона раз ?
Смотря в каком примере, если в моем - упадет, если в твоем - просто повезло что ты вызываешь в процедуре с адресацией через EBP.
Цитата Сообщение от Gazzi Посмотреть сообщение
Я и "обернул" RETN-ами, и прям во вражеском тылу, что ещё может быть "обернутестее" :
Это называется костыли, и так не нужно делать, нужно делать нормально через декларацию в tlb тогда и оборачивать ничего не нужно.
Цитата Сообщение от Gazzi Посмотреть сообщение
Или ты считаешь свою Inlain-высшим совершенством штоль ?
Не знаю про что ты.
Цитата Сообщение от Gazzi Посмотреть сообщение
ВОССТАНАВЛИВАЕТСЯ СТЕК ИЛИ НЕТ ???
Нет, примеры что я скинул ранее это доказывают.
Цитата Сообщение от Gazzi Посмотреть сообщение
Ты давай теперь отмазки-то не клей задним числом (SubMain)
А ты не сливайся, какие отмазки-то? Тебе показали простейший пример о который все твои мифы о работе "просто так" cdecl функций разрушаются.
Цитата Сообщение от Gazzi Посмотреть сообщение
Оно до.уя где ещё может не запуститься ...
Ты не понимаешь что ли? Тебя заблокировать? Тебе сколько нарушений нужно выдать чтобы ты нормально общался?
Цитата Сообщение от Gazzi Посмотреть сообщение
Чо там со стеком то происходит ???
Портится, портится....
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
23.01.2018, 00:10  [ТС] 49
... наипростейший код с вызовом твоей функции валит все приложение ...
А в какой прос(т)рации в данный момент находится наш таймер (в SubМашке) ?
Когда у нас в Васе объекты рожаются, "профессор" ты наш ...

... Во многих задачах, к примеру игровой цикл ...
А ты вообще "паузу" собираешся" давать прожке во время "игровых циклов", иль хрен с ней,
пусть висит, пока я до лима досчитаю.

... тебе повезло ... в любой момент после очередной перекомпиляции ...
Да кому "повязёть" у того хто снясёть ? Не вижу никаких "вязений".
Да хоть лимон раз компилячь, дал паузу Васе - стек цел.

... идет обращение через указатель кадра ...
... нет инструкций сохраняющих состояние и восстанавливающих его между вызовами ...
Во пурга (отмазки, и т.д). Где ж ты таковое видовал в нашей Васе ?
Вася отдал стек, вася его примет в своём "кадре" (слово то какое отковырял, наверное из диссертации).

... как я уронил тут ...
Я тебе уже ... , почему ты его уронил. Возьми, API-шный тимер, да "роди" его в SubМане, если
тебе так охота.

... Это называется костыли ... и так не нужно делать ...
Вот он, Зав. Ортопедическим отделением выискался. Тот у нас на костылях, этот на протезах.
А сам на чём, на коляске штоль ?
Прям наверное Доцент, не иначе.
Откуда такой "решала" выискался, кому и шо тут кодить можно ?

... Ты не понимаешь что ли? Тебя заблокировать? ...
Ой, я щас расплачусь, глобус перестанет крутиться.

Вот прежде чем блохать, дай ... , а не так:
Я тебя блохну, а сам чо-нить расскажу, авось не ответить.
Вот блохни, и сам ... (успокойся, ничего не писячь).

Да, кстати, чой-то вы друг другу давно "галочек" за самый ответный ответ не ставили, пораб уже.

И ещё...
Чой-то из моего поста #47 выдернули славное слово "говнокод", а из "славного" поста #45 его не "дёрнули".
Какое-то однобокое "модерачество" у вас получается.

... Портится, портится ...
Но до двух мулей досчитывает. ...
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
23.01.2018, 01:38 50
Цитата Сообщение от Gazzi Посмотреть сообщение
А в какой прос(т)рации в данный момент находится наш таймер (в SubМашке) ?
Когда у нас в Васе объекты рожаются, "профессор" ты наш ...
Причем тут таймер? Для чего он нужен? Я просто вызываю cdecl функцию и все.
Цитата Сообщение от Gazzi Посмотреть сообщение
А ты вообще "паузу" собираешся" давать прожке во время "игровых циклов", иль хрен с ней,
пусть висит, пока я до лима досчитаю.
Бррррр.. Ты о чем? Ты хоть раз видел как игровой цикл устроен? Или тот же цикл обработки сообщений?
Цитата Сообщение от Gazzi Посмотреть сообщение
Да кому "повязёть" у того хто снясёть ? Не вижу никаких "вязений".
Да хоть лимон раз компилячь, дал паузу Васе - стек цел.
Нет.
Цитата Сообщение от Gazzi Посмотреть сообщение
Во пурга (отмазки, и т.д). Где ж ты таковое видовал в нашей Васе ?
Пургу несешь ты. Видел в отладчике.
Цитата Сообщение от Gazzi Посмотреть сообщение
Вася отдал стек, вася его примет в своём "кадре" (слово то какое отковырял, наверное из диссертации).
Как ты пишешь в раздел ассемблера и не знаешь что такое кадр стека? https://ru.wikipedia.org/wiki/... 0%B4%D1%80
Цитата Сообщение от Gazzi Посмотреть сообщение
Я тебе уже ... , почему ты его уронил. Возьми, API-шный тимер, да "роди" его в SubМане, если
тебе так охота.
Для чего мне таймер? Я просто хочу вызвать функцию и все, для чего мне таймер?
Цитата Сообщение от Gazzi Посмотреть сообщение
Вот он, Зав. Ортопедическим отделением выискался. Тот у нас на костылях, этот на протезах.
А сам на чём, на коляске штоль ?
Прям наверное Доцент, не иначе.
Откуда такой "решала" выискался, кому и шо тут кодить можно ?
Тебе видимо нравится в бане сидеть?
Цитата Сообщение от Gazzi Посмотреть сообщение
Ой, я щас расплачусь, глобус перестанет крутиться.
Да не плач, просто веди себя адекватно и соблюдай правила.
Цитата Сообщение от Gazzi Посмотреть сообщение
Вот прежде чем блохать, дай ... , а не так:
Я тебя блохну, а сам чо-нить расскажу, авось не ответить.
Вот блохни, и сам ... (успокойся, ничего не писячь).
Ну тебя заблокировали за нарушение правил форума, если что-то не устраивает, обращайся к администрации с жалобами.
Цитата Сообщение от Gazzi Посмотреть сообщение
Да, кстати, чой-то вы друг другу давно "галочек" за самый ответный ответ не ставили, пораб уже.
Да поставим, не беспокойся, когда нужно будет.
Цитата Сообщение от Gazzi Посмотреть сообщение
Но до двух мулей досчитывает. ...
Цитата Сообщение от The trick Посмотреть сообщение
в любой момент после очередной перекомпиляции код просто перестанет работать.
Как в примере Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
23.01.2018, 11:49  [ТС] 51
... Причем тут таймер? Для чего он нужен? ...
Нет, ты мне вообще скажи:
"Синяя" кнопка у тебя досчитывет до двух млн, иль нет ?
(А то мож только мне постоянно "везёт")

Не нравиться таймер, нажми сам 2 млн раз на кнопку (без таймера), досчитает до 2 млн иль нет ?
Сам же пишешь:
... Или тот же цикл обработки сообщений ...
Вот и "заряди" любой CallBack, и посмотри, досчитает иль нет.
(В т.ч. "синяя кнопка", и Таймер - те же CallBack-и).

... Для чего мне таймер? Я просто хочу вызвать функцию и все ...
Ну и вызови, например 100.000 раз. А если больше надо - то вызывай "пачками",
из CallBack-а например.

Третий раз спрашиваю ?
Восстанавливает наш Вася стек (после CallBack-а) за реальцами,
вызывающими 2 млн раз некую cdecl-фуню ?

- Не вижу никаких "вязений".
- Нет.
Где именно мне "повезло" ?

... пишешь в раздел ассемблера и не знаешь что такое кадр стека? ...
Эти заумности к чему ? Чем отличается "кадр стека" от просто "стека" (в нашем Васе) ?

... Тебе видимо нравится в бане сидеть? ...
Да лучше в бане "попариться", чем с "авторитетами" ... ("разговаривать").
Вот никак не могу "въехать":
С какой-такой радости "ковыряние" во вражеской DLL-ке - это костыли,
а "ковыряние" в TLB-хе - это ПЗБС ?
Это кто такой тут "решает", где мне "поковыряться" ?

И ещё упустил:
... Зайди на форум к сишникам ...
А они что у нас "Боги" кодинга ?
(Косячуть не меньше нашего).

---

Ладно, вопрос по asm-у:
(Хотя, не верю, что получу ответ).

В asm-е (x86) есть ли команды типа:
Assembler
1
2
mov EAX, [ адрес, находящийся например на 100 байт "назад" ]
jmp абсолютный_адрес
(Заранее спасибо).
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
23.01.2018, 13:00 52
Цитата Сообщение от Gazzi Посмотреть сообщение
Нет, ты мне вообще скажи:
"Синяя" кнопка у тебя досчитывет до двух млн, иль нет ?
(А то мож только мне постоянно "везёт")
Зачем отвечать вопросом на вопрос? Я у тебя спрашиваю конкретный вопрос для чего мне таймер?
Цитата Сообщение от Gazzi Посмотреть сообщение
Не нравиться таймер, нажми сам 2 млн раз на кнопку (без таймера), досчитает до 2 млн иль нет ?
Да зачем мне 2 млн раз нажимать на кнопку? Я тебе скинул примеры где вызов cdecl функции не работает, всё. Одно это разбивает все мифы о том что это работает через declare.
Цитата Сообщение от Gazzi Посмотреть сообщение
Вот и "заряди" любой CallBack, и посмотри, досчитает иль нет.
Ах ты какой хитрый, зачем мне в Callback заражать? Я хочу просто вызвать функцию, без всяких колбеков, мб мне еще RPC или APC посоветуешь для этого?
Цитата Сообщение от Gazzi Посмотреть сообщение
Ну и вызови, например 100.000 раз. А если больше надо - то вызывай "пачками",
из CallBack-а например.
слушаюсь (шучу). Я лучше сделаю правильно изначально без всяких костылей.
Цитата Сообщение от Gazzi Посмотреть сообщение
Восстанавливает наш Вася стек (после CallBack-а) за реальцами,
вызывающими 2 млн раз некую cdecl-фуню ?
В твоих примерах после вызова функции стек не восстанавливается. Возьми отладчик и проверь.
Цитата Сообщение от Gazzi Посмотреть сообщение
Где именно мне "повезло" ?
Повезло тебе в том что компилятор использовал EBP для адресации (это далеко не всегда так), повезло что не PUSH/POP между вызовами функции как в твоем же 36 посте.
Цитата Сообщение от Gazzi Посмотреть сообщение
Эти заумности к чему ? Чем отличается "кадр стека" от просто "стека" (в нашем Васе) ?
Какие заумности? В твоем примере обращение идет через указатель кадра стека (EBP), а регистр ESP (указатель на вершину стека) не восстанавливается после вызова функции.
Цитата Сообщение от Gazzi Посмотреть сообщение
Да лучше в бане "попариться", чем с "авторитетами" ... ("разговаривать").
Хорошо.
Цитата Сообщение от Gazzi Посмотреть сообщение
Вот никак не могу "въехать":
С какой-такой радости "ковыряние" во вражеской DLL-ке - это костыли,
а "ковыряние" в TLB-хе - это ПЗБС ?
Это кто такой тут "решает", где мне "поковыряться" ?
KISS
Тебе никто не запрещает извращаться как ты захочешь.
Цитата Сообщение от Gazzi Посмотреть сообщение
А они что у нас "Боги" кодинга ?
Ну ты был в ветке VB6, там никого не хотел слушать, пришел сюда - тоже самое, мб. сишники для тебя тогда в авторитете? Расскажи им про вызов функции через таймер.
Цитата Сообщение от Gazzi Посмотреть сообщение
jmp абсолютный_адрес
JMP FAR 0023:Absolute в режиме WOW64, в 32 битном режиме подставляешь свой CS
MOV EAX, address
JMP EAX
Цитата Сообщение от Gazzi Посмотреть сообщение
mov EAX, [ адрес, находящийся например на 100 байт "назад" ]
CALL lbl
lbl:
POP EAX
SUB EAX, 100
0
ФедосеевПавел
23.01.2018, 20:43
  #53
 Комментарий модератора 
Gazzi, вы не способны к обучению.

Напомню причины предыдущей блокировки:
Вы получаете наказание за нарушение следующих правил форума:
3.1 Уважительно относитесь к другим участникам форума.
5.2 Запрещено использовать нецензурные выражения в любом виде, оскорблять других участников форума, умышленно использовать выражения, противоречащие правилам русского языка, в том числе "олбанский" язык.
И тем не менее, после снятия блокировки продолжаете, как ни в чём не бывало
Цитата Сообщение от Gazzi Посмотреть сообщение
... Это называется костыли ... и так не нужно делать ...
Вот он, Зав. Ортопедическим отделением выискался. Тот у нас на костылях, этот на протезах.
А сам на чём, на коляске штоль ?
Прям наверное Доцент, не иначе.
Откуда такой "решала" выискался, кому и шо тут кодить можно ?
Цитата Сообщение от Gazzi Посмотреть сообщение
... тебе повезло ... в любой момент после очередной перекомпиляции ...
Да кому "повязёть" у того хто снясёть ? Не вижу никаких "вязений".
Да хоть лимон раз компилячь, дал паузу Васе - стек цел.
Цитата Сообщение от Gazzi Посмотреть сообщение
Во пурга (отмазки, и т.д). Где ж ты таковое видовал в нашей Васе ?
Я полагал, что вам нужна помощь, но по поведению вижу - только попререкаться.

Остановитесь! Вы набрали достаточное количество сообщений с нарушениями. Их хватит для вашей блокировки на длительный срок.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
24.01.2018, 22:38  [ТС] 54
… Gazzi, вы не способны к обучению…
Во те раз…
Сами же пишем про пунхт 3.1, и опять "утверждения"…
Ну вот откуда вам знать, к чему я способен, а в чём "дуб-дубом", вы шо, со мной "с одной бутылки пили",
иль в одном танке "за догонкой" ездили.
Вот какое мне в ответ сделать "утверждение"…
На форуме оказывается есть ещё и "педагоги" (ни разу правда ничему ни научившие в рамках текущей
темы, но зато успевшие "потыкать", что мне надо делать, а что не надо, где тут взлом, а где "излом",
"перелом" и т.д. И даже успевшие поставить очень важную "галочку").

… вижу - только попререкаться…
Во те два…
Выяснили целую кучу "важностей", в т.ч. и в закрытой "педагогами" (по непонятной причине)
предшествующей теме, а именно:

1). Внимательно смотришь в PE-заголовок, что бы понять куда тебе "влить" свой код, если места мало,
то ещё внимательнее смотришь в него-же, чтобы не сломав исходник "растопырить" себе место.
2). Нету другого способа "обнаружить себя" в чужом коде, кроме как вызвать "себе под нос" команду
CALL.
3). Так и не смогли выяснить, с какой-такой радости поголовно все фуни в EAX на входе имеют
свою точку входа, и можно ли в дальнейшем "опираться" на сей факт.
4). Попутно всё-таки "модернизировали" подопытную DLL-ку, и передали ёё "заказчику", при этом
он был рад практически до…(упора).
5). Выяснили, что наш "Вася-6" всё-таки "и так" поддерживает cdecl (если миллион раз не вызывать без
тайм-аута, не делать оптимизаций, и т.п.), или поддерживает cdecl при "многомиллионном" вызове,
если поковыряться в TLB (или "надеть шапочки" на функции внутри DLL), и остались каждый
при своём мнении.
6). Все команды MOV работают исключительно с абсолютной адресацией, и чтобы получить
"относительную" - надо ещё "попыхтеть".
7). Узнали про существование (но пока не "взяли на вооружение") такие две вещи как:
DispCallFunc и inline-assembler.

А вы говоришь "попререкаться"…
---

… Ах ты какой хитрый, зачем мне Callback заряжать? …
Ах ты какой не менее хитрый, зачем мне TLB ковырять, мне проще "шапочки" на все фуни одеть.
Есть DLL-ка, вот в ней и пусть "всё сидит", нефиг плодить "обёртки". А "виноваты" как-раз "Сишники",
ну только о себе думают, мать ёё.

… В твоих примерах после вызова функции стек не восстанавливается. Возьми отладчик и проверь…
А после всех завершений всех процедур в программе - он на месте.
(Ни разу в жизни не приходилось вызывать миллион раз без тайм-аута).

… компилятор использовал EBP для адресации (это далеко не всегда так) …
Ни разу на такое не "натыкался". Примерчика не "завалялось" ?

… В твоем примере обращение идет через указатель кадра стека (EBP) …
А что, мы можем вызвать фуню с одним EBP, а получить с другим ?

… Ну ты был в ветке VB6, там никого не хотел слушать…
Тоже самое: ты делай так, но не делай эдак. Я и там задавал конкретный вопрос:
Как получить "ЭТО",
А получал ответ:
Надо делать "ТО".
Можно я сам буду решать, так мне сделать, или эдак.

Да и вопрос не детский был, вот и не получил ответа, всего делов-то.
(А ведь где-то он наверное лежит-дожидается "на белом свете").
Зато был успешно послан к "Пупкам".
Те тока свою "бухгалтерию" и знают, больше нифига с них не "выдоишь" (или молчат, редиски).
---

(Все вопросы в "разрезе" Win32).

… mov EAX, [ адрес, находящийся например на 100 байт "назад" ] …
Ну это, как я понял, получается та же теорема: Вызови CALL себе "под нос".
Я просто подумал, мож чо пропустил "на эту тему" (лежащее как раз "под носом").

… в 32 битном режиме подставляешь свой CS …
Вот тут не допонял. А вообще какую нибудь пользу от CS можно "поиметь", и как можно
"привязать" сиё значение например к "абсолютности" адресов в конкретно взятой DLL-ке ?

Ну ещё выплыли: JMP, CALL.
А у этих возможны оба вида адресации (абсолютная, относительная,
или это я "не способен к обучению") ?

Заранее спасибо.
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
25.01.2018, 00:07 55
Цитата Сообщение от Gazzi Посмотреть сообщение
Ну вот откуда вам знать, к чему я способен, а в чём "дуб-дубом", вы шо, со мной "с одной бутылки пили", иль в одном танке "за догонкой" ездили.
Это видно по дискуссии.

Цитата Сообщение от Gazzi Посмотреть сообщение
Так и не смогли выяснить, с какой-такой радости поголовно все фуни в EAX на входе имеют
свою точку входа, и можно ли в дальнейшем "опираться" на сей факт.
Не всегда. Только объявленные через Declare.

Цитата Сообщение от Gazzi Посмотреть сообщение
Выяснили, что наш "Вася-6" всё-таки "и так" поддерживает cdecl (если миллион раз не вызывать без
тайм-аута, не делать оптимизаций, и т.п.), или поддерживает cdecl при "многомиллионном" вызове,
если поковыряться в TLB (или "надеть шапочки" на функции внутри DLL), и остались каждый
при своём мнении.
Нет, не поддерживает. И не обязательно миллион раз вызвать, достаточно один, см. пост 46.

Цитата Сообщение от Gazzi Посмотреть сообщение
Ах ты какой не менее хитрый, зачем мне TLB ковырять, мне проще "шапочки" на все фуни одеть.
Есть DLL-ка, вот в ней и пусть "всё сидит", нефиг плодить "обёртки". А "виноваты" как-раз "Сишники",
ну только о себе думают, мать ёё.
Я уже тебе написал:
Цитата Сообщение от The trick Посмотреть сообщение
Тебе никто не запрещает извращаться как ты захочешь.
Цитата Сообщение от Gazzi Посмотреть сообщение
А после всех завершений всех процедур в программе - он на месте.
Цитата Сообщение от The trick Посмотреть сообщение
тебе повезло что в процедуре идет обращение через указатель кадра стека и нет инструкций сохраняющих состояние и восстанавливающих его между вызовами.
Цитата Сообщение от Gazzi Посмотреть сообщение
(Ни разу в жизни не приходилось вызывать миллион раз без тайм-аута).
Любая программа содержит как минимум цикл обработки сообщений (для VB-шников он скрыт, но есть ситуации когда он нужен, а формы не нужны, тогда и придется делать его вручную). Циклы вообще неотъемлемая часть почти любой программы.

Цитата Сообщение от Gazzi Посмотреть сообщение
Ни разу на такое не "натыкался". Примерчика не "завалялось" ?
Ну как пример, тут - процедура DriverEntry. Вот еще один простой пример:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Option Explicit
 
Private Type POINTAPI
    x   As Long
    y   As Long
End Type
 
Private Declare Function Polygon Lib "gdi32" ( _
                         ByVal hDC As Long, _
                         ByRef lpPoint As Any, _
                         ByVal nCount As Long) As Long
Private Declare Function cdeclFunj Lib "Moy.dll" ( _
                         ByRef B As Long) As Long
 
 
Private Sub Form_Load()
    Dim tPoints()   As POINTAPI
    
    AutoRedraw = True
    
    FillPoints tPoints(), 7
    
    Polygon Me.hDC, tPoints(0), UBound(tPoints) + 1
 
End Sub
 
Private Sub FillPoints( _
            ByRef tPoints() As POINTAPI, _
            ByVal lNumOfPoints As Long)
    Dim lIndex      As Long
 
    ReDim tPoints(lNumOfPoints - 1)
    
    ' cdeclFunj 1 - вызов cdecl функции валит приложение
    
    For lIndex = 0 To lNumOfPoints - 1
        
        tPoints(lIndex).x = Cos(lIndex / lNumOfPoints * 6.2831) * 100 + 100
        tPoints(lIndex).y = Sin(lIndex / lNumOfPoints * 6.2831) * 100 + 100
 
    Next
    
End Sub
После компиляции обращение к локальным переменным идет через регистр ESP, соответственно после вызова твоей cdecl функции, приложение падает на выходе из функции т.к. адрес возврата смещается, вопреки всем твоим мифам о работе cdecl функции через Declare. Функция вызывается 1 раз:
Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB


Цитата Сообщение от Gazzi Посмотреть сообщение
А что, мы можем вызвать фуню с одним EBP, а получить с другим ?
Нет. Просто EBP может использоваться для другой цели и вообще необязательно EBP можно использовать любой другой регистр, просто всегда делается через этот регистр. Если же обращение идет через ESP тогда любой неправильный cdecl вызов будет фатален.

Цитата Сообщение от Gazzi Посмотреть сообщение
Как получить "ЭТО",
А получал ответ:
Надо делать "ТО".
Можно я сам буду решать, так мне сделать, или эдак.
Хм... А как нужно было?

Цитата Сообщение от Gazzi Посмотреть сообщение
Вот тут не допонял. А вообще какую нибудь пользу от CS можно "поиметь", и как можно
"привязать" сиё значение например к "абсолютности" адресов в конкретно взятой DLL-ке ?
Это сегментный регистр кода, в 32 битном режиме он используется при формировании линейного адреса. В WOW64 всегда равен 0x23, если нужно переключится в 64 битный режим просто "прыгаешь" на 0x33 сегмент, тем самым изменяешь значение регистра CS который после этого указывает на другой дескриптор (№6), который переключает процессор в 64 битный режим. "Прыжок" обратно переключит обратно в 32 битный режим.
Второй момент - для чего нужен именно абсолютный адрес?

Цитата Сообщение от Gazzi Посмотреть сообщение
А у этих возможны оба вида адресации (абсолютная, относительная,
или это я "не способен к обучению") ?
Оба. JMP FAR, CALL FAR
Вложения
Тип файла: rar cdecl_crash.rar (10.3 Кб, 3 просмотров)
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
25.01.2018, 12:30  [ТС] 56
… Это видно по дискуссии …
Ну, мне тоже, много чо видно, ну я ж не квакаю у кого скока извилин "осталось".

… все фуни в EAX на входе имеют свою точку входа …
… Не всегда. Только объявленные через Declare …
А вообще, на это можно "опираться" в дальнейшем. В WinAPI никакой "закон" не придумали,
чтоб при вызове фуни - закидывать в EAX её же EntryPiont.
("Придумали" же - восстанавливать кое какие регистры при возврате).
Другие компиляторы тоже так поступают ?

… Я уже тебе написал:
Тебе никто не запрещает извращаться как ты захочешь …
Опять.
Ну вот кто у нас такой "решала" ? Что нельзя в DLL-ку лазить ?
Чем "мой" метод хуже "твоего", я никак въехать не могу ?
Ты что, опрос проводил, с "Билликом"(Дебиликом) "с одной бутылки квасил, и на одном танке
в баню ездил" ?
По каким критериям мы "фишки раздаём" ?

… тебе повезло …
Да шож я такi везучий-то (пiду в СпiртЛото сыграю). Вот, не иначе - Опять вязуха:

(См.Вложения)

Извини, но у меня нет других слов:
Мы долго ещё "пургу поносить" будем на одну и туже тему ?
Я те шо, мальчик-отгадайчик шоль, твои "домашние задания" решать ?
(Ну говорю-ж: "Педагоги" мать ёё).

… Хм... А как нужно было? …
Ну ты ж не дал там ответа, а к "пупкам" не забыл послать…
---

… польза от CS …
Я имел ввиду:
Высчитать абсолютный адрес (на начало модуля, на начало всей проги в памяти - на header например,
да на что-нибудь "любое", но внутри текущей программы).
Или "останавливаемся" на "CALL себе под нос", и не "рыпаемся ?

… JMP FAR, CALL FAR …
Поизучаю.

Кстати: "О птичках".
… Процедура DriverEntry …
Нигде не "заваялся" некий "пустой" драйвер, например NT. Тока штоб "вставал" и можно
даже не удаляться. А то у меня что-то не выходит "каменный цветок".
Никак не могу Сишный проект "собрать" (мать иих).
Или лучше в "драйверный" отдел перелезть
(там мы ещё "не арались" (шучу)).

Заранее спасибо.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
25.01.2018, 12:31  [ТС] 57
Вложение:
Вложения
Тип файла: rar cdecl_NE_crash.rar (10.6 Кб, 4 просмотров)
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
25.01.2018, 13:34 58
Цитата Сообщение от Gazzi Посмотреть сообщение
Ну, мне тоже, много чо видно, ну я ж не квакаю у кого скока извилин "осталось".
"квакаешь"
Цитата Сообщение от Gazzi Посмотреть сообщение
А вообще, на это можно "опираться" в дальнейшем. В WinAPI никакой "закон" не придумали,
чтоб при вызове фуни - закидывать в EAX её же EntryPiont.
Это не имеет смысла, поэтому не придумали.
Цитата Сообщение от Gazzi Посмотреть сообщение
Другие компиляторы тоже так поступают ?
Просто при вызове Declare функции в первый раз происходит вызов LoadLibrary и GetProcAddress и адрес функции сохраняется в дескрипторе функции, далее возвращенное значение (оно как известно в EAX) используется в инструкции JMP EAX, поэтому ты его получаешь.
Цитата Сообщение от Gazzi Посмотреть сообщение
Опять.
Ну вот кто у нас такой "решала" ? Что нельзя в DLL-ку лазить ?
Чем "мой" метод хуже "твоего", я никак въехать не могу ?
Ты что, опрос проводил, с "Билликом"(Дебиликом) "с одной бутылки квасил, и на одном танке
в баню ездил" ?
По каким критериям мы "фишки раздаём" ?
Ну как минимум лицензионное соглашение и авторские права. Ну а вообще кто решает что микроскопом нельзя забивать гвозди? Конечно можно, но есть молоток.
Цитата Сообщение от Gazzi Посмотреть сообщение
Да шож я такi везучий-то (пiду в СпiртЛото сыграю). Вот, не иначе - Опять вязуха:
(См.Вложения)
Извини, но у меня нет других слов:
Мы долго ещё "пургу поносить" будем на одну и туже тему ?
Я те шо, мальчик-отгадайчик шоль, твои "домашние задания" решать ?
(Ну говорю-ж: "Педагоги" мать ёё).
Да ты что, хочешь меня надурить что ли? Ты зачем оптимизации поотключал?
Цитата Сообщение от Gazzi Посмотреть сообщение
Ну ты ж не дал там ответа, а к "пупкам" не забыл послать…
Дал.
0
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 145
26.01.2018, 09:49  [ТС] 59
… "квакаешь" …
Ну пущай будет "квакаю" (лишь бы "делу не мешало")

… лицензионное соглашение …
Да ежли повнимательнее "Васю" почитать, так мы и им пользоваться не можем.

… микроскоп …
А если микроскоп "для китайских" глаз сделан ? Вот не влезають туда мои зени, что тогда делать?
Они его для своих "узкоглазых" сделали (как и ту DLL-ку, для своих "узкопрофильных").
Вот тогда можно и гвоздь забить.
А можно отремонтировать/модернизировать для "своих" (что и было сделано с DLL).
А вот кстати если микроскоп отремонтировать/модернизировать, "права микроскопа" будут нарушены ?

… Да ты что, хочешь меня надурить что ли? Ты зачем оптимизации поотключал? …
Даю встречный вопрос:

Да ты что, хочешь меня надурить что ли? Ты зачем оптимизации повключал?

(Порылся в "хламе").
Древняя "шпора" (аж от 25.12.1998г) чой-то там глаголит: при cdecl-е иногда может понадобиться
отключить оптимизеры (речь только про главную стр., так что все "дополнительные" (наверное) можешь
повключать). И как раз "базариться" что это может понадобиться в циклах. (Глубже тогда не изучал,
да и щас неохота).
Вот с тех пор и до 09.01.2018 мне ни разу "это" не понадобилось (пока кое-кому не взбрело лимон раз
фуню вызвать).

… Дал …

Как найти указатель в запущенной *.exe на модуль, который хз как называется, но в котором имеется
публичная фуня по имени Moj_Funj из объектной DLL-ки, подключенной к этому-же *.exe ?

Я получил ответ на этот вопрос ???
№ поста пжлста.

Добавлено через 1 час 10 минут
Кстати "Дельное" предложение поступило с "местного" уровня:

Не "ломать" старые указатели на "родные" фуни. А дописать столько же новых, но указывающих
на "шапочки". "Обозвать" их с каким-нибудь префиксом/постфиксом (как API, A-фуни, W-фуни).

Мало ли взбредёт из двух "модулей" на разных языках вызывать одно и то-же.
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
26.01.2018, 12:00 60
Цитата Сообщение от Gazzi Посмотреть сообщение
делу не мешало
Мешает
Цитата Сообщение от Gazzi Посмотреть сообщение
Да ежли повнимательнее "Васю" почитать, так мы и им пользоваться не можем.
Процетируй
Цитата Сообщение от Gazzi Посмотреть сообщение
А если микроскоп "для китайских" глаз сделан ? Вот не влезають туда мои зени, что тогда делать?
Они его для своих "узкоглазых" сделали (как и ту DLL-ку, для своих "узкопрофильных").
Ересь. Что значит "влезають туда мои зени"? VB6 прекрасно вызывает cdecl функции "из коробки" через TLB.
Цитата Сообщение от Gazzi Посмотреть сообщение
Да ты что, хочешь меня надурить что ли? Ты зачем оптимизации повключал?
Они там по умолчанию включены если что. Второй вопрос - много ли ты видел программ скомпилированных без оптимизаций? Кому нужна медленная неэффективная программа? Третий вопрос - я могу тебе сейчас продемонстрировать контрпример где и без оптимизаций это не будет работать. Когда говорят что и "так работает", значит это работает всегда, так почему тогда это не работает в моих вышеприведенных примерах? Вот я скинул примеры в которых это работает именно всегда, без разницы включил ты оптимизации или нет, вызываешь ли ты в цикле или нет. Вот я скинул другой пример, где вызов cdecl функции вызывает некорректную работу (на некоторых машинах может быть креш), несмотря на то включил ты оптимизации или нет.
Цитата Сообщение от Gazzi Посмотреть сообщение
Древняя "шпора" (аж от 25.12.1998г) чой-то там глаголит: при cdecl-е иногда может понадобиться
отключить оптимизеры (речь только про главную стр., так что все "дополнительные" (наверное) можешь
повключать). И как раз "базариться" что это может понадобиться в циклах. (Глубже тогда не изучал,
да и щас неохота).
Ересь, то откуда ты это взял - полная чепуха.
Цитата Сообщение от Gazzi Посмотреть сообщение
Как найти указатель в запущенной *.exe на модуль, который хз как называется, но в котором имеется
публичная фуня по имени Moj_Funj из объектной DLL-ки, подключенной к этому-же *.exe ?
Ты тему перечитай, авось придет просветление.
Цитата Сообщение от Gazzi Посмотреть сообщение
Я получил ответ на этот вопрос ???
№ поста пжлста.
Вопрос был:
Цитата Сообщение от Gazzi Посмотреть сообщение
Как получить то, что возвращает нам наша дорогая и недокументированная :
ObjPtr
Но только из WinAPI ???
(или ещё откуда) ?
Ответ - #14
Вложения
Тип файла: rar cdecl_incorrect.rar (12.1 Кб, 4 просмотров)
0
26.01.2018, 12:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2018, 12:00
Помогаю со студенческими работами здесь

string в char* для вызова функции из dll
Для вызова функции из dll нужно передать 3 параметра в формате char* public...

Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?
Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?...

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include <iostream> #include <conio.h> using namespace std; int n, *c; void fun(int a,...

Не понятно, как сделать аннотации для вызова
Пример : Есть класс Parent и два дочерних : Child1 и Child2 public class Parent { } ...

Вызываю dll (написанную на vc++2008) из Fasm. Через 40 секунд вылет из программы.Без вызова dll из Fasm программа не вылетает.
Программа на vc++2008: #include "MathFuncsDll.h" #include <stdexcept> using namespace std; ...

Сделать класс с статическими элементами для подсчета вызова функции
Помогите сделать класс с статическими элементами для подсчета вызова функции, плиз.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru