56.windbg-s, #(검색 문자열, 주소, 어셈블리)

3839 단어 windbg

s(Search Memory)


s 명령 검색 메모리 지정 템플릿 찾기
1. 메모리 유출의 단서를 찾는다.예를 들어 현재 메모리가 유출된 내용이 고정된 문자열이라는 것을 알면 DLL 영역에서 이 문자열이 나오는 주소를 검색한 다음에 이 주소가 어떤 코드에 사용되는지 검색해서 이 메모리가 어디에서 분배되기 시작했는지 찾아낼 수 있다.  2.오류 코드의 근원을 찾다.예를 들어 현재 프로그램이 0x80074015와 같은 코드를 되돌려준 것을 알지만, 이 코드가 어느 내부 함수에서 되돌려받았는지 모른다.코드 영역에서 0x80074015를 검색하면 이 코드를 되돌릴 수 있는 함수를 찾을 수 있습니다.
예를 들어 제 코드에char*g 가 있어요.char = "I am string";전역 문자열 변수
찾고 싶은데, 이건 틀림없이 놓여 있을 거야.rdata 단락에서
0:000> !dh -s 01270000 

SECTION HEADER #3
  .rdata name
    1D11 virtual size
   15000 virtual address
    1E00 size of raw data
    3A00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         (no align specified)
         Read Only

 
//문자열 검색 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
s-sa 및 s-su 명령은 지정되지 않은 ASCII 및 유니코드 문자열을 검색합니다.이것은 세그먼트 메모리에 인쇄 가능한 문자가 포함되어 있는지 확인하는 데 유용합니다. 
s-a 및 s-u 명령은 각각 지정된 ASCII 및 유니코드 문자열을 검색하는 데 사용됩니다.이 문자열들은 반드시 끝을 맺어야 하는 것은 아니다
0:000> s -sa 01270000+15000 L1D11
0128573c  "I am string"
01285868  "bad allocation"
012858e0  "Stack around _alloca corrupted"
01285908  "Local variable used before initi"
01285928  "alization"
0128593c  "Stack memory corruption"
01285958  "Cast to smaller type causing los"
0:000> s -a 01270000+15000 L1D11 "I am"
0128573c  49 20 61 6d 20 73 74 72-69 6e 67 00 25 73 0a 00  I am string.%s..

flag[1]을 사용하여 검색 출력에 일치하는 항목의 주소만 표시할 수 있습니다.이 옵션이 사용됩니다.foreach는 출력을 파이프를 통해 다른 명령에 전달하여 입력할 때 매우 유용하다. 
[] 기호가 있음을 주의하십시오
0:000> s -[1]a 01270000+15000 L1D11 "I am"
0x0128573c
0:000> .foreach (addr {s -[1]a 01270000+15000 L1D11 "I am"}){da ${addr}}
0128573c  "I am string"

//메모리 주소 검색 ------------------------------------------------------------------------------------------------------------------------------------------
printf의 호출 주소 검색
009614d4 test1!printf = <no type information>
009682c8 test1!_imp__printf = <no type information>
0:000> s -[1]d 00961431 L130000 009682c8
0x0096145d

0:000> u 0096145d L2
test1!wmain+0x2d [d:\windbg\test1\test1.cpp @ 23]:
0096145d c8829600        enter   9682h,0
00961461 83c408          add     esp,8
0:000> ub 00961461 L1
test1!wmain+0x2b [d:\windbg\test1\test1.cpp @ 23]:
0096145b ff15c8829600    call    dword ptr [test1!_imp__printf (009682c8)]

(역어셈블리)


어셈블리 코드에서 지정한 템플릿에 맞는 데이터 검색
0:001> lm m test1
start    end        module name
00a50000 00a6b000   test1    C (private pdb symbols)  C:\Program Files (x86)\Debugging Tools for Windows (x86)\sym\test1.pdb\0142AD0EED1143078D35079F6E0C70AB5\test1.pdb
0:001> # test1!_imp__printf 00a50000
test1!printf:
00a614d4 ff25c882a600    jmp     dword ptr [test1!_imp__printf (00a682c8)]
0:001> # test1!_imp__printf   ///<             
test1!ThreadProc+0x58 [d:\windbg\test1\test1.cpp @ 23]:
00a61b48 ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]
0:001> # test1!_imp__printf
test1!wmain+0x4d [d:\windbg\test1\test1.cpp @ 33]:
00a630dd ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]

주소도 함수 이름으로 직접 대체할 수 있다
0:001> # *test1!_imp__printf* test1!wmain
test1!wmain+0x4d [d:\windbg\test1\test1.cpp @ 33]:
00a630dd ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]

좋은 웹페이지 즐겨찾기