創作物

rundllex

概要

DLL内の関数 … cdeclかstdcallならどちらでも可。 DLL内の関数を呼び出すコマンドです。
簡単な計算や、値の保持、受け渡し等もできます。
こちらも併せてどうぞ。

ダウンロード

更新履歴

version 1.5.0 - 2013/03/23

・関数定義構文追加(-f ... f-)
・関数リターン構文追加(-r)
・引数機能追加($1, $2, ...)
・別スレッド化構文追加(-t ... t-)
・if文(else文)追加(-i ... -e ... i-)
・while文追加(-w ... w-)
・直前値参照機能追加($_)
・エスケープシーケンス追加(\cでカンマ)
・先頭に「:」のある行をスクリプトの終了とみなすように修正

version 1.4.0 - 2013/03/11

・式評価構文追加(シングルクォート内の式を計算する)

version 1.3.2 - 2013/03/06

・ヘルプの記述を一部修正
・-oのバグを修正

version 1.3.1 - 2012/11/30

・プリフィクス"$"を追加(wchar)

version 1.3.0 - 2012/10/29

・コメント構文修正('#' => '@')
・GetLastError機能追加
・.batもスクリプトとして認識するように修正

version 1.2.0 - 2011/05/15

・変数機能追加

version 1.1.0 - 2010/07/07

・-oと-mの構文追加

version 1.0.0 - 2010/05/20

・初期バージョン

使用例

ヘルプを表示

>rundllex /?
MessageBox関数 … 正確には必要に応じて自動で末尾にAが付加された関数が呼ばれる。 この例の場合はMessageBoxA。

user32.dll内のMessageBox関数を呼び出す

>rundllex user32.dll,MessageBox,0,hoge,piyo,0

dllの自動検索

>rundllex *,MessageBox,0,hoge,piyo,0

dll指定の省略

>rundllex MessageBox,0,hoge,piyo,0

序数指定

>rundllex crtdll,443,foobar
foobar
関数アドレス … 文字列(バイナリコード)のポインタを関数アドレスに指定した例。

関数アドレス指定

>rundllex \xb8AAAA\x0dBBBB\xc3 -d
*********** memory dump ***********
0: [\xb8AAAA\x0dBBBB\xc3]
  0000: 43 43 43 43                                          CCCC
***********************************

プリフィクスは、0xで16進、0で8進、#で文字列、$でwchar文字列、未指定は自動判別

>rundllex "printf,#%d %d%c,0x2a,0021,10"
42 17

プリフィクス未指定時、Cのエスケープシーケンスが使用可能

>rundllex printf,\x41\\\r\n\x5a\0
A\
Z

計算を実行して結果を確認(ダンプ)

>rundllex -o2+3 -d
*********** memory dump ***********
0: [-o2+3]
  0000: 05 00 00 00                                          ....
***********************************
内容確認 … ダンプ表示の末尾4byteは戻り値(計算結果)となる。 この例の場合は確保したメモリ領域へのポインタ。

メモリ領域の確保と初期化と内容確認

>rundllex -o(16=1/2/3/4) -d
*********** memory dump ***********
0: [-o(16=1/2/3/4)]
  0000: 01 00 00 00 02 00 00 00 - 03 00 00 00 04 00 00 00    ................
  0010: 00 62 8A 00                                          .b・
***********************************
参照 … この構文は変数機能が無かった頃の名残として取ってあるもの。

確保したメモリ領域の参照

>rundllex sprintf,(16),#12345 puts,[0] puts,[-2] puts,[-3.2]
12345
12345
345

変数への代入と参照

>rundllex sprintf,{hoge}(16),#12345 puts,[hoge]
12345

ラベルの定義と条件ジャンプ

>rundllex {c}-o65 xyzzy:putchar,[c] {c}-o[c]+1 "-o[c]<=90,xyzzy" puts,#
ABCDEFGHIJKLMNOPQRSTUVWXYZ
自動取得 … DLLの関数を実行する度にGetLastError()を呼び、その戻り値を特殊変数__LEにセットする。

GetLastErrorの自動取得

>rundllex UpdateWindow,0 -d
*********** memory dump ***********
0: [UpdateWindow,0]
  0000: 00 00 00 00                                          ....
********** variable dump **********
__LE = 1400
__LES = 5928040, 'ウィンドウ ハンドルが無効です。'
***********************************
スクリプト … 拡張子が.rdxまたは.batのファイルを変数参照するとスクリプトとしてロードする。

スクリプトファイルの実行

>rundllex "fputs,@ comment\n\nputs\x2cHello\\x2cWorld!,[stdout]" > test.rdx

>rundllex [test]
Hello,World!

式評価

>rundllex {s}-oABC\0456 "printf,%d %c %s\n,'1+(2<<3)','*(s+1)','s+4'"
17 B 456

関数定義と呼び出し

>rundllex {func}-f "puts,#hoge in function!" f- [func]
hoge in function!
引数 … スクリプトでも利用可能。

関数を引数付で呼び出し

>rundllex {pow}-f -r,'$1*$1' f- [pow],17 printf,%d\n,[$_]
289

別スレッド処理

>rundllex -t Sleep,1000 exit,0 t- puts,foo Sleep,2000 puts,bar
foo

if~else文

>rundllex {fb}-f -i,'$1^%15==0' puts,FizzBuzz -e,'$1^%5==0' puts,Buzz^
          -e,'$1^%3==0' puts,Fizz -e printf,%d\n,[$1] i- f-^
          [fb],1 [fb],3 [fb],5
1
Fizz
Buzz

while文

>rundllex {fb}-f -i,'$1^%15==0' puts,FizzBuzz -e,'$1^%5==0' puts,Buzz^
          -e,'$1^%3==0' puts,Fizz -e printf,%d\n,[$1] i- f-^
          -o{i}1 -w,'i^<=15' [fb],[i] -o{i}'i+1' w-
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz