0
はせがわようすけ
Yosuke HASEGAWA
第1部
WindowsでもPerlを使いたい
How can I use Perl on Windows?
WindowsでもPerlを使いたい!
   How can I use Perl on Windows?



それ、ActivePerlでできるよ!
You can do that with ActivePerl!
第1部 完
第2部
PerlからDLLを呼びたい!
Calling DLL from Perl!
PerlからDLLを呼びたい!
   Calling DLL from Perl!
❤それ、Win32::APIでできるよ!
use Win32::API;

my $MessageBox = Win32::API->new(     DLL名...
第2部 完
第3部
    Perlからx86コードを
         呼びたい!
Calling x86 code from Perl
Perlからx86コードを呼びたい!
   Calling x86 code from Perl
❤シグナルハンドラを利用
 Using signal handlers
 ❤実行コードのバイト列を用意
   Preparing binary a...
Perlからx86コードを呼びたい!
      Calling x86 code from Perl
❤シグナルハンドラでやってみた
                                                      ...
Perlからx86コードを呼びたい!
Calling x86 code from Perl



     DEMO
第3部 完
第4部
  x86コードからPerlを
       呼びたい!
Calling Perl subs from
       x86 code
x86コードからPerlを呼びたい!
    Calling Perl subs from x86 code

❤これもシグナルハンドラでやってみた
                                             シグ...
x86コードからPerlを呼びたい!




   DEMO
x86コードからPerlを呼びたい!
   Calling Perl subs from x86 code

シグナルを使ったプロセス内通信
InProc communication with signal

❤シグナルを使い分ける
 Sepa...
x86コードからPerlを呼びたい!
   Calling Perl subs from x86 code

シグナルを使ったプロセス内通信
InProc communication with signal

Perlさ~ん          ...
命
     バ
    シッ 名
    通グド
高

    信ナ
林
哲
さ

     ル
ん
公
認
x86コードからPerlを呼びたい!
    Calling Perl subs from x86 code

それ Win32::API::Callback で
                         できるよ
You can do...
x86コードからPerlを呼びたい!
Calling Perl subs from x86 code




      DEMO
第4部 完
第5部
まともな使い道!
 Decent use
まともな使い道!
   Decent use
❤stdcall以外のDLL関数も呼び出せる!
 Calling non-stdcall functions
呼出規約     引数の渡し方              引数のクリア

 stdcal...
まともな使い道!
Decent use



    DEMO
第5部 完
まとめ
❤頑張れば結構なんでもできる!
❤バイナリコード書くの難しい?
 →「迷ったときはテキスト」
❤printfデバッグ万歳!
 print unpack( 'H2 ' x length( $x86 ), $x86 );




     ...
Upcoming SlideShare
Loading in...5
×

WindowsユーザのためのはじめてのPerlプログラミング

5,212

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,212
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
17
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "WindowsユーザのためのはじめてのPerlプログラミング"

  1. 1. はせがわようすけ Yosuke HASEGAWA
  2. 2. 第1部 WindowsでもPerlを使いたい How can I use Perl on Windows?
  3. 3. WindowsでもPerlを使いたい! How can I use Perl on Windows? それ、ActivePerlでできるよ! You can do that with ActivePerl!
  4. 4. 第1部 完
  5. 5. 第2部 PerlからDLLを呼びたい! Calling DLL from Perl!
  6. 6. PerlからDLLを呼びたい! Calling DLL from Perl! ❤それ、Win32::APIでできるよ! use Win32::API; my $MessageBox = Win32::API->new( DLL名 quot;user32quot;, 関数名 quot;MessageBoxAquot;, quot;NPPNquot;, 引数:整数、ポインタ、ポインタ、整数 quot;Nquot; 戻り値:整数 ); $MessageBox->Call( 0, quot;Happy Weddingquot;, quot;Perlquot;, 0 );
  7. 7. 第2部 完
  8. 8. 第3部 Perlからx86コードを 呼びたい! Calling x86 code from Perl
  9. 9. Perlからx86コードを呼びたい! Calling x86 code from Perl ❤シグナルハンドラを利用 Using signal handlers ❤実行コードのバイト列を用意 Preparing binary array for executable code ❤シグナルハンドラとしてバイト列を指定 Assign the array as a signal handler ❤シグナルの生成 Raise signal to call binary code ❤ActivePerlはヒープごとDEP解除? Disabled DEP for all of heap area?
  10. 10. Perlからx86コードを呼びたい! Calling x86 code from Perl ❤シグナルハンドラでやってみた シグナルハンドラ my $x86 = quot;quot; 実効するコード . quot;¥x83¥x7d¥x08¥x00quot; # cmp [dwCtrlEvent], 0 . quot;¥x74¥x05quot; # je if( not Ctrl+C ) return . quot;¥x33¥xc0quot; # xor eax, eax . quot;¥xc2¥x04¥x00quot; # ret 4 . …(略)… ; シグナルハンドラ の設定 $SetConsoleCtrlHandler->Call( unpack( 'L', pack( 'P', $x86 ) ), TRUE ); $GenerateConsoleCtrlEvent->Call( CTRL_C_EVENT, 0 ); Ctrl+C(SIGINT) シグナル発生
  11. 11. Perlからx86コードを呼びたい! Calling x86 code from Perl DEMO
  12. 12. 第3部 完
  13. 13. 第4部 x86コードからPerlを 呼びたい! Calling Perl subs from x86 code
  14. 14. x86コードからPerlを呼びたい! Calling Perl subs from x86 code ❤これもシグナルハンドラでやってみた シグナルハンドラ sub handler { print quot;signal¥nquot;; } $SIG{INT} = ¥&handler; ハンドラの設定 my $x86 = quot;…(略) …quot; . quot;¥x6a¥0quot; # push 0 Process Group Id . quot;¥x6a¥0quot; # push 0 Ctrl-C Event . quot;¥xb8quot; # mov eax, addr シグナルの発生 . $addr{'GenerateConsoleCtrlEvent'} . quot;¥xff¥xd0quot; # call eax . …(略)… ; $SetConsoleCtrlHandler->Call( x86コードの呼出 unpack( 'L', pack( 'P', $x86 ) ), TRUE ); $GenerateConsoleCtrlEvent->Call( CTRL_BREAK_EVENT, 0 );
  15. 15. x86コードからPerlを呼びたい! DEMO
  16. 16. x86コードからPerlを呼びたい! Calling Perl subs from x86 code シグナルを使ったプロセス内通信 InProc communication with signal ❤シグナルを使い分ける Separate signals ❤Perl → x86 : SIGBREAK (Ctrl-Break) ❤x86 → Perl : SIGINT (Ctrl-C) ❤シグナルハンドラ内でシグナルを発生させてる>< Raise signal in signal handler. X-(
  17. 17. x86コードからPerlを呼びたい! Calling Perl subs from x86 code シグナルを使ったプロセス内通信 InProc communication with signal Perlさ~ん バイナリさ~ん
  18. 18. 命 バ シッ 名 通グド 高 信ナ 林 哲 さ ル ん 公 認
  19. 19. x86コードからPerlを呼びたい! Calling Perl subs from x86 code それ Win32::API::Callback で できるよ You can do that with Win32::API::Callback orz
  20. 20. x86コードからPerlを呼びたい! Calling Perl subs from x86 code DEMO
  21. 21. 第4部 完
  22. 22. 第5部 まともな使い道! Decent use
  23. 23. まともな使い道! Decent use ❤stdcall以外のDLL関数も呼び出せる! Calling non-stdcall functions 呼出規約 引数の渡し方 引数のクリア stdcall 右から左にスタックに格納 関数内 右から左にスタックに格納 呼び出し側 cdecl fastcall レジスタを使用 呼び出し側 ❤Win32::API はstdcallのみ Win32::API is only for stdcall
  24. 24. まともな使い道! Decent use DEMO
  25. 25. 第5部 完
  26. 26. まとめ ❤頑張れば結構なんでもできる! ❤バイナリコード書くの難しい? →「迷ったときはテキスト」 ❤printfデバッグ万歳! print unpack( 'H2 ' x length( $x86 ), $x86 ); Thanks to TAKESAKOさん、kazuhoさん、tokuhiromさん
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×