USER
При вызове кода обфускации (как видишь, я закоментировал вызов 3-х из 4-х функций, оставив только переименовывание) и я получил в результате вроде бы код с правильно обфусцированными переменными, однако канвас не прогрузился теперь. В чем проблема?
import random
import string
import re
# Функция для генерации случайного имени переменной
def generate_random_name(length=10):
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(length))
# Функция удаления комментариев
def remove_comments(js_code):
lines = js_code.split('\n')
cleaned_lines = []
for line in lines:
line = line.split('//')[0].strip()
if line:
cleaned_lines.append(line)
return '\n'.join(cleaned_lines)
# Функция минимизации пробелов
def minimize_spaces(js_code):
lines = js_code.split('\n')
return ''.join(line.strip() for line in lines)
# Функция для генерации случайного имени переменной
def generate_random_name(length=10):
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(length))
# Функция обфускации переменных
def obfuscate_variables(js_code):
var_map = {}
# Найти все объявления переменных (после ключевого слова var)
for var_name in re.findall(r'\bvar\s+(\w+)', js_code):
obfuscated_name = generate_random_name()
var_map[var_name] = obfuscated_name
# Заменить все экземпляры оригинальных имен переменных на обфусцированные имена
for original_name, obfuscated_name in var_map.items():
js_code = re.sub(r'\b' + original_name + r'\b', obfuscated_name, js_code)
return js_code
# Тестовый JavaScript код
original_js = """
// Это пример комментария
var a = 10;
var b = a + 5;
console.log(b);
"""
# Выполнение обфускации и печать результата
obfuscated_js = obfuscate_variables(original_js)
print(obfuscated_js)
# Добавление “мертвого” кода
def add_dead_code(js_code):
dead_code = f"function {generate_random_name()}(){{console.log(’{generate_random_name()}');}}\n"
return dead_code + js_code
def obfuscate_js(js_code):
#js_code = remove_comments(js_code)
js_code = obfuscate_variables(js_code)
#js_code = minimize_spaces(js_code)
#js_code = add_dead_code(js_code)
return js_code
# Исходный код javascript
original_js = """
//var cvs = document.getElementById("canvas");
var cvs = document.querySelector("canvas"); //пер canvas
var ctx = cvs.getContext("2d"); //указывает вид игры = 2D; пер c
var background = new Image();
background.src="images/background.png";
var player = new Image();
player.src="images/player.png";
var upper_stalactite = new Image();
upper_stalactite.src = "images/upper_stalactite.png";
var bottom_stalactite = new Image();
bottom_stalactite.src = "images/bottom_stalactite.png";
var safe_zone=180;
//при нажатии на кнопку
document.addEventListener ("keydown", fly);
function fly() {
yPos -= 50;
}
//создание блоков
var obstacle = [];
obstacle[0]= {
x: cvs.width,
y: -250
}
//позиция игрока
var xPos=45;
var yPos=225;
var score=0;
function draw () {
ctx.drawImage(background, 0, 0);
for (var i=0; i<obstacle.length; i++) {
ctx.drawImage(upper_stalactite, obstacle[i].x, obstacle[i].y);
ctx.drawImage(bottom_stalactite, obstacle[i].x, obstacle[i].y+upper_stalactite.height + safe_zone);
obstacle[i].x-=2;
if (obstacle[i].x==350) {
obstacle.push({x:cvs.width, y:Math.floor(Math.random()*upper_stalactite.height)-upper_stalactite.height-50})
}
if (xPos+player.width >= obstacle[i].x && xPos <= obstacle[i].x+ upper_stalactite.width && (yPos <= obstacle[i].y+upper_stalactite.height || yPos + player.height >= obstacle[i].y+upper_stalactite.height + safe_zone) || yPos + player.height >= cvs.height || yPos <= 0) {
// function sleep(ms) {
// var time = new Date();
// time.setTime(time.getTime() + ms);
// while (new Date().getTime() < time.getTime()) {}
// }
// sleep(1000);
var x=0;
function draw_timer () { //создал таймер через многократное использование requestAnimationFrame(draw_timer);
ctx.drawImage(background, 0, 0);
ctx.fillStyle = "#ff0000";
ctx.font = "28px Verdana";
ctx.fillText("[" + "Game Over" + "]", cvs.width/2-79, cvs.height/2-10);
ctx.fillStyle = "green";
ctx.font = "24px Verdana";
ctx.fillText("(" + score + ")", 640, 475);
x++; if (x>=100) { //через 100 проходов можно перезапускать игру
ctx.fillStyle = "#ff0000";
ctx.font = "16px Verdana";
ctx.fillText("Press any key to restart", cvs.width/2-79, 475);
document.addEventListener ("keydown", restart);
function restart (){
location.reload();
}return 0;}
requestAnimationFrame(draw_timer);
}
draw_timer();
return 0;
}
if (obstacle[i].x==0) {
if (obstacle[i].y<=-436||obstacle[i].y>=-62) {
score++;
if (obstacle[i].y<=-451||obstacle[i].y>=-53) {
score++;
if (obstacle[i].y<=-459) {
score++;
}
}
}
score++;
}
if (obstacle[i].x%200==0) {
console.log (obstacle[i].y);
}
}
ctx.drawImage(player, xPos, yPos)
yPos+=4;
ctx.fillStyle = "green";
ctx.font = "24px Verdana";
ctx.fillText("(" + score + ")", 640, 475)
requestAnimationFrame(draw);
if (obstacle.length > 2){ // удаляем из массива уже преодоленные препятствия
obstacle.shift()
}
}
bottom_stalactite.onload = draw;
"""
obfuscated_js = obfuscate_js(original_js)
print(obfuscated_js)
Вот обфусцированный код:
//var jTtSYtlbfQ = document.getElementById("canvas");
var jTtSYtlbfQ = document.querySelector("canvas"); //пер canvas
var ggSqZoDMoi = jTtSYtlbfQ.getContext("2d"); //указывает вид игры = 2D; пер c
var IgFDwttQJS = new Image();
IgFDwttQJS.src="images/IgFDwttQJS.png";
var pGTFcYCSef = new Image();
pGTFcYCSef.src="images/pGTFcYCSef.png";
var kAgoENblJj = new Image();
kAgoENblJj.src = "images/kAgoENblJj.png";
var ejBvegFFOW = new Image();
ejBvegFFOW.src = "images/ejBvegFFOW.png";
var ZvFKpgsAlC=180;
//при нажатии на кнопку
document.addEventListener ("keydown", fly);
function fly() {
qsCEXhwqCk -= 50;
}
//создание блоков
var alwAuBdDQm = [];
alwAuBdDQm[0]= {
hOLtOSLfpG: jTtSYtlbfQ.width,
y: -250
}
//позиция игрока
var LpeDxEyhen=45;
var qsCEXhwqCk=225;
var KZZlgUNrLM=0;
function draw () {
ggSqZoDMoi.drawImage(IgFDwttQJS, 0, 0);
for (var fbqXClKxKj=0; fbqXClKxKj<alwAuBdDQm.length; fbqXClKxKj++) {
ggSqZoDMoi.drawImage(kAgoENblJj, alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG, alwAuBdDQm[fbqXClKxKj].y);
ggSqZoDMoi.drawImage(ejBvegFFOW, alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG, alwAuBdDQm[fbqXClKxKj].y+kAgoENblJj.height + ZvFKpgsAlC);
alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG-=2;
if (alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG==350) {
alwAuBdDQm.push({hOLtOSLfpG:jTtSYtlbfQ.width, y:Math.floor(Math.random()*kAgoENblJj.height)-kAgoENblJj.height-50})
}
if (LpeDxEyhen+pGTFcYCSef.width >= alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG && LpeDxEyhen <= alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG+ kAgoENblJj.width && (qsCEXhwqCk <= alwAuBdDQm[fbqXClKxKj].y+kAgoENblJj.height || qsCEXhwqCk + pGTFcYCSef.height >= alwAuBdDQm[fbqXClKxKj].y+kAgoENblJj.height + ZvFKpgsAlC) || qsCEXhwqCk + pGTFcYCSef.height >= jTtSYtlbfQ.height || qsCEXhwqCk <= 0) {
// function sleep(ms) {
// var wRLakWGhzq = new Date();
// wRLakWGhzq.setTime(wRLakWGhzq.getTime() + ms);
// while (new Date().getTime() < wRLakWGhzq.getTime()) {}
// }
// sleep(1000);
var hOLtOSLfpG=0;
function draw_timer () { //создал таймер через многократное использование requestAnimationFrame(draw_timer);
ggSqZoDMoi.drawImage(IgFDwttQJS, 0, 0);
ggSqZoDMoi.fillStyle = "#ff0000";
ggSqZoDMoi.font = "28px Verdana";
ggSqZoDMoi.fillText("[" + "Game Over" + "]", jTtSYtlbfQ.width/2-79, jTtSYtlbfQ.height/2-10);
ggSqZoDMoi.fillStyle = "green";
ggSqZoDMoi.font = "24px Verdana";
ggSqZoDMoi.fillText("(" + KZZlgUNrLM + ")", 640, 475);
hOLtOSLfpG++; if (hOLtOSLfpG>=100) { //через 100 проходов можно перезапускать игру
ggSqZoDMoi.fillStyle = "#ff0000";
ggSqZoDMoi.font = "16px Verdana";
ggSqZoDMoi.fillText("Press any key to restart", jTtSYtlbfQ.width/2-79, 475);
document.addEventListener ("keydown", restart);
function restart (){
location.reload();
}return 0;}
requestAnimationFrame(draw_timer);
}
draw_timer();
return 0;
}
if (alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG==0) {
if (alwAuBdDQm[fbqXClKxKj].y<=-436||alwAuBdDQm[fbqXClKxKj].y>=-62) {
KZZlgUNrLM++;
if (alwAuBdDQm[fbqXClKxKj].y<=-451||alwAuBdDQm[fbqXClKxKj].y>=-53) {
KZZlgUNrLM++;
if (alwAuBdDQm[fbqXClKxKj].y<=-459) {
KZZlgUNrLM++;
}
}
}
KZZlgUNrLM++;
}
if (alwAuBdDQm[fbqXClKxKj].hOLtOSLfpG%200==0) {
console.log (alwAuBdDQm[fbqXClKxKj].y);
}
}
ggSqZoDMoi.drawImage(pGTFcYCSef, LpeDxEyhen, qsCEXhwqCk)
qsCEXhwqCk+=4;
ggSqZoDMoi.fillStyle = "green";
ggSqZoDMoi.font = "24px Verdana";
ggSqZoDMoi.fillText("(" + KZZlgUNrLM + ")", 640, 475)
requestAnimationFrame(draw);
if (alwAuBdDQm.length > 2){ // удаляем из массива уже преодоленные препятствия
alwAuBdDQm.shift()
}
}
ejBvegFFOW.onload = draw;ASSISTANT
Проблема с неработающим канвасом после обфускации может быть вызвана несколькими причинами. Одна из них — неправильная замена путей к изображениям. Если в оригинальном коде названия изображений не соответствовали переменным, к которым их привязали, то после обфускации ссылки на изображения также могли измениться, в результате чего код не может их найти. Например, в вашем коде есть строка:
```javascript
background.src="images/IgFDwttQJS.png";
```
Если имя файла изображения фактически `background.png`, а не `IgFDwttQJS.png`, то после обфускации браузер не сможет найти указанный файл, так как имя было изменено. В этом случае, чтобы поддерживать обфускацию без нарушения функциональности, вам нужно будет либо переименовать файлы изображений соответственно обфусцированным именам, либо изменить алгоритм обфускации так, чтобы он не затрагивал строки с путями к ресурсам.
Другая потенциальная проблема — это обфускация идентификаторов, которые не являются переменными, например:
```javascript
var bottom_stalactite = new Image();
bottom_stalactite.onload = draw;
```
Если имя `bottom_stalactite` было обфусцировано, но в `onload` осталось старое, то обработчик события не сможет вызвать функцию `draw`, и канвас останется пустым.
Третья возможная проблема — это обфускация названий встроенных свойств и методов, таких как `width`, `height`, `getContext` и другие, что может привести к сбоям в работе скрипта.
Обеспечение корректной работы обфусцированного кода включает в себя проверку того, что обфускация не нарушает элементы синтаксиса и не изменяет литералы строк, которые являются важными ссылками на внешние ресурсы или ключи API.
Вам необходимо убедиться, что имена ресурсов (например, изображений) не изменяются и что обфускация не вносит изменений в синтаксически важные элементы. Рекомендация — использовать специализированные инструменты для обфускации, которые более точно могут проанализировать код и выполнить обфускацию без нарушения функциональности.