PDA

Просмотр полной версии : конвертация строки в cp1251


yung milonov
23.05.2022, 02:12
столкнулся с проблемой при переписи функции с Lua на Python.



декодирует строку в изначальный вид (из string hider)

https://forum.antichat.xyz/attachments/28046488/img_dcde8394bf.png

результат:
https://forum.antichat.xyz/attachments/28046488/img_bb04268d1b.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
(
"‹ђ‹…€‰"
)
)









https://forum.antichat.xyz/attachments/28046488/img_1db09c5c2c.png

результат:
https://forum.antichat.xyz/attachments/28046488/img_b626292978.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:





[CODE]
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

tripple sixx
03.11.2023, 18:22
up (столкнулся с этой же проблемой)

MrDorlik
03.11.2023, 18:38
up (столкнулся с этой же проблемой)


С этой же проблемой? тебе строки в питоне закодировать надо?

tripple sixx
03.11.2023, 18:56
С этой же проблемой? тебе строки в питоне закодировать надо?


Наоборот, мне нужно их разкодировать.

У меня строчки в таком формате - _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
03.11.2023, 19:00
Наоборот, мне нужно их разкодировать.
У меня строчки в таком формате - _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
03.11.2023, 19:20
Так тут вообще кодировки нет, от каждого числа в хексе 50 отнимай и все


Оно из

Lua:






_C
(
"stuvwxyz{|}~\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x 87\\x88\\x89\\x8a\\x8b\\x8c\\x93\\x94\\x95\\x96\\x 97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\x a1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\x ab\\xacbcdefghijk]a"
)




( В оригинале "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/")

Сделало:

"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