Уважаемые спецы, помогите решить 2 проблемы. Проблема1. Есть buffer в который считываеться информация с файла: InetBufferRead db 1024 DUP(?) нужно записать данную информацию в переменную типа: BufferSetPos textequ <string> Если делать так: BufferSetPos textequ <offset InetBufferRead> данные записываються, но если главный буфер изменён, то и данные изменяються, следовательно они передаються по ссылке, а мне так не нужно. Надо сделать чтобы информация в переменной была эквивалентна: newvar textequ <текст>. Код неправильного примера: BufferSetPos textequ <offset InetBufferRead> Array (inlink, TextSetPos(%BufferSetPos, #char1#, #char2#)) - здесь данные обрабатываються макро-функцией: TextSetPos(), передаються и записываються в массив, который можно вызвать так: inlink0(для получения первого элемента), inlink_length - длинна массива. Вот пример рабочего примера, но без буфера, а с работой напрямую: BufferSetPos textequ <#char1# yandex.ru #char2#> Array (inlink, TextSetPos(%BufferSetPos, #char1#, #char2#)) как видите различий не много. Проблема2. Есть строка типа textequ, нужно записать её в текстовый файл: strings textequ <mystring> .....открытие/создание файла .....запись Пишет то он пишет, но получаеться так, что вместе с искомой строкой оказываеться все хранилища данных, пример: Код (Text): .486 .model flat, stdcall option casemap: none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data? hFileOpen HANDLE ? ProcessReadWrite DWORD ? .code start: WriteStringFile MACRO file:REQ, string:REQ LOCAL crString, crFileOut .data crString db string, 0 crFileOut db file, 0 .code ;Создание файла invoke CreateFile, ADDR crFileOut, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\ NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL mov hFileOpen, eax ;Запись полученных данных .IF hFileOpen != NULL invoke WriteFile, hFileOpen, ADDR crString, 1024, ADDR ProcessReadWrite, NULL .ENDIF ;уничтожаем указатели invoke CloseHandle, hFileOpen EXITM <> ENDM WriteStringFile ("outfile.txt", "строка") WriteStringFile ("outfile2.txt", "строка2") invoke ExitProcess, 0 Вот такая белебердистика получаеться: строка outfile.txt строка2 outfile2.txt 0, в большом проекте хуже, там оказываються все возможные данные, ниже вызова. Примичание: если сбрасывать другой буфер, или дескриптор соединения, то всё записываеться нормально, но мне нужен текстовый вывод определённых строк, генерируемых программой. Есть ли решение данной проблемы?
1. Скопируй побайтно символы в новый буфер 2. Код (Text): invoke WriteFile, hFileOpen, ADDR crString, 1024, ADDR ProcessReadWrite, NULL 1024 - длина записываемой строки, нужно ставить реальную длину. Её можно получить с помощью lstrlen (kernel32)
TEXTEQU Это не тип переменной. Кури хелп по MASMу. Как я понял тебе нужно переслать подстроку из буфера на место другого буфера. Или я чё-то не доганяю? Где хранится строка в секции или в стеке (локальный буфер)?
S_Alex - Edmond(Руководство по проектированию макросов) varstr textequ <текст> Это не что иное, как переменная: varstr , которая содержит "текст". RamMerLabs - спасибо большое, проблема решена. Попробую.
core Ошибаешься, varstr это символическое обозначение строковой константы "текст" А объявление переменной это crString db varstr, 0 что эквивалентно записи crString db "текст",0
Если это константа, она не изменит своё значение: Код (Text): stds textequ <строка1> %echo stds ;; вывод: строка1 stds textequ <строка2> %echo stds ;; вывод: строка2 stds textequ <строка1> ;текстовый макро
RamMerLabs - не получаеться скопировать, выводиться какае-то ересь, натолкни на суть. Напомню: нужно переместить буфер1 побайтно в буфер2 а потом передать буфер2 в строку, или функцию - обработчик, которая разобьёт эту строку на более мелкие строки. Кто поможет? Заранее благодарен.
core leo прав Он не говорил, что это константа. Он сказал, что это ее символическое обозначение. В Вашем примере Вы этому символическому обозначению просто поставили в соответствие другую строковую константу.
Не помогло, пробовал две API функци: invoke lstrcpy, ADDR RecordBuffer, ADDR InetBufferRead invoke lstrcat, ADDR RecordBuffer, ADDR InetBufferRead суть - это указатель на объект, тоесть если изменить сам объект, то и копия измениться, пример: Код (Text): invoke lstrcpy, ADDR RecordBuffer, ADDR InetBufferRead mov InetBufferRead, NULL invoke MessageBox, NULL, ADDR RecordBuffer, NULL, MB_OK получим NULL, или остаток недобитого буфера, но он будет идентичен содержимому: ADDR InetBufferRead, нам нужно получить самостоятельный буфер не зависящий от InetBufferRead после извлечения текста. Сформирую попроще, нужно сделать идентичное следующему коду, только с чтением из буфера заранее неизвестной, сформированной по определённым правилам информацией: Код (Text): BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#> Array (inlink, TextSetPos(%BufferSetPos, #BLNK#, #ELNK#)) InetGetFile (@CatStr(!",%inlink0!"), "TEXT", "HTML.txt") TextSetPos вырезает содержимое между "#BLNK#" и "#ELNK#" копируя содержимое в массив: inlink с индексом 0. InetGetFile извлекает содержимое массива inlink0 и загружает информацию по ссылке http://yandex.ru/Index.html, которая должна оказаться в этом массиве и сохраняет в файл HTML.txt. Этот пример обсалютно рабочий, хотя и не автоматизированный, макроблоками FOR, или REPT, нужно сделать аналог с чтением из буфера, с заменой только одной строки: Код (Text): BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#> Проблемка не без геммороя, но а как вы хотели.
Проблема: BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#> - так обрезаеться и массив получает: http://yandex.ru/Index.html Так не работает: BufferSetPos textequ <OFFSET ADDR RecordBuffer> или так(эффект один): BufferSetPos textequ <OFFSET InetBufferRead> ну и третий вариант: Array (inlink, TextSetPos(OFFSET InetBufferRead, #BLNK#, #ELNK#)) Возможно(скорее всего) передаёться не строка BufferSetPos а ссылка на InetBufferRead, поэтому строка не может быть изменена и выходит: #BLNK#http://yandex.ru/Index.html#ELNK#, вместо: http://yandex.ru/Index.html Код приводить пока не буду, так как он вовсе не абстрагирует проблему.
ты это делаешь при инициализации данных (.data), или при выполнении кода? если при инициализации, то BufferSetPos - константа, её ты никак не изменишь; если при выполнении - textequ не будет работать. может стОит так: .data? BufferSetPos db 256 dup(?) InetBufferRead db 256 dup(?) .code ;при выполнении заполняем InetBufferRead сторокой типа "#BLNK#http://yandex.ru/Index.html#ELNK#" ;преобразуем в "http://yandex.ru/Index.html" invoke lstrcpy, addr BufferSetPos, addr InetBufferRead
Хорошо, как ты преобразуешь, если преобразует макрос, состоящий из локальных переменных типа textequ: LOCAL result, buffnewstr, pos1, pos2, stringoutbseath, outstringr, stringlength В том то и проблема, что он возращает строку обратно, в первозданном виде. В случае: BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#>, вернёться: http://yandex.ru/Index.html
core, ты уверен, что понимаешь, как работает механизм макроподстановок? Эта сентенция: Код (Text): Foo textequ <"bar"> просто означает, что в твоём коде перед компиляцией будут заменены все символические обозначения Foo на непосредственное значение "bar". Т.е. код Код (Text): String1 db "Sample tool",Foo,0 примет вид Код (Text): String1 db "Sample tool","bar",0 Написать лоадер для малвара, не зная масма.... Задача и впрямь не из лёгких… Х)
Когда я последний раз отписывался, я уже понял суть проблемы, а она проста: при вызове макроса, происходила макроподстановка текста и выполнялся код вроде: InetGetFile ("http://yandex.ru/Index.html", "TEXT", "report.txt") и именно он уже загружал страницу при запуске программы. Не спорю, некоторых тонкостей я не знаю, но я справлюсь, опыт прийдёт со временем, немного подправлю код и всё будет работать. Спасибо всем, кто натолкнул меня на верную мысль, особенно: RamMerLabs Тему можно закрыть, проблема решена.