Ruby
今回はジャンプ命令追加。その前にvm.rbをいじっておく。getCodeをgetCode8という名前に変え更にgetSignedCode8というメソッドを追加する。これに伴いMoveRImm8やAddALImm8で呼び出しているgetCodeをgetCode8に直す必要がある def getCode8(index = 0) retur…
今回はオペコード0x04にあたるADD AL, Imm8を実装した。その追加に伴い以下のファイルを作成した ./vm/instruction/add/AddALImm8.rb 中身は require "./vm/register/RegisterIndex.rb" include RegisterIndex class AddALImm8 def execute(vm) al = vm.getR…
まず、以下のファイルを作成した ./vm/exception/Exception.rbそして中身は class NotImplementedException < Exception; end これはvmクラスのexecuteメソッドで使っている。取得した命令が未実装の場合、この例外を発生させる。メッセージには命令コードを…
getCodeの文字コードの取得の部分はkeyesberryさんに教えてもらったString#ordを使うことにした def getCode(index = 0) return @memory[@registers[EIP] + index].ord end
MOV AL, 1を実行できるようにしてみた。追加したファイルは以下の通り。またemulator.rbとVM.rbを変更している。 ./vm/instruction/InstructionMap.rb ./vm/instruction/move/MoveRImm8.rb読み込んでいるファイルはadd まずはMoveRImm8.rbから class MoveRIm…
文字列の任意の文字の文字コードの取得方法をsyonbori_techに教えて頂いたので、VMクラスのgetCodeを以下の変更しておく def getCode() return @memory[@registers[EIP]].bytes().to_a()[0] end
とりあえずRubyでx86エミュレータを作ってみる。まず、以下のファイルを作る。 ./emulator.rb ./vm/VM.rb ./vm/register/RegisterIndex.rbまずRegisterIndex.rbから module RegisterIndex EAX = 0 ECX = 1 EDX = 2 EBX = 3 ESP = 4 EBP = 5 ESI = 6 EDI = 7 …
ある文字列の1文字目の文字コードを取得したい場合、1.8の場合は "Hello World!"[0] で良かった気がするけど、1.9でこれやると1文字の文字列が返ってくるようだ。それでsliceなんかも試してみたけど1文字だけのときでも文字列が返ってくるようになったらし…
getCodeをまた修正した def getCode() return @memory[@registers[EIP]].unpack("C")[0] end
億とか京とかを見て書くことにした。MLでは何故だか正規表現で教えてほしいと書いてあるが、あえて正規表現を使わずに書いた。ただ最近Rubyを全然使って無いのでRubyを使いたかっただけだが。それより1ヶ月前のエントリへのトラックバックかっこいい! #!/us…
わけあって、あるディレクトリ(サブディレクトリを含む)にある全てのファイルの内容の正規表現に一致した部分を置換するプログラムを作ってみた。コマンドライン引数で、対称となる文字列(正規表現)、置換後の文字列、対象のディレクトリ(省略可、デフォルト…
今度はListにメンバーを削除する。usernameとpasswordは名前の通り。追加したいListの名前をlistnameに、削除したいメンバーのidをmemberidに入れれば削除できる。名前じゃなくてidなので注意 require 'net/http' username = "hoge" password = "hoge" listn…
今度はListにメンバーを追加する。usernameとpasswordは名前の通り。追加したいListの名前をlistnameに、追加したいメンバーのidをmemberidに入れれば追加できる。名前じゃなくてidなので注意 require 'net/http' username = "hoge" password = "hoge" listn…
タイトルの通りTwitterのListを作成するだけのスクリプト。同じリスト名を持つリストを作成しようとすると後ろに番号がつくらしい require 'net/http' username = "hoge" password = "hoge" listname = "test" listmode = "public" request = Net::HTTP::Pos…
前回のやつの改良型。フォローの数が100を越えても大丈夫になった。取得したユーザー数が100未満でループ脱出だと、ブロックしてるユーザーがいる場合(それも消えてない場合)にループを抜けてしまうっぽいので、取得したユーザー数が0になったときにループを…
twitterでフォローしているけど、フォローされていない人を探すスクリプトを作った。ただしフォローしている、もしくはされているのどちらかが100を越えている場合は使えない。改良しなければ!またfriendsとfollowersを入れ替えれば逆もできる。 require 'n…
Rubyではてなメッセージ一覧を取得するスクリプトを書いてみた。フォーム情報の取得、送信にはMechanizeを使ってる。 require 'rubygems' require 'mechanize' username = 'hoge' password = 'password' class HatenaMessage def initialize() @agent = WWW:…
前回の特定のホストまでのルータを表示してみるではICMPソケットの読み込みでブロッキングしてしまい返事が返ってこなかったときの処理ができなかったけど、今回はIO::selectを使うことで解決した。というか、forループで回してるところは、selectを使わない…
RubyでGoogle急上昇ワードを取得するに書いてあるスクリプトをいじってみた。REXMLに詳しいかはわからないけど、XPath大好きなので、XPathを使って書き直した。 require 'rexml/document' require 'net/http' url = 'www.google.co.jp' ret = Net::HTTP.star…
今回は、tracerouteと同じような機能を持つscanrouteというプログラムを作ってみた。引数で渡されたホストまでのルータを表示する。Googleなんか指定すると結果が返ってくるのに、Yahooを指定すると途中で止まってしまう。何でだろう?原因不明。『基礎から…
ICMPの種類のいくつかに対応。対応してないICMPパケットが来ても落ちないようにした。ICMPのクラスを増やした割には、使ってるのは共通する部分だけだったりhttp://github.com/d-kami/packet-dump/tree/3d9df8e9277ac084e1807f08a2c787d757e7bee2/socket
ICMP ECHOとICMP ECHOREPLYに対応。ICMPでそれ以外が来たら落ちる。次で対応するICMPのタイプを増やす http://github.com/d-kami/packet-dump/tree/fb27f05d8e577d5959e72d7713865a0694c2b9a5/socket
はてなハイクで☆をつけるスクリプトをつけるスクリプトを作った。例としておはようキーワードの新着20件に対して☆を付けるスクリプトを書いた。パスワードは通常使ってるものではなくhttp://h.hatena.ne.jp/apiに書かれてるものを使うことに注意 #! /usr/bin…
githubのsocket.rbをrecvfromを使ったものに置き換えた。パディングによるずれの問題も起こらないようなので良かった http://github.com/d-kami/packet-dump/blob/e6d377fa90c57afa3287922d216baac29341be8d/socket/socket.rb
readだと指定したバイトまで読み込んでいたけど、recvfromなら1フレーム毎に読み込んでくれたのでrecvfromを使うことにした。これなら、毎回フレームのサイズを気にしたり、パディングの問題を気にする必要もないので、楽ができる。最初からrecvformを使っ…
Raw Socketのスクリプトをgithubに載せてみた、本体はsocket.rb。まだパディングの問題は直ってないけど http://github.com/d-kami/packet-dump/tree/669818cdadd4d40a00d82b9ec8cf086e1a954f22/socket
はてなハイクに投稿するスクリプトを書いてみた。注意するのはパスワード、http://h.hatena.ne.jp/apiに書いてある、例えばあなたのパスワードは〜です、という部分を使うこと。 require 'net/http' require 'rexml/document' require 'uri' require 'kconv'…
mixiにログインして書き込み確認画面まで行くプログラムを作ったが問題が発生した。以下のスクリプトを実行するとエラーがでる。エラーメッセージは`iconv': "\245\306\245\271\245\310" (Iconv::IllegalSequence)で@agent.submit(diary_form)のところで発生…
今回はRaw Socketを使ってみる その3にARPを表示する機能を付けた。しかし、問題がある。今回、俺がパディングのことを理解してなかったため、相手からARPが送られてきた場合、ARPの後のEthernetフレームを正しく読み込めないという問題が発生している。ARP…
まずmechanizeが入ってなかったのでインストールgem install mechanizeしかしlibxml2が入って無いようなメッセージと共にyum install libxml2しろと書いてあった。ただlibxml2はすでにインストール済みだったので何でだろう?と思いGoogleで検索したら解決策…