[CDA]WinDbg Script #1 (프로세스 실행파일 경로 구하기)

http://www.dumpanalysis.org/blog/index.php/2006/08/

글 : Dmitry Vostokov

옮김 : 이태화 (2007-05-11)

CDA 블로그에 있는 Windbg 스크립트를 실행시켜 보았습니다.

먼저 아래 스크립트를 windbg 폴더에 myscrypts 라는 폴더를 만들어서 CDA_script.txt 로 저장하고
windbg 로 target 에 붙인 후에 .cache forcedecodeuser 명령을 실행 시킨 후

$$>< P>

스크립트를 많이 만들수 있으면 좋겠네요 ^^

kd> $$>
Implicit process is now 81882be0
Implicit process is now 8176a460
_EPROCESS: 8176A460 Command Line: \SystemRoot\System32\smss.exe
Implicit process is now 8175b020
_EPROCESS: 8175B020 Command Line: C:\WINNT\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
Implicit process is now 817587a0
_EPROCESS: 817587A0 Command Line: winlogon.exe
Implicit process is now 81790020
_EPROCESS: 81790020 Command Line: C:\WINNT\system32\services.exe
Implicit process is now 81752c80
.
.
.
아래는 스크립트 파일 내용입니다.

설명 :
    r 명령은 별명(alias)을 설정할때 쓰입니다.
    poi C 의 '*' 라고 생각하면 됩니다. 
    @ 는 $t0 와 같이 별명의 값을 나타낼때 사용됩니다.
    ? Pseudo-register 는 integer 값만 사용 가능한데 ? 를 사용함으로 써 다른 type 을 입력할 수 있다.
    #CONTAINING_RECORD 구조체에서 값을 가져오는 것으로 생각됩니다.
    @@c++() C++ 표현식을 사용할 수 있게 해줍니다.
$$ WinDbg script to get process command line for all processes in complete memory dump
r $t0 = nt!PsActiveProcessHead
.for (r $t1 = poi(@$t0); (@$t1 != 0) & (@$t1 != @$t0);
       r $t1 = poi(@$t1))
{
   r? $t2 = #CONTAINING_RECORD(@$t1,nt!_EPROCESS, ActiveProcessLinks);
   .process @$t2
   .if (@$peb != 0)
   {
      .catch
      {
         r $t3 = @@c++(@$peb->ProcessParameters)
         r? $t4 = @@c++(&((_RTL_USER_PROCESS_PARAMETERS *)@$t3)->CommandLine)
         .printf "_EPROCESS: %N Command Line: %msu\n",@$t2, @$t4
      }
   }
}

 

forcedecodeuser 에 대한 설명입니다.
All user-mode virtual addresses will be translated into physical addresses before access. This option also causes the cache to be disabled.
Note  You must activate forcedecodeuser (or forcedecodeptes) before using .thread (Set Register Context), .context (Set User-Mode Address Context), .process (Set Process Context), or !session during live debugging. If you use the /p option with .thread and .process, the forcedecodeuser option is automatically set. In any other case, you will need to use the .cache forcedecodeuser command explicitly.