중화사전망 - 명언 미구 - 가장 일반적으로 사용되는 암호화 표준 및 구현 방법 및 기술에 대한 간략한 설명?

가장 일반적으로 사용되는 암호화 표준 및 구현 방법 및 기술에 대한 간략한 설명?

작가: 나로씨

이것은 "VC 프로그래밍 경험 요약 7"

충돌 주소를 통해 잘못된 코드 행을 찾는 방법

프로그래머로서 우리가 가장 걱정하는 것은 무엇입니까? 메모리 누수인가요? 인터페이스가 예쁘지 않나요? 아닙니다! 나는 아무도 내 의견에 반대하지 않을 것이라고 믿는다. 프로그램이 이미 무너졌다는 것이다!

"이 프로그램은 불법적 인 작업을 수행했으며 곧 폐쇄 될 것입니다. 소프트웨어 공급업체에 문의하십시오. 허허, M$ 라는 명언은 프로그래머가 가장 걱정하는 것 같다. 때로는 자신의 프로그램이 자신의 기계에서 잘 작동하지만, 다른 사람의 기계에서는 붕괴된다. 때로는 작성 및 테스트 과정에서 영문도 모른 채 불법 조작이 발생했지만 소스 코드 중 어느 행이 원인인지 확실하지 않습니다 ... 고통스러운가요? 괜찮아, 이 문장 는 너 를 이 곤경 에서 벗어날 수 있다. 심지어 너 는 지금부터 자랑스럽게 사용자 에게 충돌 주소 를 알려주도록 요구할 수 있다. 그러면 너 는 소스 코드 에서 잘못된 줄 을 정확하게 찾을 수 있을 것 이다. 신기하지 않나요? 하하. ) 을 참조하십시오

우선, 이 방법은 현재 시중에 나와 있는 모든 컴파일러에서 사용할 수 있다는 점을 강조해야 합니다. 하지만 저는 M$ 의 VC 와 MASM 만 잘 알고 있습니다. 그래서 다음 섹션에서는 두 컴파일러에서 구현하는 방법만 설명하고 독자는 다른 컴파일러에서 사용하는 방법을 스스로 파악할 수 있습니다.

좋아, 쓸데없는 말을 충분히 했다. 우리 시작합시다! :)

먼저 프로그램의 매핑 파일을 생성해야 합니다. 지도 파일이란 무엇입니까? 간단히 말해서 매핑 파일은 프로그램의 전역 기호, 소스 파일 및 코드 행 번호 정보에 대한 유일한 텍스트 표현입니다. 추가 프로그램 지원 없이 언제 어디서나 사용할 수 있습니다. 그리고 절차가 무너진 곳을 찾아낼 수 있는 유일한 구세주다.

자, 지도 파일이 이렇게 신기하다면 어떻게 생성해야 할까요? VC 에서는 Alt+F7 을 눌러 프로젝트 설정 탭 페이지를 열고 C/C++ 탭을 선택하고 하단 프로젝트 옵션에: /Zd 를 입력한 다음 링크 탭을 선택하고 하단 프로젝트 옵션에:/mapinfo: Link 및 를 입력할 수 있습니다 마지막으로 F7 컴파일을 눌러 EXE 실행 파일과 매핑 파일을 생성합니다.

MASM 에서는 컴파일 및 연결 매개 변수를 설정해야 합니다. 일반적으로 이렇게 합니다.

Rc% 1.rc

Ml /c /coff /Zd% 1.asm

링크/하위 시스템: windows/mapinfo: exports/mapinfo: lines/map:%1.map%1

Makem.bat 로 저장하고 명령행에 makem 파일 이름을 입력하여 EXE 실행 파일 및 매핑 파일을 컴파일합니다.

먼저 매개 변수 추가의 의미를 설명하겠습니다.

/Zd 는 컴파일 시 행 정보가 생성됨을 나타냅니다.

/MAP[:filename] 은 생성된 매핑 파일의 경로와 파일 이름을 나타냅니다.

/MAPinfo:lines 는 지도 파일을 생성할 때 선 정보가 추가됨을 나타냅니다.

/MAPinfo:exports 는 매핑 파일을 생성할 때 내보낸 함수를 추가하는 것을 의미합니다 (DLL 파일을 생성하는 경우 이 옵션을 추가해야 함).

자, 위의 단계를 통해 지도 파일을 얻었습니다. 그러면 어떻게 사용할 수 있을까요?

간단한 예부터 시작하겠습니다. VC 를 열고 이렇게 새 파일을 만들어 주세요.

01파일://* * * * * * * * * * * * * * * * * * * * * * * * * * * * 0

02 file:// 프로그램 이름: 충돌 주소로 잘못된 소스 코드 행을 찾는 방법을 보여줍니다.

03 파일://작성자: 나콩

04 문서://날짜: 2003 년 2 월 7 일

05 문서://출처: (나로의 다채로운 세계)

06 file:// 이 프로그램은 "나누기 0 오류" 를 생성하여 "잘못된 작업" 대화 상자를 팝업합니다.

07 파일://"0 으로 나누기 오류" 는 디버거 버전에서만 생성됩니다. 이 프로그램을 최대한 간소화하기 위해서입니다.

08 문서://주: 전재가 필요하시면 이 절차를 그대로 두고 다음을 명시하십시오.

09 문서://'나로의 다채로운 세계' ()

10 파일://* * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

1 1

12 유효하지 않은 충돌 (유효하지 않음)

13 {

14 int I =1;

15 int j = 0;

16 I/= j;

17}

18

19 빈 주 파이프 (비어 있음)

20 {

2 1 충돌 ();

22}

분명히 이 프로그램에는 "0 으로 나눈 오류" 가 있으며 디버그 모드에서 컴파일하면 런타임 시 "불법 작업" 이 발생할 수 있습니다. 좋아, 그것을 실행 하자. 역시 "불법 작업" 대화 상자가 나타납니다. 이때 우리는 "상세 정보" 버튼을 클릭하여 충돌이 발생한 주소인 내 시스템의 0x0040 104a 를 기록했다.

지도 파일을 보세요. (파일 내용이 너무 길어서 중간에 쓸모없는 부분을 생략했습니다.)

충돌 데모

타임스탬프는 3e 430 a 76(Fri 2003 년 2 월 7 일 09 시 23 분 02 초) 입니다

선호 로딩 주소는 00400000 입니다

시작 길이 이름 범주

0001:000000000000000 de04h 입니다. 텍스트 코드

0001:0000 de04 0001000ch. Textbss 코드

0002: 000000000000001346h. Rdata 데이터

0002:0000 1346 0000000h. 데이터 데이터

0003: 0000000000000104h. CRT$XCA 데이터

0003: 00000104 00000104h. CRT$XCZ 데이터

0003:00000208 00000 104H. CRT$XIA 데이터

0003:0000030c 00000 109H. CRT$XIC 데이터

0003: 0000418 00000104h. CRT$XIZ 데이터

0003: 000051c00000104h. CRT$XPA 데이터

0003: 0000620 00000104h. CRT$XPX 데이터

0003: 0000724 00000104h. CRT$XPZ 데이터

0003:00000828 00000 104H. CRT$XTA 데이터

0003: 000092c0000104h. CRT$XTZ 데이터

0003:00000a30 00000b93H 입니다. 데이터 데이터

0003: 000015c400001974h. Bss 데이터

0004: 0000000 00000014h. Idata$2 데이터

0004: 00000014 00000014h. Idata$3 데이터

0004: 0000028 00000110h. Idata$4 데이터

0004: 0000138 00000110h. Idata$5 데이터

0004:00000248 000004afH. Idata$6 데이터

값 Rva+ 기본 라이브러리: Object 를 통해 Publics 주소를 지정합니다

000 1:00000020? 충돌 @ @ yaxxz00401020f crash demo.obj

0001:0000070 _ main 00401070f crash demo.obj.

0004: 0000000 _ _ import _ descriptor _ kernel32 00424000 kernel32: kernel32.dll

0004: 0000014 _ _ null _ import _ descriptor00424014 커널 32: 커널 32

0004: 00000138 _ _ imp _ _ getcommand linea @ 0 00424138 커널 32: kernel

0004: 0000013c _ _ imp _ _ getversion @ 0 0042413ckernel 32: kernel 32 ..

0004: 00000140 _ _ imp _ _ exitprocess @ 4 00424140 커널 32: 커널 32

0004: 0000144 _ _ imp _ _ debugbreak @ 0 00424144 kernel 32: kernel 32 ..

0004: 00000148 _ _ imp _ _ getstdhandle @ 4 00424148 kernel 32: kernel 32

0004: 0000014c _ _ imp _ _ writefile @ 20 0042414ckernel 32: kernel 32 ..

0004: 00000150 _ _ imp _ _ interlockeddecrement @ 4 00424150 커널 32: kernel

0004: 00000154 _ _ imp _ _ outputdebugstringa @ 4 00424154 커널 32: kernel

0004: 00000158 _ _ imp _ _ getprocaddress @ 8 00424158 커널 32: 커널 32

0004: 0000015c _ _ imp _ _ loadlibrary a @ 4 0042415ckernel 32: kernel 32

0004: 00000160 _ _ imp _ _ interlocked increment @ 4 00424160 커널 32: kernel

0004: 0000164 _ _ imp _ _ getmodulefilename a @12 004241;

0004: 00000168 _ _ imp _ _ terminateprocess @ 8 00424168 커널 32: kernel

0004: 0000016c _ _ imp _ _ getcurrentprocess @ 0 0042416ckernel 32: kernel

0004: 0000170 _ _ imp _ _ unhandled exception filter @ 4 00424170 커널 32

0004: 00000174 _ _ imp _ _ freeenvironment stringsa @ 4 00424174 커널 32: 입니다

0004: 00000178 _ _ imp _ _ freeenvironment stringsw @ 4 00424178 커널 32:

0004: 0000017c _ _ imp _ _ widechartomultibyte @ 32 0042417ckernel 32: kr

0004: 00000180 _ _ imp _ _ getenvironment strings @ 0 00424180 커널 32:;

0004: 00000184 _ _ imp _ _ getenvironmentstringsw @ 0 00424184 커널 32:.

0004: 00000188 _ _ imp _ _ sethandlecount @ 4 00424188 커널 32: 커널 32

0004: 000018c _ _ imp _ _ getfiletype @ 4 0042418ckernel 32: kernel 32

0004: 00000190 _ _ imp _ _ getstartupinfoa @ 4 00424190 커널 32: kernel

0004: 00000194 _ _ imp _ _ heapdestroy @ 4 00424194 커널 32: 커널 32

0004: 0000198 _ _ imp _ _ heapcreate @12 00424198 커널

0004: 000019c _ _ imp _ _ heapfree @12 0042419ckernel 32

0004: 00001A0 _ _ imp _ _ virtualfree @12 004241a0kernet

0004: 00001a4 _ _ imp _ _ rtlunwind @16 004241a4 커널 3

0004: 000001A8 _ _ imp _ _ getlasterror @ 0 004241A8 커널 32: 커널 32

0004: 000001AC _ _ imp _ _ setconsolectlhandler @ 8 004241ackernel 32: kr

0004: 000001B0 _ _ imp _ _ isbadwriteptr @ 8 004241B0 커널 32: 커널 32

0004: 000001B4 _ _ imp _ _ isbadreadptr @ 8 004241b4kernel 32: kernel 32

0004: 00001b8 _ _ imp _ _ heapvalidate @12 004241b8kernet

0004: 000001BC _ _ imp _ _ getcpinfo @ 8 004241bckernel 32: kernel 32 ..

0004: 000001c0 _ _ imp _ _ getacp @ 0 004241c0 kernel 32: kernel32.dll

0004: 000001C4 _ _ imp _ _ getoemcp @ 0 004241C4 커널 32: 커널 32.

0004: 00001c8 _ _ imp _ _ heapalloc @12 004241c8 커널 3

0004: 00001cc _ _ imp _ _ virtualloc @16 004241cckernoc

0004: 00001d0 _ _ imp _ _ heaprealloc @16 004241d0 커널

0004: 000001D4 _ _ imp _ _ multibytetowidechar @ 24 004241D4 커널 32: kernel

0004: 000001D8 _ _ imp _ _ lcmapstringa @ 24004241d8kernel 32: kernel 32

0004: 000001DC _ _ imp _ _ lcmapstringw @ 24004241dckernel 32: kernel 32

0004: 000001E0 _ _ imp _ _ getstringtypea @ 20 004241E0 커널 32: kernel

0004: 00001E4 _ _ imp _ _ getstringtypew @16 004241E4 kew

0004: 00001E8 _ _ imp _ _ setfilepointer @16 004241e8ker

0004: 000001EC _ _ imp _ _ setstdhandle @ 8 004241eckernel 32: kernel 32

0004: 000001F0 _ _ imp _ _ flushfilebuffers @ 4 004241F0 커널 32: kernel

0004: 000001F4 _ _ imp _ _ closehandle @ 4 004241F4 커널 32: 커널 32

0004: 00001F8 \177kernel 32 _ null _ thunk _ data004241;

진입점은 000 1:000000f0 입니다

의 행 번호입니다. \ debug \ crashdemo.obj (d: \ msdev \ my projects \ crash demo \ crashdemo.cpp) 섹션. 텍스트

13 0001:0000002014 0001:00000381

17 0001:00000050 20 0001:0000070 21:000/kloc/

Rva+Base 열을 자세히 살펴보면 충돌 주소 0x0040 104a 보다 큰 첫 번째 함수 주소는 0x0040 1070 이므로 주소 0x0040 1070 입니다

000 1:00000020? 충돌 @ @ yaxxz00401020f crash demo.obj

붕괴의 함수는 다음과 같습니다. 충돌 @@YAXXZ, 물음표로 시작하는 모든 함수 이름은 C++ 수정자 이름입니다. 소스 프로그램에서 하위 함수 Crash () 입니다.

자, 이제 우리는 붕괴 함수의 이름을 쉽게 알 수 있습니다. 설렌가요? 허허, 우선 바쁘지 마세요. 다음으로, 더 강력한 트릭이 나올 것입니다.

매핑 파일의 마지막 부분인 행 번호 정보를 확인합니다. 이 정보는 다음과 같이 표시됩니다.

13 000 1:00000020

첫 번째 숫자는 소스 코드의 코드 행 번호를 나타내고 두 번째 숫자는 코드 행이 속한 코드 조각에서 오프셋됩니다.

코드 행 번호를 찾으려면 다음 공식을 사용하여 16 진수 빼기를 해야 합니다.

충돌 선 오프셋 = 충돌 주소)-이미지 기본 주소) -0x 1000.

왜 이러는 거야? 세심한 친구가 Rva+Base 열을 알아차렸을 것이다. 우리가 얻은 충돌 주소는 모두 오프셋 주소 (Rva)+ 기본 주소에서 얻은 것이므로 행 번호를 계산할 때 기본 주소를 빼야 합니다. 일반적으로 기본 주소의 값은 0x00400000 입니다. 또한 일반 PE 파일의 코드 조각은 간격띄우기 0x 1000 으로 시작하므로 0x 1000 도 빼야 합니다.

자, 이것을 이해하면 초등학교 빼기 계산을 할 수 있습니다.

충돌 선 오프셋 = 0x0040104a-0x00400000-0x1000 = 0x4a.

매핑 파일에서 코드 행 정보를 찾아보면 계산된 결과를 초과하지 않는 숫자가 표시되지만 가장 가까운 숫자는 CrashDemo.cpp 파일에 있습니다.

16 000 1:00000046

소스 코드의 16 줄입니다. 소스 코드를 살펴 보겠습니다.

16 I/= j;

하! ! ! 정말 16 선이에요!

설렌가요? 저도요! :)

방법을 소개했다. 지금부터 소스 코드에서 충돌 라인을 정확하게 찾을 수 있습니다. 컴파일러가 매핑 파일 (VC, MASM, VB, BCB, Delphi 등) 을 생성할 수 있는 한 이 방법을 적용할 수 있습니다. M$ 제품이 얼마나 나쁜지 불평하지만 실제로는 M$ 충돌 주소를 사용자에게 요청할 수도 있습니다. 그러면 집에서 잘못된 회선을 편안하게 찾아 수정할 수 있습니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 가족명언)