프로그래밍 강의 (68)
이번에는 IF 문을 이용하여 이런 식으로 코드를 짰다고 가정해봅시다. 보통 이런 경우는 문자열이 메모리상에 저장되기 때문에 쉽게 이메일 주소를 얻을 수가 있습니다만, 우리는 어떤 값을 입력해도 이메일 주소가 나오게 수정을 하고자 합니다. 올리디버거로 열어보면 이런 식의 간단한 어셈블리어로 되어있습니다. 이중 JE ~ 쪽을 눌러봅시다. 빨간 게 꼭 누르고 싶지 않나요? 그런데 옆에 화살표가 00401B5F 즉 알맞은 값을 가리키고 있네요? 여러분은 이제 이것이 IF문과 비슷한 역할을 한다고 생각을 해보아도 될 것 같습니다. 아마 조건이 되면 저 주소로 점프하는 거 같지 않나요? 그래요. 위에 JE 위에 CMP 라고 먼저 조건을 가정하고 점프를 하는 것입니다. 명령어에 관한 내용은 http://shakii...
전 두 에디안을 16 진수의 입장으로 볼 것입니다. 숫자 1000000 은 헥스 값으로 (0x)F4240 입니다. 먼저 리틀 에디안은 어떻게 저장되는지 살펴봅시다. 리틀 에디안으로 저장했을때, (0x)F4240 은 '4042 0F' 로 저장된 것을 보실 수 있습니다. 즉 헥스 값을 뒤에서부터 두 개씩 잘라서 저장합니다. 다음으로 빅 에디안은 어떻게 저장할까요? 빅 에디안은 (0x)F4240 을 보이는 그대로 저장합니다. 그렇다면 굳이 두 방식을 나눠서 이득을 보는건 무엇일까요? 먼저, 빅 에디안의 장점은 가독성이 높고 대소비교가 빠르다는 것입니다. (즉, 사람이 보기에 좋은 것입니다.) 리틀 에디안의 장점은 산술연산이 빠르다는 것입니다. (즉, 컴퓨터가 보기에 좋은 것입니다.) 둘의 방식은 CPU 와, ..
멀티플레이는 패킷과 패킷과의 통신입니다. 이게 무슨 말이냐면, 실제 상대방 컴퓨터에서 행해지는 모든 행동이 내 컴퓨터로 들어오는 것이 아니라는 말이죠. 그 행동 중에 일부만 캡쳐하여 패킷으로 보내게 하는 것이 멀티플레이 프로그래밍의 역할입니다. 위 사진은 영화 '새벽의 저주' 의 한 장면입니다. 좀비가 지상을 점령하고, 살아남은 옥상에서의 생존자가 맞은편 옥상의 생존자와 체스를 하는 장면인데요. 상대방은 퀸을 B2 구역으로 옮기라고 지시하고 있습니다. 실제 멀티플레이도 이런 하나의 '메시지' 에 의해 이루어집니다. 상대방 체스판을 볼 수는 없지만, 상대방의 메시지는 들을 수가 있는 것이죠. 위 사진에서 Q와 B2는 변수의 전달이라고 볼 수 있습니다만, -> 는 '이동'하라는 명령을 의미합니다. 명령은 패..
자료형에는 일반적인 자료형과 unsigned 자료형이 있습니다. 둘의 차이점은 무엇일까요? 이것은 자료형의 범위에 대해 살펴보면 알 수가 있습니다. short 00000000 00000000 short 는 16비트, 즉 2바이트를 차지합니다. 그렇다면 2^16을 하여 65536의 범위를 가져야 합니다. 그런데 실제로는 -32768~32767 까지의 숫자밖에는 가지지 못합니다. 왜냐하면 일반적인 자료형에는 '음수' 라는 것이 포함되어 있기 때문이죠. (-32768~0~32767) 그렇다면, 어떻게 해야 양수만으로 된 65536 의 범위를 가질 수 있을까요? unsigned short 00000000 00000000 그리하여 만들어진 것이 unsigned 자료형입니다. 'unsigned + 자료형'을 사용한..
구분 컴파일러 인터프리터 번역 단위 전체 행(줄) 목적 프로그램 생성함 생성하지 않음 실행 속도 빠름 느림 번역 속도 느림 빠름 관련 언어 FORTRAN, COBOL, C, ALGOL 등 BASIC, LISP, APL, SNOBOL 등 컴파일러는 문장단위로 목적프로그램으로 번역한 뒤, 링킹 작업을 통해 기계어 프로그램을 만든다. 기계어이기 때문에 속도는 빠른 편이다. 인터프리터는 라인단위로 번역하는 프로그램을 만든다. 프로그램을 실행하면서 직접 번역하므로 속도는 빠르지 않은 편이지만, 링킹 작업을 거치지 않아도 되고 프로그램에 대한 변화에 반응이 빠르다. 어찌 보면 언터프리터는 매력이 없어 보이지만, 프로그램을 기계어로 만들지 않고 한 라인 한 라인을 번역하면서 코드를 실행시킵니다. 이 작업은 번역 도중..
코딩 스타일 코딩 스타일(Coding Style)이란 코드를 작성하는 방식에 대한 개인적인 기호라는 뜻이다. C/C++는 프리 포맷을 지원하며 코드의 형식에 대한 문법적인 제약이 없으므로 마음대로 작성할 수 있다. 개발자는 개성을 가진 인간이기 때문에 누가 작성하는가에 따라 코드의 모양이 조금씩은 달라질 것이다. 코드의 모양이야 어떻든 간에 컴파일러가 코드를 해석하기에 애매하지만 않으면 컴파일하는 데는 아무런 문제가 없다. 그러나 똑같은 내용의 소스라도 사람이 읽기 쉽고 구문 파악이 용이해야 이후 코드를 수정하기 편리하고 효율적으로 유지, 보수할 수 있다. 뿐만 아니라 소스의 구조가 잘 보이면 실수할 가능성이 낮고 골치 아픈 버그의 위험을 조금이라도 줄일 수 있다. 컴파일러는 기계이므로 스타일을 무시하지..
다음과 같은 프로그램을 짰다고 했을 때, 제작자는 이 프로그램을 수정하지 못할 것으로 생각할 것입니다. 그러나 우리는 리버싱을 통해 간단히 저 10 이라는 숫자를 변경할 수 있습니다. 일단 이렇게 컴파일된 이름없음1.exe 를 틀어봅시다. 그리고 막 스크롤을 돌리다 보면 printf. 이렇게 익숙한 함수의 이름이 보일 것입니다. 그리고 아까 C++ 로 제작한 소스의 내용이 보입니다. (system 함수 등) 주소를 찾았습니다. 여기서 잠깐. 리버싱에서 사용되는 언어인 mov, call 등을 어셈블리어라고 부르는데, 여기서는 함수호출방식이 역순입니다. 즉. printf("int number : %d\n", var_int); 이런 식으로 소스를 짰을 때에, var_int "int number : %d\n" ..