last day (27 days later) » 

4:43 PM
4
Q: Некорректная работа перехватчика нажатых клавиш (кейлоггер) C#

ANU CHEEKI BREEKIПерерыл весь интернет в попытках написать перехватчик нажатых клавиш, кейлоггер то есть (в познавательных целях, естественно). Во всех статьях встречался один и тот же код, собственно с его примера я и писал. Проблема вот в чем. На моем компьютере и на паре других компьютеров (на ноутбуках, если...

 
Эта проблема Windows была проблемой в Windows 95. Ваши знания немного устарели, с того времени поменялось практически всё, причём по нескольку раз.
 
Может стоит проверять Marshal.GetLastWin32Error?
@ANUCHEEKIBREEKI, откуда бы он взял программы с админскими правами, если рядом админов нет и учётка не админская? А так да, хук должен работать только в программах того же пользователя.
 
32-битные хуки не будут работать для 64-битных процессов и наоборот. Ну и вы не влезете к другому пользователю, если вы не администратор.
 
@VladD, разве? А пунтосвитчер как работает?
 
@Qwertiy: Две dll-ки и два хука?
 
4:43 PM
@VladD, а система не делает сама общую очередь хуков? Они же на уровне системы, а не процесса.
 
@Qwertiy: Насколько я понимаю, хук — это внедрение dll в чужой процесс. Внедрить dll в процесс другой битности принципиально невозможно.
@Qwertiy: У меня ссылка приводит в оглавление форума. // Ага, заменил &amp на &, теперь открылось.
 
@VladD ага
я уже всежую выложил
 
@Qwertiy Угу.
Документация вот пишет:
hMod [in]

    Type: HINSTANCE

    A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
У ТС: LoadLibrary("user32.dll").
Внимание, вопрос: ЧЁ????
 
5:17 PM
@VladD хм.. там же надо хэндл Assembly класть?
то что она не dll вроде ни на что не влияло
(это именно про .net)
 
@Qwertiy ну, по идее хэндл той dll-ки, в которой процедура. фиг его знает.
> However, you cannot implement global hooks in Microsoft .NET Framework except low level hooks. To install a global hook, a hook must have a native dynamic-link library (DLL) export to inject itself in another process that requires a valid, consistent function to call into. This requires a DLL export, which .NET Framework does not support. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically.
 
@VladD поставили хук из using'а?? т. е. сработает он уже после вызова dispose? ли я чего-то не понимаю?
 
Я не знаю, если честно, в чём отличие low level hook от других.
 
@VladD а это неправда
 
@Qwertiy Там wiki, можно отредактировать и исправить.
 
5:22 PM
только надо обеспечить, чтобы сборщик мусора не решил потаскать то, что передал в winapi
 
@Qwertiy это там написано тоже
 
на gotdotnet была классная тема по этому поводу
но те форумы прикрыли :(
 
> Tips & Tricks:
>
> Remember to keep the HookProc delegate alive manually, such as using a class member as shown in the example below, otherwise the garbage collector will clean up your hook delegate eventually, resulting in your code throwing a System.NullReferenceException.
 
> This requires a DLL export, which .NET Framework does not support.
 
ну да
 
5:23 PM
а это совсем неправда
 
почему же? я не могу экспортировать cdecl-функции
хм, почитаю, момент
 
@VladD на cdecl что, свет клином сошёлся?
там не cdecl, но вызов такой функции из нативного кода работает
 
@Qwertiy ну, окей, ручная правка il-кода. но это всё равно неподдерживаемый сценарий — например, что делать с указателями?
 
с какими?
 
ну, если моя .net-функция получает на вход System.String
как будет выглядеть нативная сигнатура?
 
5:26 PM
@VladD но ведь IL поддерживает, и запуск из native работает, т. е. они предусмотрели запуск jit-компиляции или что там ещё при вызове из нативного кода
 
Ну, фичу при некоторых условиях можно пинками заставить работать != фича работает.
 
@VladD там вроде тот же комплект возможностей, что и для импорта
хотя не уверен
 
То есть при некоторых условиях — да. Но кто, например, проинициализирует ExecutionEngine, или как там называется бутстраппер .NET-рантайма? Кто подключит джиттер?
Это произойдёт автоматически? о_О
Не должно, по идее.
 
rsdn.ru/forum/dotnet/3174696.all - тут есть что-то со строками
@VladD а почему не должно?
переходник, который сам в native-коде вполне мог бы это дело проверить
и запустить. чего там ему не хватает
using System;
using System.Runtime.InteropServices;

namespace ClassLibrary2
{
    public class Class1
    {
        // для типа int (in,out)
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void  funForInt(ref int val)
        {
            val += 10;
        }

        // для типа string (out)
        [System.Reflection.Obfuscation(Feature = "DllExport")]
        public static void funForOutString([Out,
           MarshalAs(UnmanagedType.LPWStr)] out string str)
 
@Qwertiy Не верится что-то. Потому что при компиляции в этом случае должны быть проверки, которые в нормальных условиях не нужны.
 
5:30 PM
@VladD какие проверки, при какой компиляции?
ничего не понял
он же по il-команде создаёт переходник для вызова функции нативным кодом - этот переходник может делать что угодно
 
@Qwertiy Ну, как выглядит IL-процедура? Там просто IL-код, а в начале стаб, который запускает JITter
 
в какое место тебе захотелось при компиляции вставить лишние прверки?
@VladD но нативный код не видит il-процедуру
 
JITter заменяет IL-код на нативный и делает jump на начало
 
он видит нативный переходник
 
ну да. а откуда возьмётся нативная процедура в dll?
 
5:33 PM
то, что увидит нативный код в таблице экспорта, не обязано быть той же функцией, которую увидит git
 
@Qwertiy хм. если посмотреть dumpbin'ом, я его не видел
 
декомпиляцию не пропустил с изменением il?
 
хотя специальные заклинания могут его добавить, да
 
без неё не работает
одного атрибута недостаточно
одного изменения il - вроде тоже
 
атрибут там вообще левый, он по идее не нужен. он просто отключает обфускацию
 
5:34 PM
нужно оба действия
@VladD да вот что-то мне помнится, что не левый
и такое значение - вряд ли совпадение
 
@Qwertiy хм, странно. я думал, что это только для обфускаторов (которыми обычно никто не пользуется)
 
кто-то решил, что экспорт - это тоже обфускация?)))
 
неужели атрибуты для обфускатора влияют на кодогенерацию?
хм :)
 
не помню, я тогда проверял - вроде не взлетело
хотя, а вдруг уже забыл...
или накосячил что
@VladD а может, нативный переходник по этому атрибуту ищет, что же ему вызывать?
 
@Qwertiy чёрт его знает :) поэтому и неподдерживаемый сценарий
 
5:38 PM
> A string value that is recognized by the obfuscation tool, and which specifies processing options. The default is "all".
возможно, генератор переходников - сам обфускатор - не смогли его лучше встроить в этот механизм?
 
> Applying this attribute does not automatically obfuscate the code entity to which you apply it. Applying the attribute is an alternative to creating a configuration file for the obfuscation tool. That is, it merely provides instructions for an obfuscation tool.
обфускатор — это ж фигня, которая переименовывает процедуры и тому подобное
чтобы рефлектором дольше вскрывать было
 
@VladD а в более общем плане - которая влияет на генерацию кода
 
@Qwertiy ну, это ж постпроцессор, в нормальном случае он не участвует в компиляции
 
почему ты думаешь, что у обфускатора нет возможности повлиять на таблицу экспорта?
 
@Qwertiy есть, наверное. но его ж должен кто-то ещё запустить
в стандартном тулчейне его нет
 
5:41 PM
ну так разве его нужно явно запустить?
 
@Qwertiy да, разумеется
 
ладно, ты там не попробовал ещё?
 
@Qwertiy не, я вообще выключаю комп и сваливаю с работы
 
а, ok
 
попробую дома
 
5:41 PM
:)
свежая фишка поиграться :D
 
дааааааа!
(свалил)
 
вообще, я так когда-то плагин для хотел сделать, потом забросил
подом подумал о своём менеджере закачек
но что-то не особо начал делать
 
 
3 hours later…
8:51 PM
@VladD, загляни в вопрос по плюсам:
2
Q: перегрузка операторов >> и << в шаблонном классе как дружественных функций

Kirillconst size_t SIZE =4; это мой класс. template<typename T> class Matrix { private: T arr[SIZE][SIZE]; friend ostream& operator << (ostream &, const Matrix<T> &); friend istream& operator >> (istream &, Matrix<T> &); void initialize();// функция которая заполняет матрицу как ...

 
9:20 PM
@Qwertiy О, типичные плюсы :) А что с ним не так?
 
@VladD почему там нужен шаблон?
я же делаю таким образом оператор вывода любой матрицы дружественным для любой другой матрицы?
т. е. нет привязки, что вывод ini'овой матрицы дружественен только int'овой матрице
а можно ли сделать, чтобы эта всязь была?
@VladD
 
@Qwertiy «Потому что плюсы проектировали, хм, добрые и хорошие люди» покатит в качестве ответа?
Нет? Сейчас гляну.
 
gj[j;t
похоже
@VladD не взлетело
 
Но вот мотивацию — почему одно означает то, а другое нет — я не знаю. Она в плюсах всегда очень странная (и основывается на дырах в дизайне языка).
Оно хочет friend istream& operator >> <> (...), что ли?
или template<> friend ...?
приходится угадывать, логику за этим я не чувствую
 
@VladD template я уже угадал
пустые скобки - это ж спецификация шаблона
типа где-то объяви, а потом используй
хм.. а может он и прав
я ж хочу спецификацию дружественной сделать
блин.. дошло
 
9:35 PM
с предварительным объявлением покатило
 
ага, можешь там ответ запостить :)
> operator << <>
 
@Qwertiy Не, это твоя идея.
 
жутковато выглядит :D
 
угу
 
я про это сначала думал, но решил, что это что-то не то
а теперь дошло, что всё он верно хотел
 
9:37 PM
@Qwertiy а какая логика всего этого?
 
ты объявляешь дружественной спецификацию шаблонной функции
один из возможных типов, а именно T
а остальные - недружественные
это ж спецификация
 
так, а почему нужно предварительное объявление?
почему нельзя прямо внутри?
 
как раз то, что нужно
 
а, потому что это спецификация, а ему нужна общая функция где-то
тьфу
 
что нельзя внутри?
 
9:39 PM
ну, я не понимал, почему нельзя обойтись без предварительной декларации
 
эм.. это я не проверял
вероятно, для спецификации шаблона надо, чтобы этот шаблон существовал?
логично вроде?
 
угу, именно так
если бы мы делали friend'ом весь шаблон, по идее можно было бы объявить его внутри
но мы делаем friend'ом только одну его спецификацию
 
а весь шаблон сделал я в своём ответе
ну что, не надумал ответ запостить?
 
окей, запощу
готово
 
10:00 PM
@VladD, а как там изучение экспортируемых функций?
 
10:34 PM
@Qwertiy Уже завтра, на такое надо со свежими обезяньими мозгами
Редактирование IL-кода — это жесть, конечно
 
11:27 PM
(это я в положительном смысле, есличё)
 

  last day (27 days later) »