울타리
{ PROTECTS YOUR SYSTEM FROM MALWARE }
최신 버전 : 2.7, 업데이트 날짜 : 2009년 3월 26일
 울타리는 매우 간단하고 쉬운 악성 코드 제거 프로그램입니다. 간단하게 보이지만 매우 강력한 악성 코드 제거 성능을 자랑하며, 완전 무료인 프로그램입니다.
 이미 많은 사용자들이 감격의 성능을 경험하고 있는 울타리, 지금 바로 경험해보세요!

 P.S. 울타리란 이름은, 자신의 컴퓨터를 안전한 울타리 안에 두어, 외부의 악성코드들로부터 보호한다는 순 한글 이름입니다.
[ 자세히 알아보기... ]
울타리
{ PROTECTS YOUR SYSTEM FROM MALWARE }
최신 버전 : 1.77, 업데이트 날짜 : 2008년 5월 22일
 울타리는 매우 간단하고 쉬운 악성 코드 제거 프로그램입니다. 간단하게 보이지만 매우 강력한 악성 코드 제거 성능을 자랑하며, 완전 무료인 프로그램입니다.
 이미 많은 사용자들이 감격의 성능을 경험하고 있는 울타리, 지금 바로 경험해보세요!

 P.S. 울타리란 이름은, 자신의 컴퓨터를 안전한 울타리 안에 두어, 외부의 악성코드들로부터 보호한다는 순 한글 이름입니다.
[ 자세히 알아보기... ]

개꿈닷넷에서 배포하는 무료 프로그램 받으러 가기!!

Microsoft Visual C++ 8.0 Runtime Library 의 Protection 기능.

주제 : Visual C++ 8.0 에서 새롭게 시작된 일종의 Protection 에 대한 내용이다.

내용 :
대부분의 사람들이 컴파일 된 실행 파일을 그대로 사용한다. 하지만, 여러가지 사정으로 인하여 그렇게 하지 못하는 사람도 있게 되는데, 여기서는 Packer 를 만들고 있는 사람들에 대하여 Visual C++ 8.0 이상에서 컴파일 한 바이너리에 대한 내용을 다루고자 한다.

이 내용은 꽤 오래된 고전 적인 내용이지만, 필자의 게으름으로 인하여 알지 못하고 있던 것 중 하나이다.

Protection 이라고 하는 것은 자신이 정상적인 상태(프로그래머가 의도한 대로 동작하는 상태)라는 것을 보장하기 위한 일종의 덫이다. 정상적인 상태에서만 있어야 할 것들을 체크하여, 정상적이지 않은 상태에 있는 경우에 '낙오' 를 시키는 것이 Protection 의 기본적인 컨셉이라고 할 수 있다. 여기서 Protection 에 대하여 이야기하는 것은 우리가 Protection 에 대하여 더 이상 방관자가 될 수 없기 때문이다.

이 말을 좀 더 자세하게 이야기하자면, 기존의 Protection 의 영역이 일부 프로그래머들에 의한 일부 Software 에서만 있어왔었다면, 이제 이것이 대부분의 프로그래머들이 사용하는 Visual C++ 에도 적용이 되었다는 이야기이다. 운영체제와 같은 저수준의 시스템 프로그래밍에 관심이 많은 프로그래머라면 운영체제의 일부 중요한 Software 의 경우에는 자체적으로 Anti-Debugging, Anti-Cracking 에 관련된 코드가 들어있다는 것을 알고 있을 것이다. 즉, 아주 오랜 예전 부터 자신을 보호하기 위한 기능들은, 우리 옆에 존재하여 왔었다. 10 여년 전의 Windows95 에서도 있었던 것이지만, 이러한 것들은 시스템의 깊숙한 곳을 분석하는 일부 프로그래머들이나 해커들에게만 알려져있었던 내용이다. 하지만, Visual C++ 8 이 나오면서 부터, 이러한 것이 더 이상 시스템의 깊숙한 곳에서만 존재하지 않고, 우리가 만드는 거의 대부분의 프로그램에 기본적으로 들어가는것이 되었다.

한가지 간단한 실험을 해 보면서 이 기능에 대해서 좀 더 자세하게 이해하여 보도록 하자.
먼저 Visual C++ 8 버전(2005)을 실행하여, MFC 프로젝트를 생성한다. 생성할 때, MFC 사용은 정적 라이브러리에서 MFC 를 사용하도록 한다.

그리고, 아래의 그림에서처럼, 속성 페이지에서 '문자 집합' 을 멀티바이트 문자 집합 사용으로 한다.

사용자 삽입 이미지


이제 다음과 같은 코드를 넣고 컴파일 한다.

void CMSVCRT80PROTECTDlg::OnBnClickedOk()
{
    char pszTemp[1024];
    sprintf_s(pszTemp, "Microsoft Visual C++ 8.0 Runtime Library Protection (%f)", rand());
    AfxMessageBox(pszTemp);
}

그리고 실행을 하게 되면, 정상적으로 실행이 되는 것을 볼 수 있다. 이제, PE 파일의 섹션을 변경시켜 보도록 하자

사용자 삽입 이미지


위의 그림은, 실행 파일의 rdata 섹션의 속성에 Read/Write 옵션을 준 것이다. 이렇게 한 이후에 프로그램을 실행 시키면 다음과 같은 에러를 볼 수 있다.

사용자 삽입 이미지











이 이상한 에러는 Visual C++ 8.0 부터 발생하며, CRT 라이브러리 함수를 꼭 사용하여야 한다. 또한, floating point 에 관련된 코드가 있어야 한다.

일종의 Protection 인 이 기능은, 컴파일러가 컴파일을 할 때, C runtime library 에서 사용하는 데이터들이 Read only Section 에 들어가게 되는 경우, 실행시에도 Read only Section 에 존재하는지를 한번 더 검증하도록 하는 코드를 함께 컴파일 한다. 만약, 실제 실행시 이 검사가 실패하게 되면, Runtime library 는 위의 그림과 같은 에러를 내도록 하게 한다.

즉, 일반적인 프로그래머들이 PE 헤더를 바꿀 일 은 없으므로, 이러한 문제를 만날일은 없지만, PE 헤더를 바꿀 필요가 있는 특별한 프로그래머들은, 이러한 문제를 만날 수 있게 된다. 이 문제를 해결하기 위해서는, 관련 Runtime library 함수가 실행되기 전에 실행되고 있는 메모리 상의 PE 헤더의 값 중, 데이터가 있는 섹션(rdata)의 값을 처음 컴파일 되던 상태(보통 0x40000040) 으로 바꾸어 주어야 한다.

Spell
{ KICK OFF WWW'S PROTECTION }
최신 버전 : 1.5, 업데이트 날짜 : 2008년 3월 21일
 'Spell' 이란 '주문' 이라는 의미를 가진 단어입니다.

 즉, 펌 방지가 걸려있는 사이트에 마법의 주문을 걸어 펌이 가능하도록 해 준다는 의미에서 지어진 이름입니다.
 어떤 것인지 잘 모르시겠다구요?

 그렇다면 이 페이지(예제 페이지)를 참고하여 보시면 바로 이해가 가실 것입니다.
[ 다운로드 ] [ 자세히 알아보기... ]
[개꿈닷넷에서 배포하는 공짜 프로그램 다운받기!]
마이크로소프트웨어 4월호에 쓴 글의 내용입니다.

1. 제어판 프로그램 사용하기 (그건 이렇습니다)
 - 제어판 프로그램을 내 프로그램 안에서 실행시키는 방법을 알아봅니다. 더불어 제어판 프로그램에 대한 간단한 설명과 분석, 만드는 방법등을 알아봅니다.

2. GlobalMemoryStatus 에서 겪는 실수
 - GlobalMemoryStatus 에서 겪을 수 있는 실수를 확인해보고 해결할 수 있는 방법을 봅니다.
이번 울타리 업데이트(1.75) 에서는, 다른 프로그램과의 오진 내용을 수정하였습니다.

또한, 앞으로 있을 1.76 버전의 업데이트 사항 중 하나를 미리 알려드리자면,

방화벽 소프트웨어에서 파일로 리스트를 저장하고 불러오는 기능을 추가한 것입니다.
http://jsjang.tistory.com/trackback/426

혼자서만 이상하다고 생각했는데 뭔가 문제가 있나보다...ㅋ

자세한건 알려주지 않는 회사들이라 참으로 갑갑하기만 하다 :)
매번 아무 생각 없이 써온 함수인데, 최근에서야 문제점을 알았다.

MSDN 을 보니 어느샌가 아래와 같은 것이 추가 되어 있었다

GlobalMemoryStatus Function

[GlobalMemoryStatus can return incorrect information. Use the GlobalMemoryStatusEx function instead. ]

Retrieves information about the system's current usage of both physical and virtual memory.

잘못된 정보를 리턴할 수 있으니 Ex 함수를 사용하라는 것이었다.

그래서 다시 아래로 내려가 보았더니,

Remarks

On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information, reporting a value of –1 to indicate an overflow. For this reason, applications should use the GlobalMemoryStatusEx function instead.

On Intel x86 computers with more than 2 GB and less than 4 GB of memory, the GlobalMemoryStatus function will always return 2 GB in the dwTotalPhys member of the MEMORYSTATUS structure. Similarly, if the total available memory is between 2 and 4 GB, the dwAvailPhys member of the MEMORYSTATUS structure will be rounded down to 2 GB. If the executable is linked using the /LARGEADDRESSAWARE linker option, then the GlobalMemoryStatus function will return the correct amount of physical memory in both members.

The information returned by the GlobalMemoryStatus function is volatile. There is no guarantee that two sequential calls to this function will return the same information.

라고 되어 있었다.

4GB 이상일때도 문제가 있고, 2GB 에서 4GB 사이인 경우에는 항상 2GB 로 리턴한다는 문제였다. /LARGEADDRESSAWARE 로 실행되면 잘 동작한다지만 항상 그렇게 실행하도록 프로그램을 작성하는 것은 옳지못한 방법이다.

그래서 결과적으로 메모리 정보를 얻어오는 부분을 수정하기로 했다. Ex 로...

파일 최적화에서 '내 컴퓨터' 를 선택하였을 경우, 정상적으로 검색을 못하고 종료되지 않는 버그가 있었습니다.

현재 수정되어 3.2 버전에 반영될 예정입니다.

알려주신분 : 홍의표 (http://www.cyworld.com/koky)

+ Recent posts