4/29/2010

Eazfuscator.NET Obfuscator

Obfuscation(난독화)에 관련된 기본 지식은 위키서광렬님의 블로그를 참조하자.

.NET Framework에서는 C#, VB.NET등과 같은 Managed .NET code로 쓰여진 코드는 .NET 언어 Compiler에 의해  CIL(Common Intermediate Language, = MSIL)로 만들어지고 JIT(Just-In-Time Compiler)에 의해서 Native Code로 변환되고 CLR(Common Language Runtime)위에서 구동된다. 이러한 이유로 .NET Framework가 설치된 Device에서는 CIL 덕분에 어떤 프로그래밍 언어(단, Managed Code)로 작성된 프로그램이든 실행이 된다. 하지만 소스 보안 측면에서 보면 CIL만 있다면 손쉽게 소스코드를 열어볼 수 있음을 의미한다. (맞겠지...??)

Managed Code로 작성된 프로그램은 .NET Reflector(Reflector를 정복하기 위해서는 남정현님의 블로그[또는 데브피아]를 참조하자. - 최신버전 설명서는 아닌듯!?)를 통해 원본 소스와 거의 비슷하게, 심지어 다른 언어로까지 변환이 된다.

소스 보안을 위해 보통 obfuscator를 사용하곤 하는데 최근 알게된 소프트웨어를 소개할까 한다. GNU GPL 라이선스(무료라는 얘기!)를 가진 Eazfuscator.NET 이다.
Eazfuscator.NET를 사용하면 Reflector를 통해서는 원본 소스를 판단할 수 없게 된다.


사용법을 알아보자.

  1.  Eazfuscator.NET을 설치
  2.  Visual Studio 2008의 Tools Menu에 Add-in 된 것 확인.
  3.  Tool > Eazfuscator.NET Assistant 실행.(그림 1, 2)
  4.  Solution Explorer에서 Obfuscation하길 원하는 Project를(Solution이 아님) 끌어다 녹색바탕에 드래그 앤 드랍.
  5.  Obfuscation이 진행. 그리고 완료.
  6.  Obfuscation이 끝나면VS 2008에서 해당 Project가 변경되었으니 다시 로드할꺼냐고 묻는다. Reload버튼을 눌러주자.
  7.  Release Mode로 두고 Project Build. -끝-


 



그림1. Add-in된 Eazfuscator.NET









 그림 2. Eazfuscator.NET가 실행된 모습






Eazfuscator.NET을 사용한 결과는 아래와 같다.

Before Obfuscation

 After Obfuscation

Analyze the ISO 8583 Protocol


Hypercom T4220 Terminal
Hypercom T4220 Terminal
오른쪽에 보이는 Hypercom 단말기에서 생성되고 전송되는 ISO 8583 Message를 분석하는 Project를 하게되었다. Network팀에서 Wireshark프로그램으로  캡쳐한 패킷을 분석하는 일이다.

먼저 ISO 8583에 대해 알아보자.

ISO 8583이란?
ISO 8583은 위키에서 다음과 같이 정의하고 있다.
ISO 8583 Financial transaction card originated messages — Interchange message specifications is the International Organization for Standardization standard for systems that exchange electronic transactions made by cardholders using payment cards.
한국표준정보망에서는 '금융 거래 카드 발원 메시지-교환 메시지 규격'으로 정의하고 있다.


간단하게 말하면, 신용카드등을 소유하고 있는 Cardholder들이 상품구매나 ATM기기에서 돈을 뽑는 등 Card를 사용할 때 발생하는 Card Transaction 정보를 표준으로 만든 것이다.(적어도 난 그렇게 이해했다 -_ㅠ)




ISO 8583의 구성
ISO 8583은 크게 다음과 같은 3가지로 구성된다.
  • Message Type [2byte]
  • Bitmaps [8byte (if secondary bitmap exist, Bitmap length is 16byte)]
  • Fields
위키의 Introduction에서 보듯이 규격 표준이 정의되어 있지만 각 회사마다 Message Format에 맞춰 Message Type 및 각 Field 들을 재정의해 사용한다.

Message Type은 현재 Message의 제목이나 이름과 같다.
Bitmaps는 현재 Message Type에 어떤 Fields들이 포함되었는지 보여준다.
각 Fields는 현재 Message의 정보를 나타낸다.



실제 Message Format의 예를 보며 ISO 8583 의 구성요소를 파헤쳐보자. (아래 설명요소는 Global Payments EAST Spec을 토대로 분석한 것이다.각 Spec에 따라 분석하는데 차이가 있을 수 있으므로 주의하자.)
  1. Message Type:
        항상 2byte로 Sample에서는 1200을 나타낸다.


  2. Bitmaps [8Byte or 16Byte]:
        아래 Sample의 1st Bitmap은 16진수로 '302004032040000a '이다.
        2진수로 바꾸면 '0011 0000 0010 0000 0000 0100 0000 0011 0010 0000 0100 0000 0000 0000 0000 1010' 이다.
        2진수에서 1로 Set되어있는 부분이 어떤 Field가 포함되어있는지를 나타내준다. 위의 2진수를 보면 3, 4, 11, 22, 31, 32, 35, 42, 61, 63번째 Bit가 1로 Set되어있다.
        각 번호는 Spec에 따로 정의되어 있다.


        2진수에서 첫번째 Bit는 2nd Bitmap의 존재여부를 알려주는 Indicator이다.
        이 Bit가 1로 Set되어 있다면 2nd Bitmap이 존재한다. 예를 들어보면 1st Bitmap의 16진수가 'f02404010040000a'라면  2진수는 다음과 같다.
        '1111 0000 0010 0100 0000 0100 0000 0001 0000 0000 0100 0000 0000 0000 0000 1010'

        첫번째 Bit가 1로 Set되어 있기 때문에 뒤에어 나오는 8byte가 2nd Bitmap이 된다.
        2nd Bitmap의 16진수가 '0000000000000004'이라면 2진수는 다음과 같다.
        '0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100'

        따라서 이 16byte Bitmap에서 나타나는 Field는 (1st Bitmap)1, 2, 3, 4, 11, 14, 22, 32, 42, 61, 63 그리고 (2nd Bitmap)126 이다.


  3. Fields
        아래 Sample을 보면 각 Bit에 대응하는 Field들의 이름이 나와있고 각 Field의 길이와 데이터가 나와있다(이러한 정보는 Spec에 정의되어 있다).

        Sample에서 nibble은 1/2 Byte의 숫자를(용어선택이 어려웠다.. BCD로 했어야 했나?) Ascii 는 1Byte의 ASCII 문자를 나타낸다.

        그리고 LL과 LLL은 가변길이를 나타내는데 LL의 경우 첫번째 1Byte가 길이를 지정하고 LLL의 경우 2Byte가 길이를 지정한다. 길이를 결정할 때에는 주의해야한다. 예를 들어 31번 Field acquirer refer data를 보자. 가변길이 LL에서 길이가 2로 지정되어 있다. 현재 ascii 이라서 2Byte가 데이터를 나타내지만 nibble인 경우는 1Byte를 나타내게 된다.

ISO Packet Sample

표 위의 그림은 Wireshark으로 캡쳐해서 얻어온 결과로써, 왼쪽부터 줄버호, ASCII 코드, 일반String 순으로 나열되어 있다.

그림에 나와있는 표는 따로 만든 ISO Packet Analysis 프로그램을 통해 분석한 결과이다.



참고: Wiki - http://en.wikipedia.org/wiki/ISO_8583
    sanjib-swain Blog - http://sanjib-swain.blogspot.com/2009/06/brief-explanation-of-iso-8583-protocol.html






UCharge(Payment Client Module)

1. 프로그램 설명

카드 트랜잭션 패킷을 분석한 내용을 토대로 PC에서 실제로 트랜잭션을 만들어 보내고 승인받는 결제 프로그램을 만들었습니다. 상용 결제 프로그램은 Global Payments와 같은 벤더에게 트랜잭션 메시지가 제대로 생성됨을 인증받는 1차 테스트를 통과해야 합니다. 이 프로그램은 그 1차 테스트를 통과하기 위한 목적으로 만들어졌고, 제가 근무하는 동안 테스트에 통과했습니다.

다음과 같은 카드 트랜잭션을 지원합니다.

  1. Credit - Purchase, Void, Return, Adjustment , Force, Pre & Post Authorization Transaction
  2. Debit - Purchase and Return Transaction
  3. EBT - Purchase, Return, Balance Inquiry, Boucher Clear Transaction
  4. Balance - End of Day Transaction (Host or UCharge Based) 


TCP/IP 방식 또는 Modem을 이용한 Dial-Up방식으로 트랜잭션을 발생시킬 수 있습니다.


프로그램은 MVP(Model, View, Presenter) 디자인 패턴을 이용해 작성되었습니다







2. 프로젝를 통해 배운점


  • 미국 카드 트랜잭션에 관련된 내용
  • Magnetic Stripe, PIN Pad, Modem 사용법 및 제어방법 
  • AT Command 기초 
  • MVP 디자인 패턴 
  • SSL, TripleDES 기초 개념

.






Serial Port를 이용해 단말기(Vx 570)와 통신하기

Verifone Vx 570

System.IO.Ports.SerialPort Class를사용해
Vx 570 단말기에Message를 보냈을때 LRC(Longitudinal Redundancy Check)를 통해
Response Packet의 이상유무를 체크하는 간단한 프로그램을 만들었다.



만들고 보면 간단한 프로그램이었지만 정작 디버깅을 시작했을 땐 SerialPort의 특성을 제대로 이해하고 있지 못했기에 예상치 못한 결과에 당황하곤 했다.

특히 SerialPort.DataReceived 이벤트의 경우에 메인프로그램과 다른 쓰레드에서 돌아간다. 때문에 DataReceived 이벤트가 호출되었다고 해서 전송받은 데이터를 가지고 바로 다른 로직을 처리하려고 하면 모든 데이터가 전송되지 않았기에 예상치 못한 결과를 얻곤 한다.

현재는 Thread.Sleep 메소드를 이용해 모든 데이터를 받아오는데까지 걸리는 시간을 정했지만 나중에 쓰레딩을 좀 더 잘 다루게 되면 이벤트형식이나 Signal로 딜레이 없이 데이터 전송이 완료되면 다음로직을 실행할 수 있게끔 만들어야겠다.



데이터 전송 패킷은 아래와 같다.
"<stx><msg length(2 Bytes)><message><etx><lrc>"

STX(0x02)와 ETX(0x03)으로 패킷의 시작과 끝을 나타내고 LRC로 현재 패킷이 정상인지 확인한다.

LRC를 구하는 소스는 아래와 같다.
private byte getLRC(byte[] msg)
{
    byte lrc = 0;
 
    for (int i = 1; i < msg.Length - 1; i++)
    {
        lrc ^= msg[i];
    }
    return lrc;
}

LRC는  패킷의 각 바이트를 XOR 해서 나온 수이다.
내가 가진 Spec에서는 STX를 제외한 나머지 Byte만을 계산하라 해서 i = 1 부터 루프를 돌렸다.

4/14/2010

Snippet Compiler

프로그래밍하다보면 간단한 코드조각을 테스트해보고 싶을 때가 많다.
그럴때마다 Console Project를 만들고 실행하기엔 귀찮고 시간이 많이 걸리기에
아래와 같은 프로그램을 사용하면 좀 더 빠르게 테스트를 해볼 수 있을 거라 본다.
가볍고 html 로 import도 되니 블로깅할때도 사용할 수 있겠다 +ㅁ+

그치만. 디버깅이 안된다는게 안습 -_-+  너무 많은걸 바라지 말자 ㅎ

다운로드는 아래 링크 클릭
http://www.sliver.com/dotnet/SnippetCompiler/