No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 872 | 873 | 874 |...| 917 | 918 | 919 || Next»

C言語のmain関数を変数として定義

なんとなく思いついたのでやってみた.C 言語で書いたプログラムの(ブートストラップ後の)エントリポイントは main 関数なわけだけど,アセンブラレベルでは結局のところ call main して main というラベルにとんでいるだけ.ということは,main は別にC言語の関数ではなく変数でもよい(main というラベルが作られる).これを実証するコードは以下のとおり.

こいつは HelloWorld を表示するが,main は関数でなく変数である.

#include <stdio.h>
 
int f()
{
	printf("HelloWorld!\n");
	return 0;
}
 
int main[] = {0xB8909090, (int)f, 0x9090E0FF};
 
/*
int main  = 0xB8909090;
int main2 = (int)f;
int main3 = 0x9090E0FF;
 */
/*
struct main {
	int m1;	int m2;	int m3;
} main = {0xB8909090, (int)f, 0x9090E0FF};
 */

main の定義をコメントアウトしている形(構造体,複数個の連続した変数)にしても動く.原理としては main というラベルに飛ばされてくるので,そこに関数本体である f へのジャンプを行うマシン語を埋め込んで f へジャンプさせる.ジャンプのコードはi386で

90             NOP
90             NOP
90             NOP
B8 XXXXXXXX    MOVE EAX, f
FF E0          JMP EAX
90             NOP
90             NOP

とかけるので,これらのマシン後が実行されるように main 変数に値を入れている.

ついでに C++ 版も.

#include <cstdio>
struct main {
	int ins[5];
	static int f() {
		puts("HelloWorld!");
		return 0;
	}
} main = {0xB8909090, (int)(main::f), 0xE0FF};

八月ももう終わり

論文の英訳して寝ようと思います.

PHPのあっぷろーだ

とある事情でアップローダが必要になったので,ついでだからと PHP の勉強のためにゼロから組んでみた.とにかくファイルをあげるだけでいいので名前を「あげるだけ」にしつつ適当に組んだはいいが,PHPはデバッグがしにくいことに後で気づき,実際デバッグに時間をむちゃくちゃとられた.とにかくセミコロン忘れて何も表示されないとかいうのがやたらと... ああ,面倒だ.とりあえずアップと削除ができるようになったから一段落.どっかにやっちゃう可能性が高いのでソースを置いておこう.

DirectX + LayeredWindow

WS_EX_LAYERED を指定して透明色を指定した上でその指定職を背景にしてDirect3Dで描画するとうまく背景をすかしたDirect3Dができるだろう,と考えて実験してみた.面倒なのでテスト用のソースは人からもらっといていろいろやってみたら,なぜかウィンドウの一部を画面外にするとうまくいくことを発見.何かのバグなのかなぁとか思ったりするけど面白い現象ではある.何とかうまくできないかなぁ,面白いねたになりそうな.

研究室にて...

友人と一緒に紅魔郷のリプレイファイルのフォーマット解析とかしてみたり.何も操作せずに死んだリプレイを用意してバイナリエディタで開き,眺めること暫くで7ずつ増えている増加列が多数あることを発見.そして操作してなけりゃもとのデータは0だろうと思われる.それを元に,七ずつ増える数列で暗号化しているのだろうと友人がめぼしをつけて適当にプログラムを作り,パラメータ調整しつつフィールドの解読成功と.んで,私は16進の加減算が速いということになった.

ZZ

もののついでにZZも見てみましたとさ.ところどころニュータイプって生きたラムダドライバ?とか思ってみたり.にしても敵の強化人間およびニュータイプ全員殺しちゃうってのはどうなのかねぇ.別に全員殺さなくてもいいだろうに... プルプルプルプル

«Prev || 1 | 2 | 3 |...| 872 | 873 | 874 |...| 917 | 918 | 919 || Next»
Search
Feeds

Page Top