<* コマンド *>
次のコマンドとホット キーで SoftICE のウィンドウの表示位置と表示方式
を変更できます:
LINES n
n = 25-128 - SoftICEの表示行数モード
WIDTH n
n = 80-160 - SoftICEの表示桁数
SET FONT n
n = 1、2、3 - フォントの選択
SET ORIGIN x y
x および y = 座標 - ウィンドウの表示位置
SET FORCEPALETTE [ON|OFF]
ON のとき、SoftICE は 8 ビット色 (256色) モードでシステムカラー
(0-7 および 248-255) が変更されることを防ぎます。
これにより SoftICE 画面が常に目に見えることを保証します。
デフォルトは OFF です。
[CRTL+ALT+C]
表示スクリーンを画面の中央に表示します。
[Ctrl+Alt+カーソル キー]
ウィンドウを 1 文字単位で移動します。
[Ctrl+Alt+Home]
ウィンドウの表示位置を (0, 0) に戻します。
[Ctrl+L]
SoftICE ウィンドウを再表示します。SoftICE がポップアップする
時に bitblt 操作が SoftICE の表示画面と重なってしまった場合に
役立ちます。
<* ビデオ メモリ サイズの設定 *>
ユニバーサル ビデオ ドライバを使用している場合、SoftICE は画面を
復元するために現在のフレーム バッファを保存する必要があります。
そのために必要なメモリの容量はビデオ モード、SoftICE の表示行数、現在
の surface のフリップ (Direct Draw アプリケーションなど) の数によって
変わります。どの場合においても、必要なメモリの容量がビデオ カードのメ
モリの容量を超えてはいけません。デフォルトで SoftICE は 2 MB を確保し
ますが、シンボル ローダでこの設定を変更できます ([編集] メニューから
[SoftICE 初期化設定] を選択し、[ビデオ メモリ サイズ] の設定を
変更します)。
<* その他のオプション *>
その他、次のオプションが追加されています。
SET WHEELLINES n
IntelliPoint mice 用: 1 度の wheel movement でスクロールする
行数を設定します。
SET BUTTONREVERSE [on|off]
ON にするとマウスの右ボタンと左ボタンの機能を逆にします。
---------------------------------------------------------------------
デバッグのクイック スタート
---------------------------------------------------------------------
1. シンボル ローダ (LOADER32.EXE) を起動します。
2. [ファイル] メニューから [モジュールを開く] を選択し、デバッグする
モジュールを選択します。
3. [モジュール] メニューから [ロード] を選択します (または、
ツール バーの [ロード] ボタンをクリックします)。SoftICE は
自動的にモジュールからシンボル情報を抽出して NMS ファイルを
生成し、シンボルおよびソース コードをロードします。実行可能
ファイルをロードする場合は、EXE ファイルをロードしてブレーク
ポイントを設定します。これでデバッグを開始できます。
その他のシンボル ローダの機能:
- [モジュール] − [設定]
(シンボルの変換およびデバッグのオプションを設定します)
- [モジュール] − [変換]
(起動時にあらかじめロードする.NMSファイルを生成します)
- [編集モジュール] − [SoftICE 初期化設定]
(WINICE.DAT と同じ機能を果します)
- [ファイル] − [エクスポートのロード]
(指定した DLL のエクスポート シンボルをロードします)
- [ファイル] − [SoftICE ヒストリの保存]
(WLOG および DLOG に代わる機能です)
---------------------------------------------------------------------
トラブルシューティング
---------------------------------------------------------------------
- 不規律なキーボードの動き: SoftICEをロードした時にキーボードが
不規律に動作する場合、シンボルローダーを実行して、[編集] -
[SoftICE 初期化設定] を選び、トラブルシューティング ページで以下の
オプションを選んで SoftICE を再起動してください。
--- NumLock と Caps Lock を無効にする
Windows NT でこの現象が再発する場合、次のオプションも選択して
ください:
--- キーボード ドライバをパッチしない
- 不規律なマウス ポインタの動き: SoftICEがポップアップしている時に
マウスが動く場合、Windows NTおよびマウスのハードウェアが正しく連結
されていなく、この不規律なマウス ポインタの動きが起こります。
次の方法のいずれかでこの問題を解決してください:
- SoftICEで ctrl-M を入力。数回繰り返す必要がある場合があります。
- フルスクリーンのDOSボックスに切り替える。(Windows NT)
- SET MOUSE OFF を入力後、 SET MOUSE ON を入力。(Windows 95)
- プログラム ロジックまたは破壊されたデータ構造体が原因で SoftICE が
無限ループに入ってしまい、情報コマンドが即座に応答しない場合、
Escape (Esc) キーを数回押すことで実行中の作業を中止できます。
- Delphi プログラムのデバッグ:- $0- オプションを使って最適化を
オフにしてください。最適化をオンにすると、たとえデバッグ情報に
パラメータおよびローカルへの参照がまだ存在していても、それらの
情報は最適化されてしまいます。
SoftIce 3.0 クイックリファレンス [Feb 07 1997]
==============================================================================
SOFTICE COMMANDS コマンド
==============================================================================
SETTING BREAKPOINTS:ブレークポイント
BPM Breakpoint on memory access
BPMB Breakpoint on memory access
BPMW Breakpoint on memory access
BPMD Breakpoint on memory access
BPR Breakpoint on memory range
BPIO Breakpoint on I/O port access
BPINT Breakpoint on interrupt
BPX Breakpoint on execution
BMSG Breakpoint on windows message
BSTAT Breakpoint statistics
CSIP Set CS:EIP range qualifier
MANIPULATING BREAKPOINTS:ブレークポイント操作
BPE Edit breakpoint
BPT Use breakpoint as a template
BL List current breakpoints
BC Clear Breakpoint
BD Disable breakpoint
BE Enable breakpoint
BH Breakpoint history
DISPLAY/CHANGE MEMORY:表示の切り替え メモリー
R Display/change register contents
U Un-Assemblers instructions
D Display memory
DB Display memory
DW Display memory
DD Display memory
DS Display memory
DL Display memory
DT Display memory
E Edit memory
EB Edit memory
EW Edit memory
ED Edit memory
ES Edit memory
EL Edit memory
ET Edit memory
PEEK Read from physical address
POKE Write to physical address
H Help on specified function
? Evaluate expression
VER SoftIce version
WATCH Add watch
FORMAT Change format of data window
DATA Change data window
DISPLAY SYSTEM INFORMATION: システム情報の表示
GDT Display global descriptor table
LDT Display local descriptor table
IDT Display interrupt descriptor table
TSS Display task state segment
CPU Display CPU register information
PCI Display PCI device information
MOD Display windows module list
HEAP Display windows global heap
LHEAP Display windows local heap
VXD Display windows VxD map
TASK Display windows task list
VCALL Display VxD calls
WMSG Display windows messages
PAGE Display page table information
PHYS Display all virtual addresses for physical address
STACK Display call stack
XFRAME Display active exception frames
MAPV86 Display v86 memory map
HWND Display window handle information
CLASS Display window class information
VM Display virtual machine information
THREAD Display thread information
ADDR Display/change address contents
MAP32 Display 32bit section map
PROC Display process information
QUERY Display processes virtual address space map
WHAT Identify the type of expression
I/O PORT COMMANDS: I/Oポート コマンド
I Input data from i/o port
IB Input data from i/o port
IW Input data from i/o port
ID Input data from i/o port
O Output data to i/o port
OB Output data to i/o port
OW Output data to i/o port
OD Output data to i/o port
FLOW CONTROL COMMANDS: 動作コマンド
X Return to host debugger or program
G Go to address
T Single step one instruction
P Step skipping calls, Int, etc
HERE Go to current cursor line
EXIT Force an exit to current dos/windows program
GENINT Generate an interrupt
HBOOT System boot (total reset)
MODE CONTROL: モード
I1HERE Direct INT1 to SoftIce
I3HERE Direct INT3 to SoftIce
ZAP Zap embedded INT1 or INT3
FAULTS Enable/disable SoftIce fault trapping
SET Change an internal variable
CUSTOMIZATION COMMANDS: カスタマイズ コマンド
PAUSE Control display scroll mode
ALTKEY Set key sequence to invoke window
FKEY Display/Set function keys
DEX Display/assign window data expression
CODE Display instruction bytes in code window
COLOR Display/set screen colors
ANSWER Auto-answer and redirect console to modem
DIAL Redirect console to modem
SERIAL Redirect console
TABS Set/Display tab settings
LINES Set/display number of lines on screen
PRN Set printer output port
MACRO Define a named macro command
UTILITY COMMANDS: ユーティリティ コマンド
A Assemble code
S Search for data
F Fill memory with data
M Move data
C Compare two data blocks
WINDOW COMMANDS: ウィンドウ コマンド
WC Toggle code window
WD Toggle data window
WF Toggle floating point stack window
WL Toggle locals window
WR Toggle register window
WW Toggle watch window
EC Enable/disable code window
. Locate current instruction
WINDOW CONTROL: ウィンドウ
CLS Clear window
RS Restore program screen
ALTSCR Change to alternate display
FLASH Restore screen during P and T
SYMBOL/SOURCE COMMANDS: シンボル/ソース コマンド
SYMLOC Relocate symbol base
EXP Display export symbols
SRC Toggle between source,mixed & code
TABLE Select/remove symbol table
FILE Change/display current source file
SS Search source module for string
TYPES List all types, or display type definition
LOCALS Display locals currently in scope
BACK TRACE COMMANDS: バックトレース コマンド
SHOW Display from backtrace buffer
TRACE Enter backtrace simulation mode
XT Step in trace simulation mode
XP Program step in trace simulation mode
XG Go to address in trace simulation mode
XRSET Reset backtrace history buffer
SPECIAL OPERATORS: 特殊
. Preceding a decimal number specifies a line number
$ Preceding an address specifies SEGMENT addressing
# Preceding an address specifies SELECTOR addressing
@ Preceding an address specifies indirection
LINE EDITOR KEY USAGE: ラインエディターでのキー
[PRINT-SCREEN] Dump Screen to printer
[UP ARROW] Recall previous command line
[DOWN ARROW] Recall next command line
[RIGHT ARROW] Move cursor right
[LEFT ARROW] Move cursor left
[BACKSPACE] Back over last character
[HOME] Start of line
[END] End of line
[INS] Toggle insert mode
[DEL] Delete character
[ESC] Cancel current command
SCROLLING KEY USAGE: 画面のスクロール
[PAGEUP] Display previous page of display history
[PAGEDOWN] Display next page of display history
[ALT-DN ARROW] Scroll data window down one line
[ALT-UP ARROW] Scroll data window up one line
[ALT-PAGEUP] Scroll data window down one page
[ALT-PAGEDOWN] Scroll data window up one page
[CTRL-UP ARROW] Scroll code window down one line
[CTRL-DN ARROW] Scroll code window up one line
[CTRL-PAGEUP] Scroll code window down one page
[CTRL-PAGEDOWN] Scroll code window up one page
==============================================================================
SOFTICE TABLE OF OPERATORS (演算子)
==============================================================================
Indirection Operators Example
----------------------- ------------------------------------------------------
-> ebp->8 (Gets DWord Pointed To By ebp+8)
. eax.1C (Gets DWord Pointed To By eax+1C)
* *eax (Gets DWord Value Pointed To By eax)
@ @eax (Gets DWord Value Pointed To By eax)
&symbol &symbol (Gets the address of the symbol)
------------------------------------------------------------------------------
Math Operators Example
----------------------- ------------------------------------------------------
Unary + +42 (Decimal)
Unary - -42 (Decimal)
+ eax + 1
- ebp - 4
* ebx * 4
/ Symbol / 2
% (Modulo) eax % 3
<< (Logical Shift Left) bl << 1 (Result is bl shifted left by 1)
>> (Logical Shift Right)eax >> 2 (Result is eax shifted right by 2)
------------------------------------------------------------------------------
BitWise Operators Example
----------------------- ------------------------------------------------------
& (Bitwise AND) eax & F7
| (Bitwise OR) Symbol | 4
^ (Bitwise XOR) ebx ^ 0xFF
~ (Bitwise NOT) ~dx
------------------------------------------------------------------------------
Logical Operators Example
----------------------- ------------------------------------------------------
! (Logical NOT) !eax
&& (Logical AND) eax && ebx
|| (Logical OR) eax || ebx
== (Compare Equality) Symbol == 4
!= (Compare InEquality) Symbol != al
< eax < 7
> bx > cx
<= ebx <= Symbol
>= Symbol >= Symbol
------------------------------------------------------------------------------
Special Operators Example
----------------------- ------------------------------------------------------
. (Line Number) .123 (Value is Address of line 123 in source file)
() (Grouping Symbols) (eax+3)*4
, (Arguements List) Function(eax,ebx)
: (Segment Operator) es:ebx
Function word(Symbol)
# (Prot-Mode Selector) #es:ebx (Address is protected mode Selector:Offset)
$ (Real-Mode Segment) $es:di (Address is real mode segment:offset)
==============================================================================
SOFTICE BUILT IN FUNCTIONS:(USED FOR EXPRESSIONS)
==============================================================================
Name Description Example
--------------- ------------------------------- ------------------------------
BYTE Get Low Order Byte ? Byte(0x1234=0x34
WORD Get Low Order Word ? Word(0x12345678)=0x5678
DWORD Get Low Order DWord ? DWord(0xFF)=0x000000FF
HIBYTE Get High Order Byte ? HiByte(0x1234)=0x12
HIWORD Get High Order Word ? HiWord(0x12345678)=0x1234
SWORD Convert Byte To Signed Word ? SWord(0x80)=0xFF80
LONG Convert Byte Or Word To signed ? Long(0xFF)=0xFFFFFFFF
Long ? Long(0xFFFF)=0xFFFFFFFF
WSTR Display as UniCode String ? WSTR(cax)
FLAT Convert to a selector relative ? Flat(fs:0)=0xFFDFF000
address to a linear (flat) addr
CFL Carry Flag ? CFL=Bool-Type
PFL Parity Flag ? PFL=Bool-Type
AFL Auxiliary Flag ? AFL=Bool-Type
ZFL Zero Flag ? ZFL=Bool-Type
SFL Sign Flag ? SFL=Bool-Type
OFL OverFlow Flag ? OFL=Bool-Type
RFL Resume Flag ? RFL=Bool-Type
TFL Trap Flag ? TFL=Bool-Type
DFL Direction Flag ? DFL=Bool-Type
IFL Interrupt Flag ? IFL=Bool-Type
NTFL Nested Task Flag ? NTFL=Bool-Type
IOPL IOPL Level ? IOPL=Current IO Privilege
Level
VMFL Virtual Machine Flag ? VMFL=Bool-Type
IRQL Windows NT OS IRQ Level ? IRQL=Unsigned-Char
DATAADDR Returns The Address Of The dd @DATAADDR
First Item Displayed In Data
Window
CODEADDR Returns The Address Of The ? CODEADDR
First Instruction Displayed In
The Code Window
EADDR Effective Address (If Any) Of EADDR
The Current Instructions
EVALUE Current Value Of The Effective EVALUE
Address
PROCESS KPEB(Kernal Process Environment ? PROCESS
Block) Of The Active OS Process
THREAD KTEB(Kernal Thread Environment ? THREAD
Block) Of The Active OS Thread
PID Active Process ID ? PID == Test32PID
TID Active Thread ID ? TID == Test32MainTID
BPCOUNT BreakPoint Instance Count BPIF bpcount==0x10
BPTOTAL BreakPoint Total Count BPIF bptotal==0x10
BPMISS BreakPoint Instance Miss Count BPIF bpmiss==0x20
BPLOG BreakPoint Silent Log BPIF bplog
BPINDEX Current BreakPoint Index # BPDO "bd bpindex"
==============================================================================
SOFTICE TABLE OF OPERATOR PRECEDENCE ( 演算子と結合規則)
==============================================================================
演算子 Operator 規則 Associates Comment
--------------- --------------- ----------------------------------------------
(,),FUNCTION Scopes(Precedence OverRide),Function
->,. Left To Right Indirection
: Left To Right Segment:Offset
#,$ Right To Left Protected Mode Selector,Real Mode Segment
*,@ Right To Left Indirection
Unary + Default Radix == Decimal
Unary - Default Radix == Decimal
!,~ Logical Not,Bitwise Not
. Line Number
*,/,% Left To Right Multiply,Divide,Modulo
+,- Left To Right Plus,Minus
<<,>> Left To Right Logical Shift Left, Logical Shift Right
<,<=,>,>= Left To Right Less Than,Less Than Equal,Greater Than.....
==,!= Left To Right Equal To,Not Equal To
& Left To Right Bitwise AND
^ Left To Right BitWise XOR
| Left To Right BitWise OR
&& Left To Right Logical AND
|| Left To Right Logical OR
COMMA Left To Right Argument List
------------------------------------------------------------------------------
括弧は() 優先順位をオーバーライド
==============================================================================
softIce チュートリアル 1 初級編
--------------------------------------------------------------------------------
Getting Started
まず最初にどこかでSoftIceを手に入れよう。クラッカーが貴重なツールと呼ぶSoftIce
の最大の問題は、ディスプレイアダプタだろう。この問題は最新のSoftIce、あるいは
Numega のftpサイトから最新のディスプレイアダプタを入手する事で解決する事もある。
ほとんどの場合、standard VGA driver でこの問題が解決する。(ver3.2でも提供されている)
クラッカーが熱望したように、コンピューターで何が起こっているか見つける事が出来る。
ここではインストールの問題は扱わない。それはシステムの構成によるからである。
これらの問題の解決には経験と少しの「禅」が必要だ。私には説明できない..
--------------------------------------------------------------------------------
SoftIceとは
SoftIceはデバッガーだ。デバッガーはプログラムの欠点を見つけて修正するために
プログラマに必要だ。
プログラムのソースコードを眺めるだけでもエラーは見つかるだろう。
デバッガーは、バグを見つけるために重要かもしれない出来事をプログラムの間に入って
コントールされた環境で実行する。
これはユーザーが重要な出来事にブレークポイントを設定する事でおこなう。
デバッガが出来事に気がついたら、プログラムを停止して、
ユーザーにインターフェースを与える。シングルステップも重要である。
これは一つの命令を実行し、コントロールをユーザーに返す。
命令が値をどのように変えるか、正確に実行できたか、などが分かる。
デバッガがブレークポイントで停止した時、現在のコンピューターの重要な情報を
提供する。
これはレジスタの値(asmでは必要だ。Clueheadのチュートリアルがある。
SoftIceを使うには Asmの知識が絶対必要だ)、メモリーの値
(例えば登録コードやパスワードが保存されているかも知れないので重要) である。
SoftIce でブレークポイントをメモリアクセス *bpm* (プログラムが特定の
メモリアドレスを読み書きした)メモリーの実行
*bpx* (プログラムがメモリのどこかの命令を実行した)、APIの実行
*bpx*(Hmemcpy, GetDialogItemTextなど)、IOポートへのアクセス *bpio* 、
に置く事ができる。
--------------------------------------------------------------------------------
基本コマンド
主にウィンドウプログラムで使うだろうから、望みのルーチンを探すために
APIファンクションでブレークポイントを使うだろう。
ソフトアイスでこれらのブレークを使うには、(コード中のAPIが正しく表示されて、
ブレークが働くという意味) ソフトアイスと同じディレクトリにある
winice.dat を変更しなければならない。
この中に、Examples of export symbols for Win95 というセクションがある。
; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory
;EXP=c:\windows\system\kernel32.dll
;EXP=c:\windows\system\user32.dll
;EXP=c:\windows\system\gdi32.dll
etc...
ウィンドウプログラムで使う共通APIのすべての DLL リストがある。
行の先頭の ";" は現在 "export" が無効である事を示している。
必要であれば、このセミコロンを取り除く。たとえば、VB5プログラムのトレースをした事があるなら、
特別な VisualBasic5(なんていやな言語)用 DLL、すなわち MSVBVM50.dll
が呼ばれる事を知っているだろう。
このような DLL の中をトレースするには、MSVBVM50.dll (windowsの
Systemディレクトリにある)を指す export 行を付け加えれば良い。
そこで、この行を... 待った! 私は何をしているんだ!
もし、この意味がわからないなら君は良いクラッカーにはなれないだろう。
winice.dat で SoftIce の init-string も変えておこう。
(SoftIceがスタートする時の初期設定ができる)
私は、INIT="wl;wr;ww 3;wd 3;wc8;watch eax;watch ds:si;watch es:di;"
を使っている。
これは、watch-windows (メモリの内容を表示する。"d [location] コマンドを
毎回使わなくて済む)をセットし、ウィンドウの配置をより良くする。
([システムの]構成でウィンドウの配置は異なる) SoftIce のコマンドを良く知ったら、
後で加えれば良い。
SoftIceをインストールすると、ウィンドウズがブートする前にバックグラウンドに
ロードするための C:\SI95\WINICE.EXE のような行が autoexec.bat
に追加される。
これでデバッガをポップアップさせるまでは、見えなくなる。
通常は CTRL+D (init-stringで変えられる)を使う。
もし、ゴミしか出てこなかったら(asmコードやhex値はゴミではないぞ!)、
たぶん(99%)ビデオカードとSoftIceのディスプレイアダプタの問題だ。
運が良ければ、正しく表示される。
わずかなアセンブラの知識があれば、レジスタとは何かわかるだろう。
レジスタウィンドウに現在の値が示されている。
wr コマンドでON/OFF が切り替わる。
レジスタウインドウの右側にフラグの状態がある。
(我々の仕事ではゼロフラグが最も重要だ。なぜなら、jz jnz などの条件付きジャンプは
これによる) 文字に相当するフラグ( Z は Zero-Flag を表す)がセットされていたら、
ハイライト表示になる。
データウインドウはメモリのデータを表示する。wd コマンドで切り替わる。
(もっと多くの行を表示したいなら、"wd 行数" とする。
同じ構文で他のウインドウも調整できる) "d [location]"コマンドで特定のメモリが
表示される。その下のコードウィンドウは現在実行しているコードが表示される。
(もちろんアセンブラ;-) ハイライトしたラインは、次に実行されるコマンドを示す。
wc コマンドで表示が切り替わりcode ON/OFF コマンドでオペコードの表示が切り替わる。
デバッグするプログラムの望みの部分を見つけるために、
あるイベントにブレークポイントをセットするために必要な事は説明した。
ブレークポイントをうまく使うためのいくつかのコマンドがある。
設定したすべてのブレークポイントは "bl *" でリストされる。
セットした順番に番号が割り当てられる。最初に設定したブレークポイント
が0、次が1..一度ブレークしたら、そこは重要でなくなる。
無効にできる。たとえば、シリアルのチェックをする hmemcpy(メモリの文字列コピー) で
ブレークしたとする。シリアルチェックのコードを見つけた後は、他の hmemcpy
を使う場所で邪魔されたくないだろう。 "bd (number-of-breakpoint)"
を使って無効にする。すべてのブレークポイントを無効にするには、"bd *" を使う。
ブレークポイントを消す時には、"bc 番号"、"be *" はすべてを消す。
これらのコマンドは動作のチェックに役に立つ。
プログラムのデバッグの大部分は、コードのステップになるだろう。
コードウィンドウのハイライト行は、次に実行されるコードだ。
(そう、まだ実行されていない) シングルステップ(次のコードを実行する)には、
"t" コマンドを使う。もし次の行が CALL なら、"p" でCALL をスキップできる。
(実行されるがサブルーチンには入らない) そして、CALL の次の行で停止する。
"p" または F10 はよく使う。
抜けたいルーチンに入ったら、(サブルーチンが呼ばれたコードにリターンする)
F12 を押す。
--------------------------------------------------------------------------------
ブレークポイント-を設定する
ウィンドウズの適切なシステムイベントにブレークを設定するには、
プロセスで使用するAPIファンクションの名前を覚えなくてはいけない。
例えば、bpx GetDlgItemText のように、"bpx (name-of-API-function)" とする。
bpx は、BreakPoint on Executuin の意味だ。
Micrisoft の API Referance を持っていなければ、+Greythorne が
クラッカーに必要な素晴らしいAPIリストを書いている。必需品だ。
[訳注:基本的なAPI関数は、予備校の APIの基礎知識 に収録した]
ファンクションの使い方や戻り値を調べるために、Referance は必要だ。
+Graythorne のリストで勉強する。
このソフトアイスの基本チュートリアルはそろそろ終わりだ。
あとは、第二章( MiB-Homepage) で説明するつもりだ。
softIce チュートリアル 2 初級編
--------------------------------------------------------------------------------
環境の設定
Soft-Ice には デバッガーのコンフィグレーションを変更する WINICE.DAT がある。
すべてのコンフィグレーション・オプションはSoft-Ice の command line でも設定できる。
デフォルトを書き換える前に実験できる。一般にファンクションキーは変更しない。
しかし、ウィンドウのサイズやカラーは変えたいだろう。変更は WINICE.DAT に
INIT="Code ON;WR;lines 50;WC25;X;"INIT="X;" のように追加する。
"init=" の一行には文字数の制限がある。しかし、複数の "init=" を書く事ができる。
(最後は X で終わる)
Code ON|OFF : Code ON 逆アセンブルのリストの次に hex code を表示する。
Color : 表示する色を設定。 4-bit hex で指定する。(1から16 Hexでは0-F。)
0=black 8=dark grey
1=blue 9=light blue
2=green A=light green
3=cyan B=light cyan
4=red C=light red
5=magenta D=light magenta
6=brown E=yellow
7=grey F=white
それぞれの色は background と foreground のコンビネーションで表す。
0Fは黒い背景に白い文字、F0は白い背景に黒い文字となる。
normal (color of normal text)
bold (color of bold/highlit text)
reverse (color of reverse-display text)
help (color of the help line)
line (color of horizontal lines)
color 7 F 71 30 2 は、normal textは黒にグレイ文字、bold text は黒に白文字、
reverse はグレーに青文字、help はシアンに黒文字、horizontal は黒に緑を表す。
Exp : DLLs と EXEs からの export symbolを表示する。
このコマンドは逆アセンブルリストの理解には不可欠だ。
これはプログラム内部のコールから Windows Call をピックアップする。
Kernel32.dll を何時間もトレースしなくて済む。exp module name で
モジュールからシンボ ルをロードする。
kernel32.dll/kernel.exe user32.dll/user.exe gdi32.dll/gdi.exe は
よいチョイスだ。Exp は現在ロードされているモジュールを表示して、
あるパターンにマッチするシンボルをリ ストする。 (exp delete は Deleteで始まる
ロードされたモジュールのすべてのシンボルをリストする)
Winice.dat よりコマンドラインで export をロードするのも良いアイデアだ。
Faults ON|OFF : Faults ON(Default)の時は、一般保護違反
(General Protection Faults)で Soft-Ice を呼び出す
Lines # : 表示行の変更
WC # : code window を #行にする。(e.g. WC 25)
WD # : data window を #行にする。(e.g. WD 15) Shift-F3 でデータの
フォーマットが変わる。
WR : レジスタウィンドウを開く
WW # : watch window を #行で開く(e.g. WW 5)
ALTKEY KeyCombo : Soft-Ice のホットキー(ex."ALTKEY ALT Z")
^ : キャレット("^") はコマンドラインに表示せずに実行
; : セミコロンは "ENTER" key の代わり
WINICE.DAT の INTセクションのヒント
INIT="lines 60;code on;wd 13;wc 25;wr;wl;dex 1 ss:esp;faults off;color 80 8F 70 74 8F;X;"
INIT="ww 5;watch es:di;watch eax;watch *es:di;watch *eax;color 17 1F 90 98 1A;X;"
INIT="set font 2;set origin 150 25;lines 50;wr;wl;wd 10;wc 20;color 07 0B 71 04 02;DEX 0 SS:ESP;X;"
Universal Video Driver:
Soft-Ice 3.2 には事実上どんなビデオカードでも使える Universal Video Driver
がついている。
テキストモードとグラフィックモードを切り替える代わりに、デスクトップに Soft-Ice が現れる。
ウィンドウは、"lines 25|43|50|60" を使ってリサイズできる。スクリーンは、
CTRL ALT 矢印 の組み合わせで動かせる。
フォントサイズを変えるには、"set font 0|1|2|3" を使う。(フォントサCズを変えてから、
linesコマンドでスクリーンの大きさ変える必要があるかもしれない)
ウィンドウの位置は、"set origin x y" command (x 150 y 25 は
800x600 画面の中心) でセットできる。
Internal Variables:
Soft-Ice はセッティング情報を保持するために、内部変数を使う。
これらの変数は、"set variable parameter"コマンドを使って変える事もできる。
ALTSCR ( on|off , 表示を二番目のモノクロモニターに移動する)
CASESENSITIVE ( on|off , global/local シンボル名の大文字小文字を区別)
CODE ( on|off , hexadecimal bytecode の表示 )
EXCLUDE ( on|off )
FAULTS ( on|off , 一般保護違反でのトラップ)
I1HERE ( on|off , どの INT1 でも SoftIceを呼び出す)
I3HERE ( on|off , どの INT3 でもSoftIceを呼び出す)
LOWERCASE ( on|off , code を小文字で表示)
MOUSE ( on|off 1|2|3, mouse on/off, 移動速度を1(slow)から3(fast)にセット)
PAUSE ( on|off , Command Window の表示をポーズ)
SYMBOLS ( on|off , シンボル情報を使う )
TABS ( on|off 1|2|3|4|5|6|7|8 , タブを 1-8 にセット)
THREADP ( on|off )
VERBOSE ( on|off , "module load/unload xxx" のような診断メッセージを表示)
現在の設定は、パラメータなしに "set variable" とタイプする。
Winice.dat Settings
いくつかの変数は、"init" を使わずに設定できる。
次のコマンドがある。(THE OWLの作法):
NOPIC2=on|off
NOLEDS=on|off (disable/enable capslock and numlock programming)
NOPAGE=on|off (disable/enable mapping of non-present pages)
NOCONTEXT=on|off
MACROS=number (maxmimum number of macros)
NMI on|off(trap Non-Maskable Interrupt--useful with a hardware breakout switch)
VERBOSE=on|off (ensable/disable diagnostic messages)
KBD=on|off (patch/do not patch keyboard driver)
LOWERCASE=on|off (enable/disable lowercase assembly)
MOUSE=on|off (enable/disable mouse support)
THREADP on|off ( enable/disable thread-specific stepping)
EXCLUDE (range parameter)
SIWVIDRANGE on|off
TRA=size (trace buffer size)
HST=size (command history buffer size)
LOAD=filename (load symbols)
LOAD%=filename
LOADX=filename
LOADX%=filename
LOAD32=filename
LOAD32%=filename
PHYSMB=size (amount of system RAM)
PHONE=number (phone number for serial debugging)
COM1=on|off (enable COM1 for serial debugging; works for COM2 and COM3)
DINIT=string (DIAL initialiaztion string for serial debugging)
ANSWER=string (ANSWER initialization string for serial debugging)
EXP=filename (load exports)
VDD
DDRAW
DRAWSIZE=size (video memory size in K)
MONITOR
WDMEXPORTS
DISPLAY=type (type is VIPE, S3, MACH32,MACH86, 0, or VD)
FAULTS=on|off (trap GPFs)
SYM=size (mem alloc for symbols)
LBRECORD=on|off (enable/disable last-branch message collection)
winice.dat で 'MACRO name="commands" の行を追加すればマクロが設定できる。(例, MACRO Qexp="addr explorer; Query %1")
最後に、ファンクションキーは key_combo="^command;" で設定できる。SF1 = "^watch eax;" (Shift-F1 を "watch eax")
A は ALT, C は Ctrl, S は Shift を表す。
--------------------------------------------------------------------------------
Tracing Through Code
デバッガーを使うポイントは、プログラムコードをシングルステップで走らせて
レジスタ、メモリー、変数、フラグの変化を監視することにある。
一般的に F10 を使い、それにより無関係なコールとOSサービスをスキップする。
重要な場所を見つけたら、そのコードを完全に逆アセンブルして(しばしば
逆アセンブラのリストはクリアにする必要がある)プログラムが何を行っているか調べるために
、F8 を使ってコードを "Single Step" する。
カーネルをデバッグするのでなければ、Windows .DLL のためにロードされたシンボルを
export する事は重要である。USER.EXE の様々なファンクションと
サブファンクションを通り抜ける標準 API Call を追跡したくはないだろう。
早く抜けたい CALLに捕まったら、F12 を使って次の RET命令までジャンプする。
P : プログラムを step実行。call は一つの命令として実行。: ショートカット F10
P RET : return に出会うまで実行 : ショートカット F12
T : 一つの命令を実行 : ショートカット F8
--------------------------------------------------------------------------------
Back Trace Mode
Soft-Ice の Back Trace mode は、名前のせいでしばしば誤解される。
Back Trace mode は実際に後ろへコードをトレースするわけではない。
ブレークが起きた時の命令をバッファに保持している。
ユーザーは、(動作はバッファに保持されているのだけれども)バッファの中で
コマンドを見たりトレースする事ができる。(すなわち、レジスタは変えられない。
バッファの外のアドレスのジャンプやコールはできない)
Back Trace mode は主に4つの命令でコントロールされる:
BPR start end [T|TW] [conditions...] :
メモリアドレスが、executed/writtenされる時にBPR command を T や TW で使うと
ブレー クでトレースバッファへの書き込みがトリガされる。
BPR メモリの開始、終わりのアドレス に続き、T(実行でback trace)や
TW(メモリ書き込みでback trace)、そしてブレークの条件 を入れる。
実行を停止する代わりにトレースバッファにコードを書き出す。
このバッファは後から showコマンドや TRACEコマンドでトレースした時に見る事ができる。
BPRW module|selector [T|TW] [conditions...] :
windows module や selector がexecuted/writtenされる時に BPWRコマンドを
TやTW と一 緒に使うと、ブレークでトレースバッファへの書き込みがトリガされる。
BPRW、モジュール 名かセレクタ、T(実行でback trace)や TW(メモリ書き込みで
back trace)、
そしてブレークの条件を入れる。実行を停止する代わりにトレースバッファにコードを
書き出す。(プログラムがブレークしなかったように見える)このバッファは後から
showコマン ドや TRACEコマンドでトレースした時に見る事ができる。
BPRWを使うとシステムがかなり遅くなる。(例えば、"Kernel"モジュールで試してみる)
SHOW start [l length] :
SHOWコマンドは、startからlengthで指定した長さの命令をトレースバッファから表示する。
命令はコマンドウィンドウに表示され、矢印キーでスクロールする。
ESCでSHOWモードを抜ける。
TRACE off | index :
TRACEコマンドはindexで指定した命令からBackTraceBufferをステップトレースする。
バッファトレースは、T (F8), P (F10), Gコマンド以外に、XT、XPも使える。
(繰り返しBack Trace modeを使うなら、AF8="^XT;" AF10="^XP;" AF12="^XP ret;" とする)
TRACE OFF は back trace mode を抜けるのに使う。
--------------------------------------------------------------------------------
Viewing and Editing Memory
コードをトレースする時に、変数やポインタ、割り込みを追いかけるために何度も
メモリの内容を調べるだろう。
加えて、データのある部分に--たとえば、ユーザー名--ブレークを設定するために
メモリー全体をサーチする事もあるだろう。
Soft-Iceのウィンドウの内容は ALTキーの組み合わせで(Alt-R レジスタ,
Alt-D データ, Alt-C コードなど)アクセスして直接エディットできる。
D : メモリの内容を表示
Syntax: D size address L length, size
B (byte)
W (word)
D (double word)
S (short real)
L (long real)
T (10-byte real)
address
表示するアドレス
(レジスタの指すアドレス-- EAX--やレジスタオフセット--[ebp-04]--も使える)
L
指定した長さをコマンドウィンドウに表示する。(デフォルトではデータウィンドウ)
データウィンドウは4つあり、DATAコマンドで切り替わる。
DEX : データウィンドウを割り当てる Assing an expression to a data window.
Syntax: DEX window-number [expression]
window-number は 0 から 4。
expression
先頭のメモリアドレス。
例: DEX 0 ss:esp DEX0 にスタックの先頭をセット
DEX 1 @variablename DEX1 に variablename ([ebp+10]) が指すメモリをセット
DEX 1 @eax DEX1 に eax が指すメモリをセット
データウィンドウは、DATA window-number(DATA 0, DATA 1, DATA 2, DATA 3)か、DATA コ マンドで切り替える。
S : RAM の文字列を探す
Syntax: s address L length data-list
address : サーチをスタートするメモリアドレス。
length : サーチエリアのバイト数。(MAX FFFFFFFF )
data-list : 探したいデータ。文字列は引用符(シングルでもダブるでも)をつける。
Switches : -c case-insensitive -u searches for a Unicode string
S 30:0 L ffffffff 'username' は 4 GB のアドレス空間で "username" を探す。
S es:di 10 L ecx 'Hello',12,34 は es:di で始まり ECXで指定したバイト
のアドレス空間で "Hello"に続く12h、34h を探す。
--------------------------------------------------------------------------------
Watches
プログラムをデバッグ中の変数を Watcheで追跡できる。言うまでもなく、
これはクラッキングとリバースエンジニアリングには、重要な機能だ。
watch window を開くには、command line で ww とタイプする。
watch に続き変数(メモリではない)をタイプすると
watch window に変数(とその値)が加わる。変数の代わりに
watch es:di と watch [ebp 18] のように、レジスタとスタックオフセットも使える。
多くのレジスタとスタックはめったに本当の変数が保存されているアドレスを指さないので、
レジスタ/オフセットの前に *をタイプしてレジスタやオフセットが参照する値を
watchできる。(watch *es:di)
watchする変数は、es:di, *es:di, eax そして ユーザーの入力が参照される[esp ?]や[ebp ?]
--------------------------------------------------------------------------------
Using Breakpoints
ブレークポイントの知識無しに有効なデバッグはできない。
ブレークポイントは単にあるメモリ領域やシステムとプログラムのイベント
(Windowメッセージとプログラム命令)でCPUにhaltを実行させる命令だ。
そしてコントロールをデバッガに移す。
ブレークポイントを設定してターゲットプログラムを走らせた時、
ブレークポイントに出会うとSoft-Ice はブレークが起こった命令で haltして、
コード、レジスタ、データを表示する。
Bc # : Breakpoint のクリア -- 番号が必要
Bd # : Breakpoint を無効にする-- セットした breakpoint は消さない -- 番号が必要
Be # : Breakpoint を有効にする--無効にした breakpoint を有効にする -- 番号が必要
Bl : Breakpoint のリスト -- 現在設定しているすべての breakpoints の状況と番号
Bmsg : Windows Message でブレーク。
Syntax: BMSG window handle L begin-message end-message
Bpint : Interrupt で Break。IDT (95/NT) でハンドルされる割り込みだけに有効。
Syntax: BPINT int-number
Bpio : I/O port の read/write で Break。
Sytnax: BPIO port [R|W|RW] [EQ|NE|GT|LT|M value] [c=count]
Bpm : Memory read/execution で Break。Syntax: BPM[B|W|DW] address [R|W|RW|X]
Bpx : 実行で Break。
Syntax: BPX address/symbol [c=count] [EQ|NE|GT|LT|M value] [c=count]
Bpr : メモリ領域で Break。
Syntax: BPR start-address end-address [R|W|RW|T|TW] [expression]
Bprw : program/code segment で Break。
Syntax: BPRW module-name|selector [R|W|RW|T|TW] [expression]
CSIP : breakpoint を限定。
Syntax: CSIP [off |[not] starting-address ending-address | module-name]
not を使うと、ブレークは CSIP が starting addresses や Windows modules と等
しくない時に起きる。そうでなければ、ユーザーが設定したブレークポイントが特定
の address/module の時のみブレークする。"Off" は CSIP のチェックを無効にする。
Using Symbols and NMSYM
From a .EXE file: BUILDSYM.EXE で .MAPファイルや .SYMファイルを作る
(BUILDSYM exefilename)
From a .DBG file: DBG2MAP.EXEを使って、.MAP や.SYファイルに変換する
(DBG2MAP /m dbgfile)
From a .MAP file: .MAPファイルを.SYMファイルに変換する
MAPSYM.EXE(MAPSYM -mn mapfile) MSYM.EXE (MSYM mapfile)
TMAPSYM.EXE (TMAPSYM mapfile)
From a .SYM file: .SYMファイルを .NMSファイルに変換する
NMSYM.EXE (NMSYM /TRANS:SYMBOLS symfile /OUT:file.nms)
NMSYM.EXE には次のコマンドライン・オプションがある
/TRANSLATE or /TRANS (Translate Symbols [PUBLIC, TYPEINFO, SYMBOLS, SOURCE],
eg. "/TRANS:SYMBOLS target.exe")
/LOAD (Load/execute module,
eg. "/LOAD:NOBREAK target.exe", "/LOAD:Execute target.exe")
/SOURCE (Name of source file, eg. "/TRANS:PACKAGE /SOURCE:target.exe")
/ARGS (Specify arguments for loaded module,
eg. "/LOAD:Execute /ARGS:test.txt notepad.exe")
/OUTPUT or /OUT (Output filename, eg. "/TRANS:PUBLIC /OUT:target.nms")
/PROMPT (Prompt for missing source files)
/SYMLOAD or /SYM (Load symbols, eg. "/SYM:kernel32.nms;user32.nms;target.exe")
/EXPORTS or /EXP (Load exports, eg. "/EXP:user.exe;kernel32.dll;msvcrt42.dll")
/UNLOAD (Unload sym/exp info, eg. "/UNLOAD:user.exe;kernel32.dll;msvcrt42.dll")
/LOGFILE oe /LOG (Save command history, eg. "/LOG:sice.txt", "/LOG:sice.txt,APPEND")
/VERSION or /VER (Product Version)
/HELP or /H (Help)
Map2Map Utility:
IDA .MAP ファイルを NMSYM.EXE のフォーマットに変換する。Perlが必要。
Soft-Ice Command History:
Soft-Ice のコマンドウィンドウの history は Symbol Loader や NMSYM.EXEを使う時に保存できる。
ヒストリバッファ(winice.datでセット)の内容は指定したファイルに保存される。
コマンドウィンドウに現れたテキストだけが保存される事に注意。
データは Dコマンドでコマンドウィンドウにダンプできる。
また、Uコマンドでコードがダンプできる。
これを保存するときには、VERBOSE=OFF にしたほうが良い。
--------------------------------------------------------------------------------
Command Line Options Courtesy of THE OWL
/? (helpを表示)
/tra size (back trace history で使う memory を decimal K で指定)
/x
/m
/nmi on|off (trap Non-Maskable Interrupt)
/nol on|off (no capslock/numlock programming)
/vdd
/kbd on|off (keyboard driver パッチ [caps/numlock])
/pen on|off (ペンティアムサポートを有効)
/com[123] (serial debugging で使う COM port 1-3)
/hst size (display history で使う追加 memory を decimal K で指定)
/exp filename (ファイルから export を Load)
/l filename (ファイルからシンボル情報を Load)
/l% filename 〃
/load filename 〃
/load% filename 〃
/loadx filename 〃
/loadx% filename 〃
/load32 filename 〃
/load32% filename 〃
/sym size (symbol table で使う memory を decimal K で指定)
--------------------------------------------------------------------------------
システム情報
Addr : アドレスの表示/変更
Class : Windows Classes の表示
CPU : CPU Register の表示
Exp : DLL からの Export Symbol の Load/Display
GDT : ディスクリプタテーブルの表示
Heap : Global Heap の表示
Heap32 : Display/Walk the Windows Global Heap.
HWND : Windows Handle の表示
IDT : 割り込みディスクリプタの表示
LDT : ローカルディスクリプタの表示
LHeap : Local Heap の表示
Map32 : メモリにロードされた 32-bit module のマップを表示
MapV86 : 現在の仮想マシンの DOS memory map を表示
Mod : Windows Module を表示
Page : Page Table の表示
Proc : process の表示
Stack : stack の表示
Sym : symbol の表示/セット
Task : Task List の表示
Thread : thread の表示
TSS : Task State Segmentと I/O Port Hooks の表示
VCall : VxD の名前とアドレスの表示
VM : 仮想マシンの情報
VXD : VXD マップ
WMSG : Windows messages の名前と番号を表示
--------------------------------------------------------------------------------
Trapping General Protection Faults
Soft-Iceはすべての GPFをデフォルトでトラップする。Soft-IceのGPFトラップで注意する事がある。
Wait_Semaphore ループでのトラップと、すべてのオペコードが "FFFFFFFF INVALID" と表示されたトラップ。
前者は F12でカーネルコードに戻って、あのJcc(条件ジャンプ。例えば JNZ)が問題を引き起こしたと感じる事ができる。
(これはパターンに気が付くまで何度もステップを行うクラッカーを代弁した)
それから、特殊な JNZの前のフラグをエディットする。(ゼロフラグをトグルさせるために "R FL Z"コマンド)
私の場合うまくいった。アプリがクラッシュしてもコンピューターのロックは防げる。
後者では、祈る!(冗談だ)。Soft-Ice の Aコマンドを使って RETをアセンブルする事ができる。
(FFFFFFFF INVALID の行で)そしてこのエリアが JMPでなく CALLされていた事を期待する。
(私の場合はうまくいかなかった。理屈ではOK ; ).
これ以外の場合は、ウィンドウカーネルのソースコードを暗記していなければ
GPFと同居するしかない。(しかし、戦いを止めては行けない!)
[訳者より:SoftIceの良い点は、あのいやーな青い画面を見なくて済む事だ。
しかしOSがコケると hboot以外に道はないが..]
--------------------------------------------------------------------------------有効なブレークポイント
SoftICE Advice: Useful Breakpoints ...
どこでどんな種類のブレークポイントをセットするかという能力は重要である。
完全な知性と時間が無ければ、ブレークポイントなしにプロテクトを破る事は出来ない。
ささいなプログラムでも数千行のコードがある。
一般的なもの ...
bpx messagebox
bpx getdlgitemtext
bpx getwindowtext
bpx hmemcpy
bpx showwindow
bpx updatewindow
bmsg xxxx wm_gettext
bmsg xxxx wm_command
bmsg xxxx wm_move
時間に関する ...
bpint 21 if ah==2A (DOS)
bpx getlocaltime
bpx getfiletime
bpx getsystemtime
レジスタフラグ関係(Flag on EAX) ...
bpx cs:eip if EAX==0 (SICE 3.x)
メモリーフラグ(Flag on 0030:000045AA) ...
bpmb cs:eip rw if 0x30:0x45AA==0 (SICE 3.x)
エコーに関する ...
bpx 0x30:0x45AA do "d 0x30:0x44BB" (SICE 3.x)
bpx CS:0x66CC do "? EAX" (SICE 3.x)
CD-ROM と Disk ...
bpint 13 if ah==2 (DOS)
bpint 13 if ah==3 (DOS)
bpint 13 if ah==4 (DOS)
bpx GetFileAttributesA
bpx GetFileSize
bpx GetDriveType
bpx GetLastError
bpx ReadFile
bpio -h (CD-ROM Port Address) R
IO 関係 ...
bpio -h 278 R
bpio -h 378 R
ファイル関係 ...
bpint 21 if ah==3dh (DOS)
bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFileA
bpx CreateFileA
キー入力関係 ...
bpint 16 if ah==0 (DOS)
bpint 21 if ah==0xA (DOS)
|