Добавлен host_pi,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Версия Warcraft:
любая
[WarCraft III] Jass identifier renamer
[WarCraft III] Jass identifier renamer - автопереименование функций и переменных в j коде
скрипт позволяет вернуть обфусцированному j коду читабельный вид, пакетно меняя имена функций и переменных
(например если у вас есть незащищённый код от другой версии карты или вы произвели реверс-инжиниринг кода и можете самостоятельно дать смысловые имена)
(например если у вас есть незащищённый код от другой версии карты или вы произвели реверс-инжиниринг кода и можете самостоятельно дать смысловые имена)
как юзнуть:
- регистрируетесь в реплите
- клонируете себе этот репл
- в war3map.j кидаете свой код, в main.py описываете имена, что хотите заменить и на что.
- запускаете main.py, в output.j результат.
кнопка клонирования справа сверху:
код main.py под спойлером:
Открыть
import re
from collections import Counter
from collections.abc import Iterable
WORDS_TO_REPLACE = {
'fu': 'Test1',
'ti': 'Test2',
'jass': 'Test3',
'hpea': 'Test4',
'd': 'Test5',
}
words = '|'.join(re.escape(w) for w in WORDS_TO_REPLACE)
REGEX_WORDS = re.compile(rf'\b({words})\b')
REPLACEMENTS_N = Counter()
FOUND_IN_QUOTES = Counter()
def replacement(m: re.Match, /) -> str:
word = m[0]
start, end = m.span()
assert start < end
for s, e in SPANS:
if s >= end: break
if s <= start and end <= e:
FOUND_IN_QUOTES[word] += 1
return word
REPLACEMENTS_N[word] += 1
return WORDS_TO_REPLACE[word]
def find_quotes(content: str, /) -> Iterable[tuple[int, int]]:
is_double = is_single = False
start = end = -1
for i, c in enumerate(content):
if is_double:
if c == '"':
if content[i - 1] == '\\':
continue
end = i + 1
is_double = False
assert start < end
assert start > -1 and end > -1
yield start, end
start = end = -1
elif is_single:
if c == "'":
if content[i - 1] == '\\':
continue
end = i + 1
is_single = False
assert start < end
assert start > -1 and end > -1
yield start, end
start = end = -1
else:
if c == '"':
is_double = True
start = i
elif c == "'":
is_single = True
start = i
with open('war3map-actual.j') as f, open('output.j', 'w') as out:
content = f.read()
SPANS = tuple(find_quotes(content))
out.write(REGEX_WORDS.sub(replacement, content))
col1_len = max(map(len, map(repr, REPLACEMENTS_N.keys() | FOUND_IN_QUOTES.keys())))
print('Replaced count:')
for w, n in sorted(REPLACEMENTS_N.items()):
print(f' {w!r:{col1_len}} -- {n}')
print('Found inside quotes:')
for w, n in sorted(FOUND_IN_QUOTES.items()):
print(f' {w!r:{col1_len}} -- {n}')
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000
Отредактирован PT153
Отредактирован PT153
Удобно, если б можно было бы менять строки не по имени, а по содержанию по типу local unit ${?} = GetTriggerUnit() => "local unit caster = GetTriggerUnit()"
Отредактирован PT153
Отредактирован ScorpioT1000