昔々、どこかのコピペしたもの?

<* コマンド *>
次のコマンドとホット キーで 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)