포럼

Conory 님의 사이트에서 상당히 흥미로운 기능을 발견했었습니다.

PHP 소스 코드를 암호화하는 PHP 인코더 (http://www.conory.com/box/phpencoder.php) 기능을 제공하시더라구요~

알고 보니까, Conory 님의 모듈의 라이센스 관련 부분도 수정할 수 없도록 본 프로그램으로 인코딩이 되있더군요.

 

<?php eval(gzinflate(base64_decode('DZc1ssUIDgCPszPlwEy...

이런식으로 PHP 코드가 난독화(암호화?) 됩니다.

 

하여간, 여러가지 암호화 해보면서 가지고 놀다가, 인코더만 존재하고, 디코더가 없길래 직접 한번 제작해봤습니다.

본 디코더는 개인의 공부 목적으로 개발해본것이며,

디코더가 배포될 경우 인코더를 사용하시는 분들에게 피해가 생길 가능성이 존재하므로,

본 디코더는 외부에 공개하거나 배포되지 않습니다. 디코더 관련 문의는 정중히 사양하겠습니다.

 

 

1.png

우선 저는, .NET 프로그래밍해서 프로그램으로 제작하였습니다.

암호화된 소스 코드를 넣고서 DECODE ENC4PHP NOW! 버튼을 눌러주면~

 

2.png

이렇게 다시 원본 소스 코드로 복호화되게 됩니다.

테스트에 사용된 소스는 BNU 님의 알림센터 소스입니다.

 

마지막으로,

VB.NET 으로 코딩하면서, PHP 의 GZInflate / GZDeflate 가 무엇을 하는 함수인지 궁금했는데요...

 

다음과 같이, Inflate 및 Deflate 함수를 VB.NET에서 구현을 해봤습니다.

Public Function GZInflateBASE64(ByVal Input As String) As String
	Dim InputByte As Byte() = Convert.FromBase64String(Input)
	Using inputStream As New MemoryStream(InputByte)
		Using gzip As New DeflateStream(inputStream, CompressionMode.Decompress)
			Using reader As New StreamReader(gzip, UTF8Encoding.UTF8)
				Return reader.ReadToEnd()
			End Using
		End Using
	End Using
End Function



Public Function GZDeflateBASE64(ByVal Input As String)
	Dim sIn As Byte() = UTF8Encoding.UTF8.GetBytes(Input)
	Dim rawDataStream As New MemoryStream()
	Dim gzipOut As New DeflateStream(rawDataStream, CompressionMode.Compress)

	gzipOut.Write(sIn, 0, sIn.Length)
	gzipOut.Close()

	Dim compressed As Byte() = rawDataStream.ToArray()
	Return Convert.ToBase64String(compressed)
End Function

 

참고로, 위의 함수를 C# 으로 코딩하면 다음과 같습니다.

public string GZInflateBASE64(string Input)
{
	byte[] InputByte = Convert.FromBase64String(Input);
	using (MemoryStream inputStream = new MemoryStream(InputByte)) {
		using (DeflateStream gzip = new DeflateStream(inputStream, CompressionMode.Decompress)) {
			using (StreamReader reader = new StreamReader(gzip, UTF8Encoding.UTF8)) {
				return reader.ReadToEnd();
			}
		}
	}
}

public object GZDeflateBASE64(string Input)
{
	byte[] sIn = UTF8Encoding.UTF8.GetBytes(Input);
	MemoryStream rawDataStream = new MemoryStream();
	DeflateStream gzipOut = new DeflateStream(rawDataStream, CompressionMode.Compress);

	gzipOut.Write(sIn, 0, sIn.Length);
	gzipOut.Close();

	byte[] compressed = rawDataStream.ToArray();
	return Convert.ToBase64String(compressed);
}

 

String 형식으로 받기 위해서 Byte 를 BASE64 해서 보여주도록 만들었습니다.

테스트 해본 결과 잘 작동을 하더군요. 물론 어딘가에 문제가 있을지도... 모르겠습니다. ㅇㅅㅇ

 

오늘 이렇게 잉여로운 개발을 해보면서 느낀 점은,

PHP 소스의 경우 이온 큐브 등과 같이 별도 프로그램을 사용해서 서버단에서 암호화를 해제하는 구조가 아닌 이상에는 100% 소스 코드의 수정이 가능하다는 것이며, 반대로 개발자분들은, Conory 님의 PHP 인코더 정도만 사용해도 소스의 무단 수정을 어느 정도 방어할 수 있다는 것입니다. 실제로 XE 마켓이나 기타 등등에서 모듈을 구매하시는 분들 중, 관련 지식이 풍부한 개발자가 아닌 이상에는, 암호화를 해독할 수 있는 능력을 가진 분들은 거의 없을거라고 생각합니다. ^^;

글쓴이 제목 최종 글
Cody php 5.3.x 이상에서 Deprecated 된 참조(Reference) 구문 [1] 2011.12.31 by Cody
한마음^^ 1.5.1.1 여전히 컨텐츠 위젯 에러 발생 및 질문 [1] file 2011.12.31 by Cody
순수의시절 호환성 오류 조사....... [1] 2011.12.31 by NA답답이
강병권735 1.5.1.1 받고서...  
paulryu03 [1.5.1.1] 아직도 여전히 게시판의 회원권한설정이 수정 안되네요... 난감... [9] 2011.12.31 by Goos
라르게덴 XE1.5 정식 배포하기전에 제발 코딩 가이드라인 좀 지키세요. [9] 2020.03.14 by 쏭바강
초보모임 xe 플래닛(planet) 에서요..ㅠ  
EnterTM php 5.3 은 원래 xe data export tool 이 동작을 안하나요?  
으잉~ files/cache/menu 에  
k02092000 포인트 모듈 관련 설문조사 [11] 2011.12.30 by 서비여
프로글래머김 안녕하세요~ [2] 2011.12.30 by 프로글래머김
서비여 XE 사이트 관리자가 누구입니까? [4] 2011.12.29 by 서비여
_writer 1.4.10 -> 1.5.1 업데이트 후 발생한 문제들. [2] 2011.12.30 by 디카랑
러키군 요즘 만들고있는거... [11] file 2011.12.29 by 노닉네임
정찬명 XE 1.5.1.1 알파 테스트가 시작 되었습니다. [20] 2011.12.29 by 비스타
정찬명 [공헌자/커미터/활동가/추천인/캠프후기당첨자] 명단+배송여부 최종 확인(25일 까지) [17] 2011.12.28 by CMD
도라란 RSS페이지 디자인 해서 사용중이신 분 계신가요? [3] 2011.12.28 by Treasurej
서비여 ie8에서 .htc 파일이 문제를 일으키네요. [5] 2011.12.28 by Community
도라란 모바일에서 위지윅 에디터를 일반과 분리시키는건 어떨까요? [2] 2011.12.28 by 도라란
웹 엔진 이 자료들 XE로 바꿔보는건 어떨까요? [6] 2011.12.27 by 순수의시절