[ 리버싱 / 프로그래밍 / 음악 / 게임 / 그 외... ]

레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시


목요일, 10월 27, 2016



Delphi / C++ Builder STARTER EDTION 무료 프로모션


얼마전에 스타터 에디션 무료 프로모션 진행을 한 걸로 아는데...

지금까지 진행이 되고 있는건지... 새로 시작한건지는 모르겠지만 @_@...

일단 공유해봅니다~ :)





아... 이 프로모션 제품들은 1인당 등록횟수가 3회로 제한되어있으니 참고하시기 바랍니다. ^^;;;;





예전에 "x64dbg" 에 대한 내용(http://www.xeronichs.com/2016/01/x64dbg.html)을 포스팅 한 이후로...

틈틈이 x64dbg 를 사용하면서 이것저것 익혀보고 있는데요...

이번에 x64dbg 의 '플러그인' 개발에 대해 포스팅을 해볼까~ 합니다 :)

OllyDBG v1.10 의 경우는 플러그인 SDK 안에 SDK 사용법에 관한 참고자료가 있어서 비교적 쉽게 익혔는데...

x64dbg 는 그런게 없어서 예제 플러그인 소스를 참고하며~ 하나 하나 해보면서 익히고 있는 중입니다.

( 혹시라도 x64dbg 플러그인 개발 관련 내용이 정리되어 있는 곳 아시면 공유 좀... ^^;;;;; )



자~ 그럼 이제 시작합니다 ~ !!!

오늘의 주제는 '내가 개발한 플러그인을 x64dbg 에 로딩시키기' 입니다... @_@

'천리길도 한걸음부터...' 라고 프로젝트 생성부터 시작해봅시다~ 

Visual Studio 프로젝트 생성


Visual Studio 프로젝트 생성 단계 #1

"Visual C++" -> "Win32" -> "Win32 프로젝트" 를 선택하고 프로젝트 이름을 작성합니다.

저는 임의로 'x64dbg_basic_plugin' 이라고 했는데 입맛에 맞게 정하시면 됩니다. ^^;;;

또, 개인적인 편의상 '솔루션용 디렉터리 만들기' 도 해제했습니다...


Visual Studio 프로젝트 생성 단계 #2

Visual Studio 프로젝트 생성 단계 #3

플러그인은 DLL 형태의 모듈이기 때문에 "DLL" 로 지정을 하고,

'빈 프로젝트' 항목에 체크를 해준 다음 '마침' 버튼을 눌러서 프로젝트 생성을 마칩니다.

x64dbg 는 XP 에서도 동작을 하는 걸로 알고 있는데...

프로젝트 속성 옵션에서 XP 에서도 동작하는 바이너리를 생성하도록 설정을 변경해줍니다.

XP 지원하도록 프로젝트 속성 변경


플러그인 SDK 폴더를 프로젝트 폴더로 복사


프로젝트 생성이 완료되면 플러그인 SDK 폴더를 프로젝트 폴더로 복사해줍니다.

x64dbg 압축파일의 플러그인 SDK 폴더

x64dbg 는 친절하게도(?) 디버거와 플러그인 SDK 를 묶어서 제공하는데요...

x64dbg  압축파일을 다운로드 받아서 압축 해제 후,  pluginsdk 폴더만 프로젝트 폴더로 복사합니다.

프로젝트 폴더에 플러그인 SDK 폴더 복사


플러그인 소스파일 작성


플러그인 소스파일 작성

소스파일의 이름을 입맛에 맞게 작성하신 다음 코드 작성을 시작하면 됩니다.


일단 DLL 파일이니까 "DllMain" 이 있어야겠죠...?

// plugin.cpp
//
//-------------------------------------------------------------------
// basic plugin [ x64dbg plugin ]
//-------------------------------------------------------------------

#include <Windows.h>


//-------------------------------------------------------------------
// DllMain
//-------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
    return TRUE;
}

이렇게만 작성하고 '빌드' 를 해보면 DLL 파일이 생성이 될겁니다 :)


이 텅 빈 DLL 을 x64dbg 플러그인 형태로 바꿔봅시다~ :)

먼저 pluginsdk 폴더의 "_plugins.h" 파일을 인클루드하고~

"x32dbg.lib" 라이브러리 파일을 포함하도록 코드를 추가해줍니다.

( 64비트용 플러그인을 만들때는 "x64dbg.lib" 라이브러리 파일을 포함하면 됩니다. )

#include "pluginsdk\_plugins.h"

#pragma comment(lib, "pluginsdk\\x32dbg.lib")


다음은 플러그인 이름과 버전에 대한 내용을 설정해줍니다.

//-------------------------------------------------------------------
#define plugin_name "BasicPlugin"
#define plugin_version 1


이제 x64dbg 가 플러그인이라고 인식할 수 있도록 export 함수("pluginit")를 작성해줍니다.

int g_iPluginHandle;

//-------------------------------------------------------------------
extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);

//-------------------------------------------------------------------
__declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct)
{
    initStruct->sdkVersion = PLUG_SDKVERSION;
    initStruct->pluginVersion = plugin_version;
    strcpy_s(initStruct->pluginName, 256, plugin_name);
    g_iPluginHandle = initStruct->pluginHandle;

    return true;
}

테스트를 해본 결과 "pluginit" 함수만 있어도 플러그인으로 인식을 하더라구요.. @_@;;

pluginit 함수는 위의 코드처럼 PLUG_INITSTRUCT 구조체의 값을 채우도록 구현을 하면 됩니다.

sdkVersion, pulginVersion, pluginName 의  세 항목들은 값을 넣어줘야하고...

pluginHandle 은 값을 넣는게 아니라 다른 변수에 값을 복사해둡니다. @_@;;;


이 코드들을 몽땅 합치면 아래와 같이 되겠네요...

// plugin.cpp
//
//-------------------------------------------------------------------
// basic plugin [ x64dbg plugin ]
//-------------------------------------------------------------------

#include <Windows.h>

#include "pluginsdk\_plugins.h"

#pragma comment(lib, "pluginsdk\\x32dbg.lib")

//-------------------------------------------------------------------
#define plugin_name "BasicPlugin"
#define plugin_version 1

int g_iPluginHandle;

//-------------------------------------------------------------------
extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct);

//-------------------------------------------------------------------
__declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct)
{
    initStruct->sdkVersion = PLUG_SDKVERSION;
    initStruct->pluginVersion = plugin_version;
    strcpy_s(initStruct->pluginName, 256, plugin_name);
    g_iPluginHandle = initStruct->pluginHandle;

    return true;
}

//-------------------------------------------------------------------
// DllMain
//-------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
    return TRUE;
}


이렇게 작성한 코드를 빌드하면 DLL 파일이 나올텐데요~

이 DLL 파일의 확장자를 'dp32' 로 바꾸고 32비트용 디버거의 'plugins' 폴더에 복사한 다음...

32비트용 디버거를 실행시키면 다음과 같이 플러그인이 로딩되는 걸 확인할 수 있습니다.

플러그인이 로딩되었다는 로그

64비트 디버거용 플러그인을 빌드할 때는 라이브러리 파일을 "x64dbg.lib" 로 바꾸고 빌드를 합니다.

DLL 파일이 생성되면 확장자를 'dp64' 로 바꿔서 64비트용 디버거의 'plugins'  폴더에 복사하면 됩니다.


여기까지 플러그인 껍데기(?)를 만들어서 x64dbg 에 로딩시키는 걸 알아봤구요...

다음 내용부터는 조금씩 플러그인 알맹이를 채워나가 보도록 하겠습니다 ~ :)


[ BasicPlugin 소스 다운로드 ]






토요일, 10월 22, 2016



이전 블로그에 해당 주제를 정리해 둔 포스팅(http://iam-hs.com/146)이 있지만~

내용을 조금 업데이트해서 새 블로그에도 올려봅니다. ^^;;;


VirtualBox 에서 '직렬 포트' 설정

먼저 VirtualBox 에서 Guest OS 의 '직렬포트' 를 설정합니다.


Guest OS '직렬포트' 설정

'직렬 포트 사용하기' 체크 박스를 클릭해서 활성화 시키면 하위 항목들에 대한 추가 설정이 가능해집니다.

'포트 번호' 는 그대로 "COM1" 로 두고, '포트 모드' 를 "호스트 파이프" 로 변경하고...

'존재하는 파이프/소켓에 연결' 항목을 클릭해서 체크 표시를 없애줍니다. (꼭!!!)

'경로/주소' 는 "\\.\pipe\[원하는이름]" 의 형태로 설정합니다.


참고로  '존재하는 파이프/소켓에 연결' 항목이 체크되어 있으면... 

Guest OS 구동 시 아래와 같은 오류가 발생합니다. -_-;;;


'존재하는 파이프/소켓에 연결' 에 체크가 되어있으면 오류 발생

Guest OS 의 부팅 옵션 설정

VirtualBox 에서 '직렬 포트' 설정을 마친 후엔... 

실제 Guest OS 안에서 커널 디버깅이 가능하도록 부팅 옵션을 변경해줘야 합니다.

WinXP 까지는 boot.ini 파일을 편집해서 설정이 쉬웠지만, 

비스타 부터는 "BCDEDIT" 를 이용해야 되기에 다소 귀찮아졌습니다. oTL;;;


관리자 권한으로 '명령 프롬프트' 를 실행해서 "BCDEDIT" 를 이용해봅시다~~ :)

부팅 로더 추가 후 디버그 모드 활성화

"BCDEDIT" 를 실행하면 기본적으로 'Windows 부팅 로더' 에 {current} 하나가 있을 겁니다.

이 {current} 로더를 이용해도 되지만, 저는 커널 디버깅용 로더를 따로 구성하는 방식으로 진행했습니다.


BCDEDIT /copy {current} /d "부팅시 화면에 보일 설명"
- "/copy" 옵션으로 {current} 로더와 동일한 로더를 하나 추가합니다.
- "/d" 옵션으로 부팅 시 화면에 보일 내용을 설정합니다.

※ 저는 기존의 description ("Windows 8.1") 뒤에 "[DEBUG]" 를 추가했습니다.
BCDEDIT /set {복사한 로더} debug on
- "/set" 옵션으로 복사한 로더에 디버깅이 가능하도록 설정합니다.

디버그 환경 설정

BCDEDIT /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
- "/dbgsettings" 옵션으로 디버그 환경을 설정합니다.

※ "직렬 포트 : COM1" 을  이용하기 위해 SERIAL DEBUGPORT:1 로 설정합니다.

Guest OS 의 부팅 옵션 설정이 정상적으로 되었다면 재부팅 시 멀티 부팅 화면이 뜰 겁니다.

'기본 부팅'과 '디버그 가능 부팅'

WinDbg 에서 커널 디버깅 설정

마지막으로 WinDbg 에서 커널 디버깅을 설정합니다.

"File -> Kernel Debug..." 메뉴를 실행 후 'COM" 탭으로 변경~

WinDbg 의 커널 디버깅 설정

'Baud Rate' 항목은 Guest OS 에서 설정한 값인 "115200" 로 지정을 하고...

'Pipe' 항목에 체크...!!!

'Port' 항목엔 VirtualBox 직렬 포트 설정에서 입력한 경로를 그대로 입력합니다.


'확인'을 누르면...

OS 연결 대기 상태

디버깅할 대상을 기다리는 대기 상태가 됩니다.

이 상태에서 Guest OS 의 '디버그 가능 부팅' 을 선택하면...

OS 인식

Guest OS 에 연결되었다는 메시지가 뜨면서 커널 디버깅이 가능해집니다 ~ :)





토요일, 10월 15, 2016



어제까지 멀쩡하게 동작하던 Visual Studio 2015 (Community) 가

오늘은 뭔가 상태가 이상해졌습니다... -_-;;

테스트 코드 작성을 위해 Visual C++ 프로젝트를 생성하려는데 ~

프로젝트 생성 단계로 넘어가지 않고 "새 프로젝트" 대화창만 반복해서 뜨더군요... o_O!?!?

딱히 오류 메시지가 뜨는 것도 아닙니다... 그냥 대화창만 반복해서 뜰 뿐..;;;

( 혹시나 해서 C# 프로젝트를 생성해봤는데 그건 또 잘되더군요..;;;; )


Visual Studio 자체에 뭔가 문제가 생겼나 싶어 곰곰히 생각을 해보니...

어제 Visual Studio 업데이트를 설치한 게 떠올랐습니다.


뭔가 구성요소 부분이 바뀌었나 싶어서 확인을 해봤습니다.

"제어판" -> "프로그램 및 기능" 에서 Visual Studio 2015 항목을 찾고~

마우스 오른쪽 버튼을 눌러 "변경" 클릭!








위와 같은 창이 뜨면~ "수정" 클릭!






왜 그런지는 모르겠지만 "Visual C++ 2015용 일반도구" 부분이 체크가 해제되어 있더군요;;

처음 설치할 때는 당연히 선택을 해줬고... 

그 후 업데이트를 할 때도 저 항목 대한 옵션을 변경한 적은 없는데 말이죠... @_@;;;


암튼... 다시 "Visual C++ 2015용 일반도구" 항목을 체크하고 진행합니다.





이렇게 구성요소를 새로 설정을 해주니 프로젝트 생성이 잘 되더군요~~ :)


잘되던 프로젝트 생성이 업데이트 후 갑자기 안된다~ 싶으신 분들은

구성요소 확인을 해보시기 바랍니다.




금요일, 2월 26, 2016



예전부터 "TitanEngine" 이라는 이름을 간간이 보긴 했지만

그냥 신경 쓰지 않고 지나쳤는데...

x64dbg 에서 "TitanEngine" 을 사용한다는 내용을 보고

다시 봤더니 리버싱 SDK 였군요...;;;



나온 지는 꽤 오래된 걸로 아는데 이런 SDK 라는 걸 이제야 알게 되다니... oTL;;;

오픈소스인지라 SDK 소스도 공개되어 있는데...

리버싱에 관심 많은 분들이 공부하는데 도움이 되지 않을까 싶네요 :)



TitanEngine

[ 사이트 : http://reversinglabs.com/open-source/titanengine.html ]

Features

  • Integrated x86/x64 debugger
  • Integrated x86/x64 disassembler
  • Integrated memory dumper
  • Integrated import tracer & fixer
  • Integrated relocation fixer
  • Integrated file realigner
  • Functions to work with TLS, Resources, Exports, 


[ TitanEngine 을 이용한 Unpacker 구현 ]






금요일, 2월 19, 2016



티스토리를 쓰다가 Blogger 로 넘어왔을 때...

가장 아쉬운 점이 '카테고리(Category)'의 부재였습니다.


티스토리의 카테고리

Blogger 레이아웃 메뉴에서 이것저것 만지다보니

"라벨(태그)" 가젯으로 카테고리처럼 꾸밀 수 있더군요 @_@;;;


태그(라벨) 가젯 설정

블로그의 게시물에 지정된 라벨들 중 원하는 일부만 표시하는 것이 가능한데...

보여줄 라벨을 선택한 다음 표시 방법을 '목록' 으로 지정하면...?


라벨(태그) 가젯을 이용한 카테고리

이렇게 보여집니다 :)

각 카테고리에 해당하는 게시물을 작성할 때는 라벨만 지정해주면 됩니다.


라벨 가젯을 이용하는 게 가장 쉽고 편하지만...

아쉬운 점이 있다면 표시되는 카테고리의 순서를 임의로 지정할 수가 없다는 건데요.

HTML/JavaScript 가젯에 HTML 코드를 입력해서 카테고리를 만들 수도 있습니다.


라벨 가젯을 이용한 카테고리 HTML 소스

HTML/JavaScript 가젯에 카테고리 HTML 코드 입력

HTML 코드를 직접 입력하면 화면에 표시되는 카테고리의 순서를 바꿀 수도 있고

카테고리명을 실제 라벨과 다르게 지정할 수도 있습니다 :)


<script type="text/javascript">
//<![CDATA[
function getPostCount(json) {
 document.write(json.feed.entry.length);
 }
 //]]>
</script>
<ul>
<li>
<a dir="ltr" href="http://www.xeronichs.com/search/label/game">game</a>
<span dir="ltr">(<script src="http://www.xeronichs.com/feeds/posts/default/-/game?&alt=json-in-script&callback=getPostCount"></script>></span>
</li>
<li>
<a dir="ltr" href="http://www.xeronichs.com/search/label/music">music</a>
<span dir="ltr">(<script src="http://www.xeronichs.com/feeds/posts/default/-/music?&alt=json-in-script&callback=getPostCount"></script>)</span>
</li>
<li>
<a dir="ltr" href="http://www.xeronichs.com/search/label/programming">programming</a>
<span dir="ltr">(<script src="http://www.xeronichs.com/feeds/posts/default/-/programming?&alt=json-in-script&callback=getPostCount"></script>)</span>
</li>
<li>
<a dir="ltr" href="http://www.xeronichs.com/search/label/reverse%20engineering">reverse engineering</a>
<span dir="ltr">(<script src="http://www.xeronichs.com/feeds/posts/default/-/reverse%20engineering?&alt=json-in-script&callback=getPostCount"></script>)</span>
</li>
</ul>

각 카테고리에 포함된 게시물 수를 가져오기 위해 JavaScript 를 썼는데...

카테고리마다 호출하는 것이 내키지 않아서 실제로 적용은 하지 않았습니다. oTL;;;

게시물 수를 보여줄 수 있는 더 깔끔한 방법이 없는지 찾아보는 중입니다.


일단 결론은 Blogger 에서도 카테고리 구현이 가능한 걸로... @_@ !!!



화요일, 2월 16, 2016



대략 3년 전...

지인 블로그를 구경하다 이 에디터를 처음 알게 되었습니다.

[ 에디터 열전 | 괴짜 프로그래머의 일상사~ ]

글 처음부터 대세 에디터라고 소개를 해두셔서~

호기심에 이것저것 찾아봤던 기억이 나네요.


Subliime Text 사이트 화면
사이트 : [ http://www.sublimetext.com ]


사이트에 실려있는 기능 소개 영상(?)에 감동받고 바로 다운로드했습니다. ㅋㅋㅋㅋ

처음 실행했을 때의 느낌은 '막막함' 이랄까요...?

글꼴도 바꾸고 글꼴 크기도 조절하고 입맛에 맞게 변경하고 싶은데

'설정 창' 같은 게 없어서 꽤나 당황하기도 했습니다.


Sublime Text 3 ~ 설정 값 (JSON 형식)

메뉴 'Preferences -> Settings - User' 를 클릭하면 설정파일이 열리는데~

해당 파일에 원하는 항목들을 한 글자 한 글자 직접 입력을 해야하더군요... @_@;;;

Vim 에서 ".vimrc" 파일을 직접 수정하는 것과 같은 방식이라고 보면 될 듯 합니다.


초기 설정부터 다소 애를 먹긴 했지만... 그 과정을 지나니 신세계가... @_@!!!

덕분에 구매까지 하게 되었네요... :)


윈도우에서도 Sublime Text 3

리눅스에서도 Sublime Text 3

Sublime Text 3 장점


- 윈도우즈, 리눅스, OS X 의 다양한 운영체제 지원

- "Package" 설치를 통해 기능 확장 가능 

- 다중 커서 편집

- 가벼움

- 비등록 상태에서도 기능상 제약 없음


Sublime Text 3 단점


- 한글 IME 지원 문제 ( 리눅스에서는 '한글' 을 입력하기가...;;; )
   => 우분투 계열이라면 "uim-byeoru" 입력기 설치로 해결 가능

- EUC-KR 인코딩 지원 문제 ( Sublime Text 3 는 기본적으로 "UTF-8" 지원 )
   => "ConvertToUTF8" 패키지 설치로 해결 가능


마치며...


'한글' 지원이 미약하다는 단점이 있지만 해결 방법이 있어서 크게 불편하지는 않습니다.

구매한 이후로 쭉~ 메인 에디터로 사용 중인데 상당히 만족스럽습니다 :)

개발자용 에디터를 찾는 분들께 Sublime Text 3 강력 추천합니다 !!





월요일, 2월 08, 2016



Blogger 를 처음 만든게 1월 28일...

이것저것 꾸미기 시작한지도 열흘 정도 지났네요 @_@;;;

티스토리에 너무 익숙해져 있다보니 적응이 덜 되어 불편하게 느껴지는 부분도 다소 있구요. (ㅠㅠ)


Blogger 에서 제공해주는 기본 템플릿이 적용하긴 편하지만...

뭔가 가려운 곳을 확 긁어내주는 그런 느낌이 부족한지라

고민하다가 템플릿을 바꾸기로 결정 ~ !!


New Blogger Themes


New Blogger Themes 라는 사이트가 있길래 들어가보니

"Busby" 라는 템플릿이 눈에 딱 들어오더군요... @_@


Template Name : Busby

Author : NewBloggerThemes

Designer : WP Lift

Published Date : March 19, 2013

Updated Date: January 27, 2016

Advanced Details:

http://newbloggerthemes.com/busby-blogger-template/ 



템플릿 파일을 받은 후, 블로그 설정 -> '템플릿' 메뉴에서 '백업/복원' 을 통해

내려받은 템플릿 xml 파일을 복원시키니 적용이 되더군요... (우와 +_+ )





일단 전체적인 템플릿 틀은 적용이 됐는데, 세세한 설정이 생각보다 번거롭더군요... oTL;;;

가젯들도 일일이 다시 설정해줘야 되고...

특히나 번거로운 부분은 기본 제공 템플릿이 아니다보니

템플릿 '맞춤설정' 이 지원되지 않는 점 이랄까요;;;

HTML 코드 하나하나 뒤져가면서 이것저것 손을 봐야 했습니다.


설정이 어느 정도 마무리가 됐다 싶을때...

' 뭔가  설정을 잘못했나? ' 싶은 생각이 드는게...


undefined ..!? @_@;;

날짜를 보여줘야 되는 노란 원에 "undefined" 라는 문자열이 뜨더군요...;;;




템플릿의 소스코드에는 이렇게 되어있는데...

<data:post.timestamp/> 값의 형식에 따라서 date_dd, date_mmm 값이 들어가지 않을 수도 있고...

제 블로그가 딱 그 상황이더군요.

해당 값 형식은 블로그 설정 -> '언어 및 서식' 에서 변경이 가능합니다.


원하는 걸로 설정 ~


아... 참고로 저는 '시간형식' 대신 '날짜형식'을 변경하고 스크립트를 살짝 수정했습니다.




<data:post.timestamp/> 부분을 <data:post.dateHeader/> 으로 변경~


날짜가 딱~! 수정 성공적~!


날짜가 딱~! 보일 때의 그 뿌듯함이란...ㅋㅋㅋㅋㅋ


HTML, CSS 이런 웹쪽은 잘 몰라서 매번 어버버하고 있지만...

그런만큼 입맛에 맞게 변경해 나가는 재미는 더 큰 거 같아요~!


오늘은 여기까지...






화요일, 2월 02, 2016



티스토리 시절부터 계속 써오던 SyntaxHighlighter 를 이 곳에도 적용했습니다.

Blogger 는 임의로 css / js 파일 등을 업로드 할 수가 없는 것 같아서...

호스팅 버전을 그대로 끌어와서 쓰는 걸로... =_=;;;
( 참고 : http://alexgorbatchev.com/SyntaxHighlighter/hosting.html )


설정 방법은 복잡하진 않네요.

Blogger 설정 -> '템플릿' -> 'HTML 편집' 에서 필요한 코드를 추가하면 끝 !











저는 <head> 태그 밑에 바로 추가했는데 별 문제는 없는 듯 하네요.

[ 테스트 코드 ]
int main()
{
    // =_=;;;

    return 0;
}


ps.

템플릿 수정 해두고 테스트 게시물 간단하게 작성해서
'미리보기' 로 계속 확인하는데 이상하게도 적용이 되지 않더군요.
이 자료 저 자료 뒤져가며 계속 삽질하다가 실수로 '게시'를 해버렸는데
게시한 상태에서는 제대로 나오더군요... =_=;;;;

'미리보기' 상태에서 안나오길래 계속 스트레스 받고 있었건만... oTL



카테고리

가장 많이 본 글

통계

Copyright © XeroNic(HS) BLOG | Powered by Blogger
Design by WP Lift | Blogger Template by NewBloggerThemes.com