Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    puz27, по координатам лучше не кликать, так как разрешение экрана может быть иным и всё собьётся.
    В вашей ситуации скрипт отрабатывает раньше чем появляется окно.
    Используйте WinWait  или WinWaitActive

    Всего записей: 1645 | Зарегистр. 01-05-2006 | Отправлено: 18:13 08-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как изменить скрипт (патчер) так, чтобы он обрабатывал несколько строк с заменой (а не только одну).
     
    Если сделать так, например:

    Код:
     
    $sFind = "4D53465420352E30" ;
    $sReplace = "534D4153484C5921" ;
     
    $sFind = "123" ;  
    $sReplace = "321" ;  
     

     
    То заменится только последняя (hex 123 - 321), а первая проигнорируется, нужно в общем несколько строк находить и заменять.
    И еще подскажите как сделать проверку, если есть уже пропатченные строки, то не патчить.
     
    Сам код скрипта:
     

    Код:
    $sInFile = @SystemDir & "\dhcpcsvc.dll" ; Original in file
    $sFind = "4D53465420352E30" ; MSFT 5.0 Original hex to find
    $sReplace = "534D4153484C5921" ; SMASHLY! New hex to replace
    $sOutFile = @ScriptDir & "\New_dhcpcsvc.dll" ; New edited out file
     
    _BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)
     
    Func _BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)
         Local $FO, $FR
         $FO = FileOpen($sInFile, 16) ; Open the file in binary read mode
         $FR = FileRead($FO) ; Read the opened file into a variable
         FileClose($FO) ; Close the opened file now we've read it
         $FR = StringReplace($FR, $sFind, $sReplace, 1); find and replace the hex string
         $FO = FileOpen($sOutFile, 18) ; Open a new empty file in binary write mode
         FileWrite($FO, $FR) ; Write the data to the new opened file
         FileClose($FO) ; Close the newly created file.
    EndFunc


    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 07:37 15-08-2014 | Исправлено: thejustsoul, 07:42 15-08-2014
    sewell



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul
    Так а несколько раз раза вызвать функцию _BinaryReplace с разными аргументами не подходит разве  в такой ситуации?

    Всего записей: 833 | Зарегистр. 06-07-2005 | Отправлено: 12:30 15-08-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul,
    ИМХО, опасно заменять бинарные данные строковыми функциями. Есть такая библиотека: Binary UDF.
    Вот пример:
    Код:
    #include <Binary.au3>
     
    $bBin = Binary('0x04D5314D53'); 04 D5 31 4D 53
    $sFind = '4D53'; 4D 53
    $sReplace = '534D'; 53 4D
    $sRes = StringReplace($bBin, $sFind, $sReplace, 1)
    ConsoleWrite('StringReplace: ' & $sRes & @LF)
    ;~ 0x0534D14D53    --> 05 34 D1 4D 53
     
    $bRes = _BinaryReplace($bBin, Binary('0x' & $sFind), Binary('0x' & $sReplace), 1)
    ConsoleWrite('_BinaryReplace: ' & $bRes & @LF)
    ;~ 0x04D531534D    --> 04 D5 31 53 4D

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 13:11 15-08-2014 | Исправлено: madmasles, 13:25 15-08-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    опасно заменять бинарные данные строковыми функциями.

    Согласен.
    Но можно и так :
     

    Код:
    $vIniFile = FileRead( @SystemDir & "\dhcpcsvc.dll")
    FileDelete(@ScriptDir & "\New_dhcpcsvc.dll")
    $vIniFile=StringReplace($vIniFile,"MSFT 5.0","SMASHLY!")
    FileWrite(@ScriptDir & "\New_dhcpcsvc.dll",$vIniFile)

     
    Несмотря на то, что файл читается в текстовом режиме, все прекрасно работает, а в последней версии работает даже StringRegExpertReplace (ранее не воспринимался NULL)

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:39 15-08-2014 | Исправлено: NIKZZZZ, 13:55 15-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я лишь поверхностно знаком с AutoIT, да и с другими языками. Этот скрипт нагуглил сегодня и он работает, правда заменят только одну строчку, а не все нужные.
    sewell
    Это как самый простой, но не оптимальный вариант с дублированием функции (наверно нужен цикл, если такое есть в AutoIT, чтобы брал переменные (строки) и прогонял по файлу с заменой, потом сохранял на диск уже готовый, но я не смогу написать этот цикл, может поможете?)..
     
    madmasles
    Что значит опасно? Не совсем понимаю о чем вы и как ваш код мне поможет, мне главное чтобы работало.. и желательно оптимально и быстро.
     
    Патчер нужен для простого - найти в файле HEX последовательность (она как unicode-строка), и занулить ее и таких строк несколько по всему файлу. Находил еще пост, где переводили HEX в строку и заменяли (т.е. не поиск по HEX и замена, а поиск по строке > HEX, и замена строки или как-то так в общем).
     
     
    Надеюсь не путано написал, значение которое нужно заменить я нахожу так, открываю в HEX редакторе, вручную нахожу unicode-строку (нужную) и выделяю ее HEX значение, убираю пробелы и вставляю в Поиск Замена в том скрипте, оно находит и заменяет, но не все строчки, а только одну (видимо которая последняя $sFind = , $sReplace = , а мне нужно несколько.

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 14:04 15-08-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul

    Цитата:
    открываю в HEX редакторе, вручную нахожу unicode-строку (нужную) и выделяю ее HEX значение, убираю пробелы и вставляю в Поиск Замена в том скрипте,

    В этом и ошибка, если строка unicode из нее нельзя ничего убирать, к стати, это не пробелы, а символы с кодом 0x00, в результате у тебя происходит одна замена (там, где эта строка в ANSI), а где UNI замены не происходит.
    Делай две замены, отдельно для ANSI и UNI .

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 14:30 15-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Все правильно заменяет, я пробовал, а пробелы убрал специально, т.к. с пробелами замены не происходит, конкретно в этом скрипте. Заменяется строка последняя (из двух например, которые указал в скрипте), а не сначала первая, потом вторая (выше писал), происходит переопределение переменной что ли, вот и спросил про цикл..
    А да, забыл дописать, ничего из строки не удаляется, просто зануливается таким же кол-вом 00 что и в искомой строке (проверял в HEX после замены, 0x00 (или 00) символами заменяется-затиратся).
     
     
    А еще, если дублировать функцию, то получается это:

    Код:
     
    ---------------------------
    AutoIt Error
    ---------------------------
    Line 57  (File "patch2.au3"):
     
    Func _BinaryReplace($sInFile, $sFind2, $sReplace2, $sOutFile)
     
    Error: Duplicate function name.
    ---------------------------
    ОК    
    ---------------------------
     

     
     
    А если так (в самой функции добавить строчки):

    Код:
     
        $FR = StringReplace($FR, $sFind, $sReplace, 1); находим и меняем hex строку
        $FR = StringReplace($FR, $sFind2, $sReplace2, 1);  
        $FR = StringReplace($FR, $sFind3, $sReplace3, 1);  
     

    То находит и заменяет все 3, так можно делать?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 15:40 15-08-2014 | Исправлено: thejustsoul, 15:58 15-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ

    Цитата:
    Делай две замены, отдельно для ANSI и UNI .
    Почему две? AutoIt работает с UNI. Он ANSI переводит в UNI. А сохранять уже выбор от флага FileOpen.
     
    thejustsoul
    Раньше я делал утилиту для патча загрузчиков и работала она с бинарными данными. Но позже я не нашёл разницы между строковым и бинарным представлением данных. Это как если бы интерпретатор поддерживал десятичное число (5), шестнадцатеричное (0x05), двоичное (b101). Вид записи у них разный, а для интерпретатора это одно и тоже число 5.
    Допустим некоторая последовательность символов является определённой числовой последовательностью шестнадцатеричных чисел в бинарном представлении (в памяти так вообще всё двоичное 0 и 1). Указав текст замены, это тоже является эквивалентом шестнадцатеричной последовательности. Вопрос, так почему нужно усложнять бинарными преобразованиями?
     
    Открываешь файл как текст (даже если он содержит нетекстовые символы, они никуда не денутся) заменяешь неким другим текстом. Всё.
     
    Кстати, после преобразования бинарных данных в строку (вида "4D53465420352E30") это занимает в памяти в 2 раза больше места. Так как "4D" это в памяти 1 символ, а преобразованной строке это уже 2 символа. Ну и скорость обработки соответственно в 2 раза ниже.
     

    Цитата:
    Замена в том скрипте, оно находит и заменяет, но не все строчки, а только одну (видимо которая последняя $sFind = , $sReplace = , а мне нужно несколько.
    Так флаг функции равный 1 указывает что выполнить замену 1 раз.
     

    Цитата:
    То заменится только последняя (hex 123 - 321), а первая проигнорируется, нужно в общем несколько строк находить и заменять.
    Флаг равный 1 заменяет первое вхождение от начала. Флаг равный  -1 заменяет первое от конца или так сказать последнее вхождение. Чтобы заменить все кроме первого, надо выполнить все замены с флагом 0 в @extended возвратится число сделанных замен, далее использовать -(@extended - 1) чтобы заменить с конца выполнив количество замен на 1 меньше чем количество существующих.
     

    Цитата:
    И еще подскажите как сделать проверку, если есть уже пропатченные строки, то не патчить.  
    Функция StringInStr проверяет если вхождения в строке.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 08:52 17-08-2014 | Исправлено: AZJIO, 09:33 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Про замены, имел в виду не то, что скрипт делает одну замену (сколько найдет), а всего одну, хотя указывал искать разные строки ($sFind) и делать замены ($sReplace). Ниже там я написал про:
     

    Цитата:
    А если так (в самой функции добавить строчки):
     
    Код:
     ...
        $FR = StringReplace($FR, $sFind, $sReplace, 1); находим и меняем hex строку
        $FR = StringReplace($FR, $sFind2, $sReplace2, 1);  
        $FR = StringReplace($FR, $sFind3, $sReplace3, 1);  
     ...
     
    То находит и заменяет все 3 (как и надо), так можно делать?

    Замен где-то примерно  нужно (разных) 5-7, на 20 мб файл занимает около 25-30 секунд, что довольно долго, можно как-то ускорить это?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 10:03 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul

    Цитата:
    Замен где-то примерно  нужно (разных) 5-7, на 20 мб файл занимает около 25-30 секунд, что довольно долго, можно как-то ускорить это?  
    Поставь таймер и сделай вывод меток времени затраченных на открытие, замену, сохранение. Чтобы было видно почему так долго. Обычно чтение секунда, замена в памяти микросекунды, сохранение секунда. Конечно 25 сек это очень долго. И функция неправильная, не выгодно на каждую замену открывать/сохранять файл. Правильно открыть 1 раз, сделать все замены и сохранить 1 раз.
     
    Прочитать файл можно FileRead, без открытия/закрытия.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 10:57 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Если бы я еще знал как..
    По-поводу сохранения, оно же сохраняет 1 раз, а ищет/меняет 7, вот весь код на всякий:
    код

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 11:31 17-08-2014
    dedmazai1870



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    я не нашёл разницы между строковым и бинарным представлением данных

    Маленький экскурс в историю. Я не знаю, как устроен AutoIT, но это современное программное обеспечение. Тем не менее, всегда остаётся маленький риск, что программа при чтении бинарного файла как текстового, если найдёт последовательность или всего один симовл 1A (Ctrl+Z), означающий конец текстового файла, обрежет бинарник.

    Всего записей: 1386 | Зарегистр. 07-07-2012 | Отправлено: 12:28 17-08-2014 | Исправлено: dedmazai1870, 12:36 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul
    Вариант 1 - замена на массив... Не проверяю, я в Linux. Смысл в упрощении кода. Через некоторое время выложу замену текстом.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 12:35 17-08-2014 | Исправлено: AZJIO, 12:35 17-08-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dedmazai1870

    Цитата:
    если найдёт последовательность или всего один симовл 1A

    Проблема была в StringRegExpReplace (символ NULL), в последней версии и ее устранили, так, что можно спокойно работать с бинарников как с текстом.
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:36 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dedmazai1870

    Цитата:
    Я не знаю, как устроен AutoIT,
    По опыту говорю, чтение как текст ничегоне обрезает ни по каким символам. Это в Си строки режутся по \0, а здесь читается вся строка, не зависимо какие в ней символы, и конец файла является реальным концом файла, а не вымышленным символом. Если файл 100 байт, то и прочитается 100 байт без какой либо модификации, эта очевидность и подкупает, в отличии от других языков, где чтение ещё не является фактом чтения данных как файла. По моим понятиям если я открыл и сохранил файл и он оказался модифицированным то в топку такие функции. Это должно регламинтироваться, хотя не понимаю зачем оно вообще нужно, это порча данных. Вывод в MsgBox, там да, бинарные файлы обрезаются, но это только на вывод в MsgBox, в реале переменная так и будет содержать всё как есть полные данные.
     
    Добавлено:
    thejustsoul
    А не проще так

    Цитата:
    $FR = StringRegExpReplace($FR, '737472696E673[1-7]00', "00000000000000")

    Если строка почти одинаковая, то так быстрее, потому что делается одним проходом.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 12:45 17-08-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Проблемы могу возникнуть не при чтении/записи, а при обработке такой бинарной строки строковыми функциями, так, например StringRegExpReplace только в последней версии научилась корректно работать с 0x00 . (Fixed #2562: StringRegExp() & Null character.)
     
    thejustsoul
     

    Код:
    #include <String.au3>
    Dim $asFindString[3] = ["string1", "string2", "string3"]
    $vIniFile = FileRead("File.bin")
    FileDelete("New_File.bin")
    For $i = 0 To UBound($asFindString) - 1
        $vIniFile = StringReplace($vIniFile, $asFindString[$i] & Chr(0), _StringRepeat(Chr(0), StringLen($asFindString[$i]) + 1))
    Next
    FileWrite("New_File.bin", $vIniFile)

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

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:00 17-08-2014 | Исправлено: NIKZZZZ, 13:17 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Ошибка:

    Код:
    ---------------------------
    AutoIt Error
    ---------------------------
    Line 25  (File "patch3.au3"):
     
    _BinaryReplace($sInFile, $sFind, $sReplace, $sOutFile)
    _BinaryReplace($sInFile, ^ ERROR
     
    Error: Variable used without being declared.
    ---------------------------
    ОК    
    ---------------------------
     

     
    Нет строки разные, а те что я написал, это просто слова string1-7 в hex для примера.

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 13:08 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ

    Цитата:
    например StringRegExpReplace
    И это только единственный случай проблемы, остальные функции не вызывают проблем. Я кстати отписывал эту проблему и показывал тестовый пример.
     
    На счёт скорости, вызов функции по возможности не помещать внутри цикла, если только эта функция меняет своё значение по мере обработки в цикле, а _StringRepeat вычисляет одно и тоже, значит лучше её вычислить один раз в переменную вне цикла. Кстати Melda23 вместо _StringRepeat предлагал более быстрый вариант:

    Код:
    $i = 10
    $sFormat = StringReplace(StringFormat("%0" & $i & "d", "0"), "0", "#", 0, 2)
    ConsoleWrite($sFormat & @CRLF)


    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 13:09 17-08-2014 | Исправлено: AZJIO, 13:12 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    В вашем скрипте, тоже ошибка:

    Код:
     
    ---------------------------
    AutoIt Error
    ---------------------------
    Line 6  (File "patch4.au3"):
     
    $vIniFile = StringReplace($vIniFile, $asFindString[$i] & Chr(0), _StringRepeat(Chr(0), StringLen($asFindString[$i]) + 1)
    $vIniFile = StringReplace($vIniFile, $asFindString[$i] & Chr(0), _StringRepeat(Chr(0), StringLen($asFindString[$i]) + 1^ ERROR
     
    Error: Error parsing function call.
    ---------------------------
    ОК    
    ---------------------------
     

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 13:12 17-08-2014
       

    Страницы: 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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru