オートアセンブラ

オートアセンブラはスクリプトを利用して任意のアドレスにアセンブリコードを記述することを可能にします。
スクリプトにはいくつかの特別なコマンドが用意されています。

値定義

  • db(Define Byte) バイト値を定義する
  • dw(Define Word) ワード値を定義する
  • dd(Define Doubleword) ダブルワード値を定義する
  • dq(Define Quadword) クアッドワード値を定義する
使用例
DEFINE_BYTE:
 db 90 90 90 90 90 // 半角スペースで区切れば連続して定義できる
DEFINE_WORD:
 dw FFFF
DEFINE_DECIMAL:
 dd #10000 // #付きで10進数値を定義できる
DEFINE_FLOAT:
 dd (float)0.01 // float値を定義できる
DEFINE_DOUBLE:
 dq (double)1.23456789 // double値を定義できる
DEFINE_STRING:
 db 'abcdefg' // シングルクォーテーションで文字列を定義できる(ただしnull値は追加されない)
 db 0

コマンド

  • LABEL(labelname)
  任意のアドレスに名前を付けることができます。
  • ALLOC(allocname,sizeinbytes)
  基本的にLABELと同一ですが、それに加え任意のメモリを割り当てることが可能です。
  • DEALLOC(allocname)
  ALLOCで割り当てたメモリを解放します。
  • FULLACCESS(address,size)
  指定したアドレスのメモリ領域を読み込み・書き込み・実行可能にします。
  • REGISTERSYMBOL(symboname)
  ユーザ定義のシンボルリストにシンボルを追加して、チートテーブルやメモリブラウザでアドレスの代わりにその名前を利用できます。
  • UNREGISTERSYMBOL(symbolname)
  ユーザ定義のシンボルリストから指定したシンボルを削除します。
  • DEFINE(name,whatever)
  指定した名前と任意の文字列の全てのトークンを置き換えます。
  • INCLUDE(filename)
  他のオートアセンブラファイルをインクルードします。
  • LOADBINARY(address,filename)
  指定したアドレスにバイナリファイルを読み込みます。
  • CREATETHREAD(address)
  指定したアドレスでプロセスのスレッドを生成します。
  • LOADLIBRARY(filename)
  指定したdllをターゲットプロセスに埋め込みます。
  • READMEM(address,size)
  指定したアドレスに置かれている命令をサイズ分だけ書き込みます。
  • GLOBALALLOC(name,size)
  サイズとレジスタ名を指定してメモリを割り当てます。
  ALLOCと違い他のスクリプトでGLOBALALLOCを使用している場合、再び同じ名前でメモリを割り当てることはできません。
  しかし、ALLOCで割り当てられた既存のメモリに上書きすることは可能です。
  • AOBSCAN(name,arrayofbytes)
  指定したバイト列で検索を行い一番最初に一致したアドレスを指定した名前に割り当てます。
  一致するアドレスが存在しない場合はスクリプトを実行できません。
  一致するまで検索を行うので実行時にPCの性能によってはCEがフリーズを伴う可能性があります。
  • ASSERT(address,arrayofbytes)
  指定したアドレスに指定したバイト列が存在すれば、スクリプトを実行できます。一致しなければ実行できません。
  スクリプトによってプログラムが異常終了してしまうことを防いだり、パッチが行われたことを知らせるのに利用できます。

使用例

コマンド未使用
00451029:
 jmp 00410000
 nop
 nop
 nop
 
00410000:
 mov [00580120],esi
 mov [esi+80],ebx
 xor eax,eax
 jmp 00451031

LABEL
label(mylabel)
 
00451029:
 jmp 00410000
 nop
 nop
 nop
mylabel:
 
00410000:
 mov [00580120],esi
 mov [esi+80],ebx
 xor eax,eax
 jmp mylabel

ALLOC
alloc(alloc1,4)
 
00451029:
 jmp 00410000
 nop
 nop
 nop
 
00410000:
 mov [alloc1],esi
 mov [esi+80],ebx
 xor eax,eax
 jmp 00451031

ALLOCとLABEL
alloc(alloc1,4)
label(mylabel)
 
00451029:
 jmp 00410000
 nop
 nop
 nop
mylabel:
 
00410000:
 mov [alloc1],esi
 mov [esi+80],ebx
 xor eax,eax
 jmp mylabel

FULLACCESS
FULLACCESS(00400800,4) // 00400800は元々は読み取りのみのデータである
00451029:
 jmp 00410000
 nop
 nop
 nop
 
00410000:
 mov [00400800],esi // 00400800への書き込みを可能にする
 mov [esi+80],ebx
 xor eax,eax
 jmp 00451031

DEFINE
DEFINE(clear_eax,xor eax,eax)
00400500:
 clear_eax
 

READMEM
alloc(x,16)
alloc(script,2048)
script:
 mov eax,[x]
 mov edx,[x+c]
 ret
x:
 readmem(00410000,16) // 00410000のコンテンツをXのアドレスとして利用する

AOBSCAN
aobscan(addr,f3a55fb801000000) 
addr+3:
 db b8 00 00 00 00
最終更新:2014年07月18日 04:18