• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

"тонкости" работы с поиском Msword

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
216
история началась с того, что поля ворда неудобны для массового применения (программной подстановки)
было решено заменить их шаблонами текста, например:
<Field1|default value|description[example]>
т.е. вместо поля вставляется такая конструкция
в нотуса это заносится в виде дока (могут быть варианты) с полями:
name value comments (где каменты включают часть description[example])
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код для получения "полей" ворда"</div></div><div class="sp-body"><div class="sp-content">
Код:
'получение списка "шаблонов" (слов для замены) из ворд документа
'результат в textList (ключ в хэше)
Function GetListByTemplate(worddoc As Variant, template As String, textlist List As String) As Boolean
Erase textlist
On Error Goto ErrorHandler
Dim wObj As Variant
Dim rngToSearch As Variant
Dim rngResult As Variant
Dim i As Integer
Dim s As String

Set wObj = worddoc.Application
Set rngToSearch = worddoc.Content
Set rngResult = rngToSearch.Duplicate
'.Text = ""
rngResult.Find.Text = template 'возможный вариант: "\<*\>"
rngResult.Find.Forward = True
rngResult.Find.Wrap = wdFindStop
rngResult.Find.MatchCase = False
rngResult.Find.MatchWildcards = True
Do While rngResult.Find.Execute()
i = i + 1
rngResult.Select
s = worddoc.Application.Selection.Text
rngResult.Collapse 0 'wdCollapseEnd
textList(s)=""
Loop
Print "Occurance in Word document" & template & " #" & Cstr(i)
GetListByTemplate=True
ExitFunctoin:
Exit Function
ErrorHandler:
Call RaiseError()
Erase textlist
Resume ExitFunctoin	
End Function
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код для замены"</div></div><div class="sp-body"><div class="sp-content">
Код:
'замена "шаблонов" (ключевых слов) в документе ворда, на значения из списка
'ключ хэша - "шаблон", значение - замена
Function ReplaceByTemplate(replacementList List As String, worddoc As Variant) As Boolean
On Error Goto ErrorHandler
Dim wObj As Variant
Dim rngToSearch As Variant
Dim rngResult As Variant
Dim i As Long
Dim s As String, txt As String

Set wObj = worddoc.Application
Set rngToSearch = worddoc.Content
Forall m In replacementList
Set rngResult = rngToSearch.Duplicate
'		s=defDelim.GetEscLeft() & Listtag(m) & defDelim.GetEscRight()
'		s={\<} & Listtag(m) & {\>}
s=Listtag(m)
rngResult.Find.Text = s
rngResult.Find.Forward = True
rngResult.Find.Wrap = wdFindStop
'не действует MachCase=False для шаблона \<fld_name\>
rngResult.Find.MatchCase = False'MSWord - индусское поделие
'		rngResult.Find.MatchWholeWord = False
rngResult.Find.MatchWildcards = True
txt=Cstr(m)
rngResult.Find.Replacement.Text=txt
rngResult.Find.Execute ,,,,,,,,,,wdReplaceAll
i=i+1
DbgMsg({Значение:} & Listtag(m) & ", #" & Cstr(i))
End Forall

ReplaceByTemplate=True
ExitFunctoin:
Exit Function
ErrorHandler:
Call RaiseError()
Print {#} & Format(i, {000000}) & {;replace value>} & s & {;by value>} & txt
Resume ExitFunctoin	
End Function
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"а вот далее начинаются нюанецы, кот. описаны мною в каментах"</div></div><div class="sp-body"><div class="sp-content">
Код:
...................
Dim templList List As String
Call GetListByTemplate(worddoc, search, templList)
Forall m In templList
Dim doc As NotesDocument
Dim rec As Variant
Dim pattern As String
pattern=Listtag(m)
pattern=Mid(pattern,2,Len(pattern)-2) 'отрезаем делимитеры (предполагается 1-ин символ)
rec=Split(pattern,FLDREC_SEP) 'сплит на имя|значение|каменты
Dim org As String
org=rec(0)
'rec(0)=Trim(org) 'убираем граничные пробелы
'с пробелами (в названиях "полей") - полюбасу траблы
'лучше отобразить (чтобы потом исправить)

Dim stmp As String, sUtrim As String
sUtrim=Ucase(Trim(rec(0))) 'для перезаписи полей
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'этот блок для борьбы с реализацией программного поиска в Word
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'для последующей "нормализации" в Word документе
'вариант точного соответствия
'Ucase для обхода глюка ворда - не действует MachCase=False для шаблона \<fld_name\>, д.б. точное соответ.
stmp=defDelim.GetEscLeft & defDelim.GetEscaped(pattern) & defDelim.GetEscRight
'но - этот поиск не будет работать (по точному соответствию), если фраза разносится на несколько строк
' "спасибо" индусам (нирвана им в анус)
recreplace(stmp)=defDelim.GetLeft & sUtrim & defDelim.GetRight

'поэтому делаем ЕЩЁ и вариант с wildcard
recreplace(defDelim.GetEscLeft & org & FLDREC_SEP & {*} & defDelim.GetEscRight)=_
defDelim.GetLeft & sUtrim & defDelim.GetRight
'ниже - можно (впринципе) не делать, если прдыдущее не помогло, это тоже не спасёт;)
'		recreplace(defDelim.GetEscLeft & org & defDelim.GetEscRight)=_
'		defDelim.GetLeft & Ucase(rec(0)) & defDelim.GetRight
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
..........................
End Forall
..........................
Call ReplaceByTemplate(recreplace, worddoc)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
216
яб тоже плюнул (и плюну), но у нас корпоративная любовь к МС продуктам ;) (и согласование текста делают через ... = МСО)
а плюну след. образом - буду втягивать текст контрактов в нотусню
а потом -> PDF
но это мои мечты ;) - а времени нет
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
яб тоже плюнул (и плюну), но у нас корпоративная любовь к МС продуктам ;) (и согласование текста делают через ... = МСО)
а плюну след. образом - буду втягивать текст контрактов в нотусню
а потом -> PDF
но это мои мечты ;) - а времени нет
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
216
это слишком "простой" ПДФ ;)
надо более продвинутый вариант делать
схема уже оглашалась... notesdoc->DXL->SAX+FOP->PDF
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!