@Linda-chan

Тег vb6 в блоге Linda-chan

Linda-chan

Кстати о. Есть ещё один способ получить даже более вдохновляющие результаты. Однажды мне потребовалось написать функцию, которая берёт байтовый буфер и форматирует его как в Hex просмотрщиках. Через строку всё делается очень просто, но очень долго. Всякие оптимизации не давали прямо радикального ускорения. Поэтому я написала функцию, которая сначала вычисляет размер байтового буфера, в котором будет содержаться ANSI строка, а потом по байтикам собирает эту самую строку. Быстродействие в результате такое, что даже реально большие массивы (по паре сотен метров) форматируются за считанные секунды. Главный минус – читается это не очень хорошо, нужно напрягать мозг после перерыва, чтобы понять, что происходит. Я хотела сделать такое же, но для генерации UUE, но до сих пор духа не хватает, хотя вариант со строками написала быстро и даже оптимизировала в итоге.

Linda-chan

В последнее время я начала присматриваться к быстродействию своих программ в части операций с коллекциями и строками. Одну библиотеку радикально оптимизировала, например, применив новый для себя метод перечисления сразу двух коллекций одновременно (функциями из MSVBVM60.DLL, которые на самом деле стоят за For-Each, но избавляют от прямого взаимодействия с IEnumVARIANT). А началось с того, что меня до ужаса достала программа, парсящая логи ownCloud. Она сначала читает из файла идентификаторы обработанных сообщений в логах, потом парсит необработанные сообщения в файле лога, делая из JSON'ов в JSON'ах читаемые сообщения, сохраняет их в файлы сообщений и снова записывает файл с обновлёнными идентификаторами. И пока всё это продолжается, скрытое окно программы не обрабатывает сообщения, и всякие проводники, рассылающие широковещательные сообщения, вешаются при попытке открыться. Ранее я уже в программе снижала приоритет, чтобы не так грузило процессор. В этот раз я решила напихать DoEvents между обработкой JSON'ов, кою считала основной проблемой. Но оказалось, что загрузка списка занимала меньше секунды, парсинг – меньше секунды, сохранение списка – две-три минуты. Да, там была коллекция, которая долго перечислялась через индекс, а текст наращивался простым «TXT = TXT & Item». Поэтому я сделала так чтобы перечисление шло через «For Each», а текст собирала через Mid() в заранее выделенную строку, длину которой вычисляла отдельным перечислением. В результате программа вместо нескольких минут работает в районе секунды. Можно сказать, вдохновляющий результат!

Linda-chan

The following table contains possible examples of msvbvm60.dll being misused. While msvbvm60.dll is not inherently malicious, its legitimate functionality can be abused for malicious purposes.

https://strontic.github.io/...FD729C662C8DB1E.html
Как? Написанием вредоносной программы на VB, которая по дизайну будет использовать эти функции?

Linda-chan

Reverse engineering VB binaries will often involve reverse engineering VB internals for various VB APIs, a task dreaded by many. The entry point of a VB program diverts from the typical C/C++ or even Borland Delphi binary. There is no mainCRTStartup or WinMainCRTStartup function that initializes the C runtime and calls the developer defined main or WinMain function.

https://blog.talosintellige...cally-loaded-api-in/ https://blog.talosintelligence.com/discovering-dynamically-loaded-api-in/#%3a~%3atext=Reverse%20engineering%20VB,or%20WinMain%20function.
Очевидное невероятное: программы, написанные на VB используют рантайм VB, а не рантайм C/C++, и не вызывают функции из рантайма C/C++!

Linda-chan

Не, я знаю, что For Each, не смотря на использование варианта, работает быстрее, чем просто For с индексом, но чтобы настолько... Коллекция, 240 тысяч элементов типа Long, с которым в цикле производятся действия (коллекция перегоняется в массив). For с индексом пережёвывает коллекцию за тридцать-сорок секунд. For Each проносится по коллекции за 0.12 секунд.

Linda-chan

Я тут пишу кое-что, и снова столкнулась с такими мерзкими, но неизбежными вещами, как байтовые буферы, в том числе запихнутые в строки. Всвязи с чем два наблюдения.
1. У VB нет встроенных механизмов, чтобы скопировать часть одного байтового буфера в другой. CopyMemory().
2. Строки в VB – юникодные, но могут быть ANSI, если хорошо попросить. Понять, в каком формате строка, очень трудно, но сам VB знает, что там внутри.

Linda-chan

Оказалось, что неразрывный пробел считается валидным символом в именах в VB6. Тоесть можно делать переменные, функции, константы с именами вида «Do It Already()».

Linda-chan

Пилю модуль со строковыми функциями в стиле VB6. В качестве упражнения и безболезненного погружения. Сначала хотела стандартный класс переопределить, но потом решила не делать этого. Собственно, узнала кое-что новое про сами VB функции. Например, в Replace() есть параметр Start, который по идее только сообщает с какого символа начинать поиск и замену, а на деле (и это задокументировано!) срезает всё, что было до этого символа. Я прямо в шоке, всегда думала, что активно использую этот параметр, ан нет, видать, ни разу не использовала.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.