모듈 정보: z_music v2.2.5 (2019-06-16), 제작자: 구름이 (catenater.com), XE/Rhymix용 오디오 뮤직 플레이어 모듈
구성 (2,031개 파일, 약 15MB):
modules/z_music/— 메인 모듈modules/zmusicapi/— API 모듈widgets/zmusicWidget/— 위젯- 내장 라이브러리: getID3 v1.9.17 (MP3 태그 분석), Semantic UI 2.3.0, DZS Audio Player (ZoomSounds 기반), FWD Music Player (상용 FWD 미디어 플레이어), 다수의 플레이어 스킨 (classic, hex, metal, minimal, modern × dark/white)
핵심 기능: 오디오 플레이어 (MP3, SoundCloud, Shoutcast/Icecast 라디오, YouTube, HLS), 플레이리스트 관리, 카테고리, 회원별 플레이리스트, 댓글, 팝업 플레이어, 딥링킹, 다운로드, 구매 버튼
난독화 문제 (가장 큰 문제!): z_music.controller.php — 핵심 컨트롤러 파일이 eval(base64_decode(...)) + gzinflate + MD5 체크섬 기반 난독화로 완전히 암호화되어 있어. 코드 변조 감지 기능까지 있어서, 파일 수정하면 "md5 Code manipulation detected" 에러 뜸. 이 파일이 핵심 비즈니스 로직 담당이라 수정/분석 불가.
PHP 7.4 ~ 8.4 호환성 분석:
| 문제 | 심각도 | 설명 |
|---|---|---|
_XE_PATH_ 사용 (27곳) |
⚠️ 중 | Rhymix에선 RX_BASEDIR로 변경됨. XE에서는 문제없음 |
new Object() → new BaseObject() |
✅ 처리됨 | makeObject() 메서드로 이미 PHP 7.2+ 호환 처리됨 |
&getModel() / &DB::getInstance() 참조 반환 (11곳) |
⚠️ 낮 | PHP 8에서 deprecated notice만 뜸, 동작은 함 |
| 난독화된 controller.php | 🔴 위험 | PHP 8에서 내부 코드가 어떤 함수를 쓰는지 확인 불가 |
| getID3 v1.9.17 (2019) | ⚠️ 중 | PHP 8에서 일부 deprecated 경고 발생 가능 |
결론:
PHP 7.4에서는 정상 작동할 가능성 높음. PHP 8.0+에서는 컨트롤러가 난독화돼 있어서 확신 불가 — 난독화 코드 내부에서 each(), create_function(), mysql_* 같은 PHP 8 삭제 함수를 쓸 수도 있는데 확인할 방법이 없어.
=======================처음에는 포기 하려고 했습니다 난독화 되어서=============================
OK, 이제 전체 문제를 파악했으니 일괄 수정하자. 주요 수정사항은:
&getModel()→getModel()(& 제거)&getController()→getController()&getView()→getView()&DB::getInstance()→DB::getInstance()_XE_PATH_→(defined('RX_BASEDIR') ? RX_BASEDIR : _XE_PATH_)(이미 일부 적용됨)new Object()→new BaseObject()(이미makeObject()헬퍼로 처리됨)
=======================================================================================================
PHP 7.4~8.4 호환 패치 내역 (z_music v2.2.5 → v2.2.6)
① & 참조 반환 제거 — PHP 8.x에서 deprecated warning 발생
&getModel()→getModel()&getController()→getController()&getView()→getView()&DB::getInstance()→DB::getInstance()- 대상: admin.controller, admin.view, bottom.php, zmusicapi.view, widget
② _XE_PATH_ ↔ RX_BASEDIR 호환
- z_music.class.php, zmusicapi.class.php, music.php, zmusicWidget.class.php 상단에
if (!defined('_XE_PATH_') && defined('RX_BASEDIR')) define(...)추가 - Rhymix 환경에서도 안전하게 동작
③ count(null) TypeError 방지 (PHP 8.0+)
count($config->spec_comment_group)등 →count($config->spec_comment_group ?? [])count($args->use_group) == 0→empty($args->use_group)- model.php, admin.controller.php, zmusicapi.view.php 총 13건
④ 미초기화 배열 경고 방지
- z_music.class.php, zmusicapi.class.php의
loadConfigFile()에서$arr = array()초기화 추가
⑤ new Object() / new BaseObject() — 기존 makeObject() 헬퍼가 이미 분기 처리하고 있어서 그대로 유지
getid3, zp 등 서드파티 라이브러리는 건드리지 않았어. 그 쪽에서도 에러 나면 별도로 봐줄게!
===============================================================================================
다운로드 :
z_music.controller----원본.php 원본 파일이 난독화 되어 있어요
<?php /* Reverse engineering of this file is strictly prohibited. Checksum: af3485b3211016b8aa828ac77500f7f6 */ eval(base64_decode("JElJMWwxb
이런식으로 되어 있습니다. 가격이 7만 7천원 짜리입니다.
================================================================================================
z_music 모듈 PHP 8 호환 패치노트
패치일: 2026-05-22
대상 버전: z_music v2.2.5 → v2.2.6 / zmusicapi v1.1.1 → v1.1.2
호환 범위: PHP 7.4 ~ PHP 8.4
수정된 파일 목록 (총 14개)
| 파일 | 수정 내용 |
|---|---|
modules/z_music/z_music.class.php |
_XE_PATH_ 호환 define 추가, $arr 배열 초기화 |
modules/z_music/z_music.controller.php |
& 참조 반환 제거 |
modules/z_music/z_music.model.php |
& 참조 반환 제거, count(null) 안전 처리 (13건) |
modules/z_music/z_music.view.php |
& 참조 반환 제거 |
modules/z_music/z_music.admin.controller.php |
& 참조 반환 제거, count() → empty() 변환 (3건) |
modules/z_music/z_music.admin.view.php |
& 참조 반환 제거 |
modules/z_music/z_music.mobile.php |
& 참조 반환 제거 |
modules/z_music/music.php |
_XE_PATH_ 호환 define 추가 |
modules/z_music/lib/inc/bottom.php |
& 참조 반환 제거 |
modules/z_music/conf/info.xml |
버전 2.2.5 → 2.2.6, 날짜 업데이트 |
modules/zmusicapi/zmusicapi.class.php |
_XE_PATH_ 호환 define 추가, $arr 배열 초기화 |
modules/zmusicapi/zmusicapi.view.php |
& 참조 반환 제거, count(null) 안전 처리 |
modules/zmusicapi/conf/info.xml |
버전 1.1.1 → 1.1.2, 날짜 업데이트 |
widgets/zmusicWidget/zmusicWidget.class.php |
_XE_PATH_ 호환 define 추가, & 참조 반환 제거 |
수정 상세
1. & 참조 반환 제거
PHP 8.x에서 &getModel(), &getController() 등의 참조 반환 호출은 deprecated 경고를 발생시키며, 향후 버전에서 제거될 예정입니다.
php
// 수정 전 (PHP 7.x 스타일)
$oModuleController = &getController('module');
$oModuleModel = &getModel('module');
$oLayoutMode = &getModel('layout');
$oMemberModel = &getModel('member');
$oPointModel = &getModel('point');
$oDB = &DB::getInstance();
// 수정 후 (PHP 7.4~8.4 호환)
$oModuleController = getController('module');
$oModuleModel = getModel('module');
$oLayoutMode = getModel('layout');
$oMemberModel = getModel('member');
$oPointModel = getModel('point');
$oDB = DB::getInstance();
2. _XE_PATH_ ↔ RX_BASEDIR 호환
Rhymix 환경에서는 _XE_PATH_ 상수가 정의되지 않고 RX_BASEDIR을 사용합니다. 4개 파일 상단에 호환 코드를 추가하여 양쪽 환경 모두 지원합니다.
php
// 파일 최상단에 추가
/* PHP 7.4~8.4 / Rhymix 호환 */
if (!defined('_XE_PATH_') && defined('RX_BASEDIR')) {
define('_XE_PATH_', RX_BASEDIR);
}
추가된 파일:
modules/z_music/z_music.class.phpmodules/z_music/music.phpmodules/zmusicapi/zmusicapi.class.phpwidgets/zmusicWidget/zmusicWidget.class.php
3. count(null) TypeError 방지
PHP 8.0부터 count(null)은 TypeError를 발생시킵니다. DB 결과나 설정값이 null일 수 있는 경우에 null coalescing(??)으로 빈 배열 폴백을 추가했습니다.
php
// 수정 전 — PHP 8에서 TypeError 발생
count($config->spec_comment_group)
count($output_content->data)
count($config->hide_module_srls)
// 수정 후
count($config->spec_comment_group ?? [])
count($output_content->data ?? [])
count($config->hide_module_srls ?? [])
수정된 파일 & 건수:
z_music.model.php— 10건z_music.admin.controller.php— 3건 (empty()로 변환)zmusicapi.view.php— 2건
4. count() → empty() 변환
count($x) == 0 패턴은 empty($x)로 변환하여 null-safe하게 처리했습니다.
php
// 수정 전
if(count($args->use_group) == 0) $args->use_group = "all";
if(count($args->spec_comment_group) == 0) $args->spec_comment_group = "all";
if(count($args->group) == 0) $args->group = "all";
// 수정 후
if(empty($args->use_group)) $args->use_group = "all";
if(empty($args->spec_comment_group)) $args->spec_comment_group = "all";
if(empty($args->group)) $args->group = "all";
5. 미초기화 배열 경고 방지
$arr[] = ... 형태로 값을 추가하기 전에 $arr를 초기화하지 않으면 PHP 8.x에서 Undefined variable 경고가 발생합니다.
php
// 수정 전
while(!feof($fp)) {
$str = fgets($fp, 10000);
$arr[] = $str; // $arr 미정의 상태에서 사용
}
// 수정 후
$arr = array(); // 배열 초기화 추가
while(!feof($fp)) {
$str = fgets($fp, 10000);
$arr[] = $str;
}
수정된 파일:
modules/z_music/z_music.class.php—loadConfigFile()메서드modules/zmusicapi/zmusicapi.class.php—loadConfigFile()메서드
미수정 항목 (서드파티 라이브러리)
아래 라이브러리들은 외부 프로젝트이므로 이번 패치 범위에서 제외했습니다. 별도 업데이트가 필요할 경우 각 라이브러리의 최신 버전으로 교체하는 것을 권장합니다.
lib/getid3/— getID3 오디오 메타데이터 파서lib/zp/— DZS Audio Playerlib/msp/— FWD Music Playerlib/magnific/— Magnific Popuplib/massdropdown/— jQuery Dropdownlib/iconselect/— Icon Selectcomponents/semantic/— Semantic UI
기존 호환 코드 (원본에 이미 적용되어 있던 것)
makeObject()헬퍼:class_exists('BaseObject') ? new BaseObject() : new Object()— XE/Rhymix 양쪽 호환z_music.controller.php의defined('RX_BASEDIR') ? RX_BASEDIR : _XE_PATH_— 경로 분기 처리$args = new stdClass()초기화 — controller.php에 이미 적용
참고: 브라우저 콘솔 에러 (JS)
Uncaught TypeError: Failed to construct 'Clipboard': Illegal constructor
이 에러는 PHP 패치와 무관한 프론트엔드(JavaScript) 이슈입니다. new Clipboard() 생성자가 최신 브라우저에서 지원되지 않아 발생하며, "게시물 주소복사" 등 클립보드 관련 기능에만 영향을 줄 수 있습니다. 수정하려면 navigator.clipboard.writeText() API로 전환이 필요합니다.



