포럼
Conory 님의 PHP 인코더의 디코더를 만들어봤습니다.
2014.04.19 12:23
Conory 님의 사이트에서 상당히 흥미로운 기능을 발견했었습니다.
PHP 소스 코드를 암호화하는 PHP 인코더 (http://www.conory.com/box/phpencoder.php) 기능을 제공하시더라구요~
알고 보니까, Conory 님의 모듈의 라이센스 관련 부분도 수정할 수 없도록 본 프로그램으로 인코딩이 되있더군요.
<?php eval(gzinflate(base64_decode('DZc1ssUIDgCPszPlwEy...
이런식으로 PHP 코드가 난독화(암호화?) 됩니다.
하여간, 여러가지 암호화 해보면서 가지고 놀다가, 인코더만 존재하고, 디코더가 없길래 직접 한번 제작해봤습니다.
본 디코더는 개인의 공부 목적으로 개발해본것이며,
디코더가 배포될 경우 인코더를 사용하시는 분들에게 피해가 생길 가능성이 존재하므로,
본 디코더는 외부에 공개하거나 배포되지 않습니다. 디코더 관련 문의는 정중히 사양하겠습니다.
우선 저는, .NET 프로그래밍해서 프로그램으로 제작하였습니다.
암호화된 소스 코드를 넣고서 DECODE ENC4PHP NOW! 버튼을 눌러주면~
이렇게 다시 원본 소스 코드로 복호화되게 됩니다.
테스트에 사용된 소스는 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 마켓이나 기타 등등에서 모듈을 구매하시는 분들 중, 관련 지식이 풍부한 개발자가 아닌 이상에는, 암호화를 해독할 수 있는 능력을 가진 분들은 거의 없을거라고 생각합니다. ^^;
댓글 3
-
마끼아또
2014.04.19 12:32
-
StyleRoot
2014.04.19 12:35
아아.. 자기 자랑이 아니고, 인코더 자체가 Conory 님이 제작하신 인코더라서 저에게는 디코더를 배포할 권리가 없다고 판단했습니다. 또한 이걸 배포하게 되면 본 인코더를 사용하시는 분들에게 피해가 갈 수 있다고 생각하기에 배포를 안 하겠다고 선언한 겁니다. 사실, 일반 사용자가 본 디코더가 필요한 경우는 거의 없기 때문이지요...
-
마끼아또
2014.04.19 12:36
아아 그렇게 생각할수도 있겠군요 ㅎㅎ 제가 생각이 짧았네요.
XE 관련 글이 아닌데 XE 관리팀에서 게시글을 어떻게 놔둘지 궁금하군요...
p.s 프로그래밍 실력 멋집니다, 근데 처음부터 배포안할거니 배포해달라고 말도하지말아달라 하는건 흠... 그냥 자기자랑만 하겠으니 보고 칭찬만 해달라 라고 들리는거 같아서요.. 그냥 그렇다구요