конвертация строки в cp1251

yung milonov

Известный
Автор темы
1,008
519
столкнулся с проблемой при переписи функции с Lua на Python.
декодирует строку в изначальный вид (из string hider)
1653257118210.png

результат:
1653257180172.png

кодировка файла в данном случае Windows 1251
Lua:
function _C(str)
    local res = ""
    local n = string.byte( string.sub(str, 1, 1) ) + string.byte( string.sub(str, -1, -1) )
    local str = string.sub(str, 2, #str - 1)
    for i = 1, #str do
        res = res .. string.char( str:byte(i) - n )
    end
    return res
end

print(_C("‹ђ‹…€‰"))
1653257477224.png

результат:
1653257513327.png

Python:
def _C(text):
    res = ""
    n = ord(text[0]) + ord(text[len(text) - 1])
    text = text[1:-1]
    for i in range(1, len(text)):
        res += chr(ord(text[i]) - n)
    print(res)

_C("‹ђ‹…€‰")
вроде нормально переписал, должно все быть нормально, но возникли проблемы - по моим соображениям из-за строки в utf-8.
пытался через методы из гугла делать строку в кодировке windows1251, но результат вроде не менялся.

сурс хайдера строк тож есть, он и делает эти строки.
Python:
import re, os, random
os.system('title string hider by babulya karelli')
decoder = '\nfunction _C(str)\n    local res = ""\n    local n = string.byte( string.sub(str, 1, 1) ) + string.byte( string.sub(str, -1, -1) )\n    local str = string.sub(str, 2, #str - 1)\n    for i = 1, #str do\n        res = res .. string.char( str:byte(i) - n )\n    end\n    return res\nend\n'

def main():
    text = input(u'\u041f\u0443\u0442\u044c \u043a Lua: ')
    STR_C = ''
    with open(text, 'r') as (FILE):
        for st in FILE:
            result = re.findall('\\"(.*?)\\"', st)
            for retab in result:
                EncryptLine = ''
                number = random.randint(1, 25)
                number_ = random.randint(1, 25)
                for row in retab.encode('cp1251'):
                    if row + 50 <= 255:
                        EncryptLine += ''.join('\\x{:02X}'.format(int(row + (number_ + number))))
                    else:
                        EncryptLine = retab
                        break

                if EncryptLine != retab:
                    print('HIDE: ' + retab)
                    EncryptLine = ''.join('\\x{:02X}'.format(int(number))) + EncryptLine
                    EncryptLine += ''.join('\\x{:02X}'.format(int(number_)))
                    st = st.replace('"' + retab + '"', '(_C("' + EncryptLine + '"))', 1)
                else:
                    st = st
            else:
                STR_C += st

    with open('result.hide.luac', 'w') as (FILE):
        FILE.write(decoder + STR_C)
    os.system('luajit.exe -b "result.hide.luac" "result.hide.luac"')
    print('ok')
    main()


main()
 
Последнее редактирование:

tripple sixx

Активный
107
49
С этой же проблемой? тебе строки в питоне закодировать надо?
Наоборот, мне нужно их разкодировать.
У меня строчки в таком формате - _C("\\xa4\\x97\\xa3\\xa7\\x9b\\xa4\\x97").
Пишу на питоне декриптор для этого, но что-то не получается.

Python:
import os
import re

def _C(text):
    res = ""
    n = ord(text[0]) + ord(text[-1])
    text = text[1:-1]
    for i in range(len(text)):
        res += chr((ord(text[i].encode('utf-8')) - n) % 256)
    return res

file_path = input("Введите путь к файлу Lua: ")
file_name = os.path.basename(file_path)

with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
    lines = file.readlines()
    result = ''

    for line in lines:
        match = re.search(r'_C\("([^"]+)"\)', line)
        while match:
            encrypted_string = match.group(1)
            decrypted_string = _C(encrypted_string)
            line = line.replace(f'_C("{encrypted_string}")', f'"{decrypted_string}"', 1)
            match = re.search(r'_C\("([^"]+)"\)', line)
        result += line

    with open(f'{file_name}_unprot.lua', 'w', encoding='utf-8', errors='ignore') as result_file:
        result_file.write(result)

print(f'Декодирование завершено. Проверьте файл {file_name}_unprot.lua.')
input()

Вся проблема в функции _C


upd:
В луашнике, который мне нужно декодировать, эта функция выглядит так:

Lua:
function _C(slot0)
    for slot5 in string.gmatch(slot0, ".") do
        slot1 = "" .. string.char(string.byte(slot5) - 50)
    end

    return slot1
end
 

MrDorlik

Известный
957
385
Наоборот, мне нужно их разкодировать.
У меня строчки в таком формате - _C("\\xa4\\x97\\xa3\\xa7\\x9b\\xa4\\x97").
Пишу на питоне декриптор для этого, но что-то не получается.

Python:
import os
import re

def _C(text):
    res = ""
    n = ord(text[0]) + ord(text[-1])
    text = text[1:-1]
    for i in range(len(text)):
        res += chr((ord(text[i].encode('utf-8')) - n) % 256)
    return res

file_path = input("Введите путь к файлу Lua: ")
file_name = os.path.basename(file_path)

with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
    lines = file.readlines()
    result = ''

    for line in lines:
        match = re.search(r'_C\("([^"]+)"\)', line)
        while match:
            encrypted_string = match.group(1)
            decrypted_string = _C(encrypted_string)
            line = line.replace(f'_C("{encrypted_string}")', f'"{decrypted_string}"', 1)
            match = re.search(r'_C\("([^"]+)"\)', line)
        result += line

    with open(f'{file_name}_unprot.lua', 'w', encoding='utf-8', errors='ignore') as result_file:
        result_file.write(result)

print(f'Декодирование завершено. Проверьте файл {file_name}_unprot.lua.')
input()

Вся проблема в функции _C


upd:
В луашнике, который мне нужно декодировать, эта функция выглядит так:

Lua:
function _C(slot0)
    for slot5 in string.gmatch(slot0, ".") do
        slot1 = "" .. string.char(string.byte(slot5) - 50)
    end

    return slot1
end
Так тут вообще кодировки нет, от каждого числа в хексе 50 отнимай и все
 

tripple sixx

Активный
107
49
Так тут вообще кодировки нет, от каждого числа в хексе 50 отнимай и все
Оно из
Lua:
_C("stuvwxyz{|}~\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xacbcdefghijk]a")
( В оригинале "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
Сделало:
"NOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

Python:
def _C(input_string):
    try:
        hex_values = re.findall(r'\\x[0-9a-fA-F]{2}', input_string)
        result_string = ""

        for val in hex_values:
            try:
                hex_value = int(val[2:], 16)
                subtracted_value = hex(hex_value - 50)
                result_string += f"{subtracted_value[2:]}"
            except ValueError as e:
                print(f"An error occurred: {e}")

        decoded_string = bytes.fromhex(result_string).decode('utf-8')
        return decoded_string

    except Exception as e:
        print(f"An error occurred: {e}")
        return None