melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8241  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

また BREW の話です。

あんまり役に立つことは無い気がしますが、組み込みではもしかしたらという淡い期待を抱きつつ書こうと思います。

 

自己書き換えでグローバル変数を使えるようにしてしまおうというお話です。

 

BREW では、その構造上、グローバル変数・スタティック変数を使うことが出来ません。

確かにメインクラスにグローバルとして使いたいオブジェクトを集積させれば、通常はグローバル・スタティック変数を使用する必要など無いのですが、利便性や保守性から、グローバル・スタティック変数を使いたいということが発生することはあります。

まあそれを叶わぬ夢だと言って諦めたり、こんなのやってられっかとディスプレイをぶち破ったり、毎夜神社に通って五寸釘を打ち付けたりするのも一つの手段ではありますが、ここはプログラマらしく、何とかグローバル・スタティック変数を使う方法を探してみようと思います。

 

とにかく、どこからでも値を取得することが出来る領域があれば良いわけです。

char g_pointer[ 4 ] = { 0 };

こうやって書くと、実行時に0で初期化する必要があるので、そういった初期化の処理が出来ない BREW では使用することが出来ません。

というか、ARM コンパイラに食わすとエラーを吐き出します。

そこで、

const char g_pointer[ 4 ] = { 0 };

こんな風に書いてみることにします。

この場合、g_pointer は const な領域であるため、バイナリに直接埋め込まれます。

これで、4バイトのグローバルな領域が確保出来たことになります。

const だから書き換えちゃいけないとか、そんなの知ったこっちゃありません。とにかくグローバルに領域が確保出来たので、これを使って、何らかの値を詰めていきます。

const char g_pointer[ 4 ] = { 0 };
void SetGlobalPointer( void* p ){
    *((void**)&g_pointer[ 0 ]) = p;
}
void* GetGlobalPointer(){
    return *((void**)&g_pointer[ 0 ]);
}

これで、無理矢理ですがグローバル変数が使用出来るようになります。

 

スタティック変数が欲しい場合も、必要なだけグローバルに領域を取って、それを使用するだけでいいのですが、template を使用したクラスでスタティック変数が欲しい場合、グローバルな領域を書き換えて実現することは、使用する数が(コーディング時に)一意に定まらないため難しいです。

そこで、次のような形でスタティック変数を作ってやることにします。

template< class T >
class Hoge{
public:
    static void*& StaticPointer(){
        return *(void**)&_dummy;
    }
private:
    static void _dummy(){}
}

変態コードです。

ARM では空の関数は BX 命令(x86 の RET 命令みたいなもの)で4バイト使用するので、この領域を書き換えて、4バイトのスタティック変数として使用しています。

もっと領域が欲しいなら、NOP で埋めていけばいいかと。

こうすることで、template を使用している場合でも、スタティック変数を使用することが出来るようになります。

 

こういった実行バイナリの一部を書き換えるのを、自己書き換えというらしいです。

WindowsNT 系列の場合、メモリ保護という機能があって、メモリ上にロードされた実行バイナリへの書き込みは禁止されているため、ちゃんとした手続きを踏まない限りはこれを使用することは出来ません。

しかし、携帯の場合、そんな負荷の掛かる処理が出来るはずもなく、余裕で自分のバイナリを書き換えることが出来るのです。

 

通常、こういうのを書くのは、いつか ARM がメモリ保護を付けたときに困るのであまりよろしくないです。

自分もそう思ってこういうのは使用しないようにしていた訳ですが、最近の携帯では OpenGL/ES が使えて、OpenGL/ES はグローバルな変数を持っています。

この領域はどこから確保してるんだと思って調べてみると、

#if defined(__ARMCC_VERSION) && !defined(AEE_STATIC)
IGL *const gpIGL;
#define GPIGL (*(IGL**)&gpIGL)
IEGL *const gpIEGL;
#define GPIEGL (*(IEGL**)&gpIEGL)
#else
IGL *gpIGL;
#define GPIGL (gpIGL)
IEGL *gpIEGL;
#define GPIEGL (gpIEGL)
#endif

ちょっと待てコラ。普通に自己書き換え使用してるやないかと。

ということで、公式なプログラムが自己書き換えを使用している以上、しばらくはメモリ保護が掛かることは無さそうですし、メモリ保護が掛かる場合はグローバル変数が使えるようになっているだろうということで、どんどん自己書き換えしても良さそうです。

 

というかやっぱりこんなの知ったところで全く役に立ちそうにないですね(;´Д`)

投稿日時 : 2006年12月27日 2:10

コメント

# re: 自己書き換えて遊ぼう 2006/12/27 7:33 επιστημη
昔々、そんなことやってました。ROMに書かれるコードなんですけど、関数が自分自身のコピーをRAM上に作り、一部書き換えたのちそこに飛んでく、とか。
時代はZ80全盛期、公園に恐竜がいた頃のお話です(遠い目


# re: 自己書き換えて遊ぼう 2006/12/27 13:17 melt
実行時に ROM から読み出して書き換えるだなんて……よだれが出てきそうです(´ρ`)(ぉ

今でも暗号化するときは必須だとは思いますが、そうでない方々にはもう不要の技術ですよね……。

# re: 自己書き換えて遊ぼう 2006/12/27 19:26 ぽぴ王子
昔を懐かしむマン参上!

MSX全盛の頃に、ROMを自作したSRAMカートリッジにコピーして遊ぶというのが
流行っていたことがありました。
それに対抗してK○namiが考えたのが、本来ROMであるはずの領域を書き換える
コードを埋め込んでおいて、そこがSRAMだったら書き換えられてプロテクトルーチン
(「てめぇコピるってレベルじゃねぇぞ!」と表示するとか)にひっかかる
ようになる…というのがあったらしいです(見たことないけど)。

自己書き換えと言うとやっぱZ80ッスよねえ…(遠い目

# re: 自己書き換えて遊ぼう 2006/12/28 6:36 melt
そんな面白い時代があったんですね……(*´д`*)ハァハァ

自分はN88-BASICから入った人間なので、その辺全然分からないですorz

# 
Twitter Trackbacks for

??????????????????????????????
[wankuma.com]
on Topsy.com
2010/09/11 23:49 Pingback/TrackBack

Twitter Trackbacks for

??????????????????????????????
[wankuma.com]
on Topsy.com


# You can double your BITCOIN in just 24 hours without any problems 2021/08/18 21:15 JamesBot
Your welcome to join with this program, You can double your BITCOIN in just 24 hours without any problems. Minimum is only 0.001BTC, Our Company Is Legit.

Visit website

https://earn2xcoin.com
<img src="https://picfat.com/images/2021/08/18/Earn2xcoin.png">

Thanks a lot

# How To Double ETH Instantly In 2021 2021/08/21 5:29 Edwardlom
How To Double ETH Instantly In 2021

ETHER Double is a fully automated ETHEREUM investment platform operating with no human intervention.
Take full advantage of our fast and legit ETHEREUM doubler platform.
Our automated system gathers information from the blockchain transfers and cryptocurrency exchanges to study and predict the ETHEREUM price.
Our servers open and close thousands of transactions per minute, analyzing the price difference and transaction fees, and use that information to double your ETHEREUMS.
Our data centers are located on multiple locations around the world so that our system has 100% uptime guaranteed.

Click Home

https://etherdouble.com

With thanks

# AccStores.com - Buy Instagram accounts and more! Bulk and aged social media accounts. High quality! 2021/08/24 3:57 AccstoresUtigo

AccStores.com is a very good account store. Good choice, average prices. The range is very large, you can choose almost any parameter. Accounts are only high-quality, with different registration terms. Personally, I am satisfied with everything as a client, I do not see any complaints, we plan to continue using the service. I recommend this service.
Visit here
https://accstores.com

# AccStores.com - Buy Twitter accs and more! Bulk and aged social media accounts. High quality! 2021/09/26 3:24 AccstoresUtigo
A very good account store, it has been working for a long time. I buy for the purpose of earning money through social networks, on freelance exchanges. Accounts provide only high-quality ones, with different registration terms, and a wide geography. Personally, as a client, I am satisfied with everything, I see no reason to complain, the pricing policy is also reasonable. We plan to continue using the service.
Click
https://accstores.com

# ТОНИРОВАНИЕ АВТОСТЕКОЛ 2021/09/27 5:53 Jameslaums
Боковое стекло автомобиля в отличие от лобового состоит из одного закаленного слоя. При попадании камня оно может рассыпаться на мелкие частицы.
https://autosteklo77.com/rasshifrovka-eurocode - https://autosteklo77.com/rasshifrovka-eurocode Ремонт трещин более трудоёмкий процесс и по этому будет стоить дороже посравнению со сколом.

# Свежие новости 2022/01/16 17:18 Adamnjx
Где Вы ищите свежие новости?
Лично я читаю и доверяю газете https://www.ukr.net/.
Это единственный источник свежих и независимых новостей.
Рекомендую и Вам

# гидра официальный
2022/02/09 7:54 JamesFuh
??????????
-
Гидра ? это магазин разных товаров, которые вы не купите просто так в интернете. Сайт разделён на категории для удобства, есть поиск, все покупки в сервисе полностью анонимны, все магазины на hydra сайт проходят модерацию и постоянно проверяются. Товары с пометкой "моментальный заказ" возможно забрать сразу после оплаты, выбрав свой населенный пункт и район в любой точке РФ и СНГ. Товары по предзаказу необходимо немного подождать, селлер сообщит о сроках поставки. Заходи на Гидра-шоп, hydra ссылка https://onion.xn--hdraruxzpnew4af-n35h.com - это твой портал в мир новых ярких эмоций. hydraruzxpnew4af

Post Feedback

タイトル
名前
Url:
コメント