Closed mpashkovskiy closed 2 years ago
Sorry for the shitty code, but it works :) https://github.com/dandygithub/kodi/pull/71
I think this issues can be closed
Sorry for the shitty code, but it works :) #71
Can U help me to convert this code to JS?
Sorry for the shitty code, but it works :) #71
r_decoded = base64.b64decode(to_decode)
File "Python39\lib\base64.py", line 87, in b64decode
return binascii.a2b_base64(s)
binascii.Error: Incorrect padding
"binascii.Error: Incorrect padding" it means string to b64decode incorrect.
I don't know JS, but this is how the algorithm works:
1) Server response contains obfuscated and base64 encoded string 2) Characters are used for obfuscation: @ # ! ^ $ 3) Characters are grouped by 2 or 3. Ex: ## or @!@ or ^^! , because after encoding this group will always have length 4. Several groups can go in a row. 4) Response always starts from "#h" and always has parts separated by symbols "// //". All trash characters inserted after "// //" 5) I believe the obfuscation on the server was done in 2 passes 6) So, let's begin:
"binascii.Error: Incorrect padding" it means string to b64decode incorrect.
@babkavkedakh, What version of python are you using? I copied your code, but its still gives me this error.
"binascii.Error: Incorrect padding" it means string to b64decode incorrect.
@babkavkedakh, What version of python are you using?
2.7 for master branch
"binascii.Error: Incorrect padding" it means string to b64decode incorrect.
@babkavkedakh, What version of python are you using?
2.7 for master branch
I am 3.9
мой вариант очистки работает посимвольно. С байтами там чет не фурычило.
I wrote my function that does this in Python 3:
import base64
from itertools import product
def clearTrash(data):
trashList = ["@","#","!","^","$"]
trashCodesSet = []
for i in range(2,4):
startchar = ''
for chars in product(trashList, repeat=i):
data_bytes = startchar.join(chars).encode("utf-8")
trashcombo = base64.b64encode(data_bytes)
trashCodesSet.append(trashcombo)
arr = data.replace("#h", "").split("//_//")
trashString = ''.join(arr)
for i in trashCodesSet:
temp = i.decode("utf-8")
trashString = trashString.replace(temp, '')
finalString = base64.b64decode(trashString+"==")
return finalString.decode("utf-8")
есть нюанс, почему я упомянул двойной проход при обфускации: мусорный блок может стоять внутри другого мусорного блока. Поэтому просто разделить строку по //_ // и бахнуть очисткой перебором не получится, т.к. коды не сойдутся. Для этого и используется поэтапное объединение строк с конца и очистка каждого полученного результата.
есть нюанс, почему я упомянул двойной проход при обфускации: мусорный блок может стоять внутри другого мусорного блока. Поэтому просто разделить строку по //_ // и бахнуть очисткой перебором не получится, т.к. коды не сойдутся. Для этого и используется поэтапное объединение строк с конца и очистка каждого полученного результата.
Не совсем понял, что вы имеете ввиду, но по идее должно работать. Привидите тогда пример.
Не совсем понял, что вы имеете ввиду, но по идее должно работать. Привидите тогда пример.
похоже, что в вашей реализации мой нюанс не важен - все работает :) спасибо!
Не совсем понял, что вы имеете ввиду, но по идее должно работать. Привидите тогда пример.
похоже, что в вашей реализации мой нюанс не важен - все работает :) спасибо!
Помогите теперь плиз на JS это переписать. А то я щас не могу разобраться с декодировкой из base64. JS говно)
не силен в js, увы
JS:
function clearTrash(data){
function product(iterables, repeat) {
var argv = Array.prototype.slice.call(arguments), argc = argv.length;
if (argc === 2 && !isNaN(argv[argc - 1])) {
var copies = [];
for (var i = 0; i < argv[argc - 1]; i++) {
copies.push(argv[0].slice()); // Clone
}
argv = copies;
}
return argv.reduce(function tl(accumulator, value) {
var tmp = [];
accumulator.forEach(function(a0) {
value.forEach(function(a1) {
tmp.push(a0.concat(a1));
});
});
return tmp;
}, [[]]);
}
function unite(arr){
var final = [];
arr.forEach(function(e){
final.push(e.join(""))
})
return final;
}
var trashList = ["@","#","!","^","$"];
var two = unite(product(trashList, 2));
var tree = unite(product(trashList, 3));
var trashCodesSet = two.concat(tree);
var arr = data.replace("#h", "").split("//_//");
var trashString = arr.join('');
trashCodesSet.forEach(function(i){
var temp = btoa(i)
trashString = trashString.replaceAll(temp, '')
})
var final_string = atob(trashString);
return final_string;
}
Looks like they changed response format: