중화사전망 - 명언 미구 - 가장 일반적으로 사용되는 암호화 표준 및 구현 방법 및 기술에 대한 간략한 설명?
가장 일반적으로 사용되는 암호화 표준 및 구현 방법 및 기술에 대한 간략한 설명?
이것은 "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 드라마), 가족명언)