Your SlideShare is downloading. ×
WindowsユーザのためのはじめてのPerlプログラミング
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

5,138
views

Published on

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. はせがわようすけ Yosuke HASEGAWA
  • 2. 第1部 WindowsでもPerlを使いたい How can I use Perl on Windows?
  • 3. WindowsでもPerlを使いたい! How can I use Perl on Windows? それ、ActivePerlでできるよ! You can do that with ActivePerl!
  • 4. 第1部 完
  • 5. 第2部 PerlからDLLを呼びたい! Calling DLL from Perl!
  • 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. 第2部 完
  • 8. 第3部 Perlからx86コードを 呼びたい! Calling x86 code from Perl
  • 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. 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. Perlからx86コードを呼びたい! Calling x86 code from Perl DEMO
  • 12. 第3部 完
  • 13. 第4部 x86コードからPerlを 呼びたい! Calling Perl subs from x86 code
  • 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. x86コードからPerlを呼びたい! DEMO
  • 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. x86コードからPerlを呼びたい! Calling Perl subs from x86 code シグナルを使ったプロセス内通信 InProc communication with signal Perlさ~ん バイナリさ~ん
  • 18. 命 バ シッ 名 通グド 高 信ナ 林 哲 さ ル ん 公 認
  • 19. x86コードからPerlを呼びたい! Calling Perl subs from x86 code それ Win32::API::Callback で できるよ You can do that with Win32::API::Callback orz
  • 20. x86コードからPerlを呼びたい! Calling Perl subs from x86 code DEMO
  • 21. 第4部 完
  • 22. 第5部 まともな使い道! Decent use
  • 23. まともな使い道! Decent use ❤stdcall以外のDLL関数も呼び出せる! Calling non-stdcall functions 呼出規約 引数の渡し方 引数のクリア stdcall 右から左にスタックに格納 関数内 右から左にスタックに格納 呼び出し側 cdecl fastcall レジスタを使用 呼び出し側 ❤Win32::API はstdcallのみ Win32::API is only for stdcall
  • 24. まともな使い道! Decent use DEMO
  • 25. 第5部 完
  • 26. まとめ ❤頑張れば結構なんでもできる! ❤バイナリコード書くの難しい? →「迷ったときはテキスト」 ❤printfデバッグ万歳! print unpack( 'H2 ' x length( $x86 ), $x86 ); Thanks to TAKESAKOさん、kazuhoさん、tokuhiromさん

×