ICFP2007 (22) 画像修復(1)の続きです。
(13) river 左下の川
- 0x71c897をmkGoldfishR_adaptationにする (a)
- 0x71c9ffをmkGoldfishL_adaptationにする (b)
- 0x71cb67をmkGoldfishR_adaptationにする (c)
- 0x71cc3fを18にする (d)
- 0x71cd17をmkGoldfishL_adaptationにする (e)
- 0x71cec7をmkGoldfishL_adaptationにする (f)
- 0x71cf0fをmkGoldfishR_adaptationにする (g)
川を修正する必要はありませんが川の中の魚を修正します。魚はdrawGoldenFish_adaptationで描かれています。この中のgoldenFish_adaptationを修正することになります。adaptationについては修復ガイドの
page 9に書かれています。各adaptationについては
FuunDocに書かれています。
goldenFish_adaptationを逆アセンブルした結果です。段付けは手動です。パラメータで一段深くしています。最初の方はmkBeforeAbove(mkEmp(0x14, 0x14), mkBeforeAbove(...))のように解釈できます。
goldenFish_adaptation 71c66f 0008d0
71c66f 0008a0
71c687 activateAdaptationTree
71c69f mkBeforeAbove_adaptation
71c6b7 0000c0
71c6cf activateAdaptationTree
71c6e7 mkEmp_adaptation
71c6ff 000030
71c717 intBox
71c72f 000014
71c747 000030
71c75f intBox
71c777 000014
71c78f 000780
71c7a7 activateAdaptationTree
71c7bf mkBeforeAbove_adaptation
71c7d7 000390
71c7ef activateAdaptationTree
71c807 mkAbove_adaptation
71c81f 0001e0
71c837 activateAdaptationTree
71c84f mkBeforeAbove_adaptation
71c867 000030
71c87f activateAdaptationTree
71c897 mkGoldfishL_adaptation ← (a) mkGoldfishR_adaptation
71c8af 000150
71c8c7 activateAdaptationTree
71c8df mkBeforeAbove_adaptation
71c8f7 0000c0
71c90f activateAdaptationTree
71c927 mkEmp_adaptation
71c93f 000030
71c957 intBox
71c96f 7ffffe
71c987 000030
71c99f intBox
71c9b7 7fffff
71c9cf 000030
71c9e7 activateAdaptationTree
71c9ff mkGoldfishR_adaptation ← (b) mkGoldfishL_adaptation
71ca17 000150
71ca2f activateAdaptationTree
71ca47 mkBeforeAbove_adaptation
71ca5f 0000c0
71ca77 activateAdaptationTree
71ca8f mkEmp_adaptation
71caa7 000030
71cabf intBox
71cad7 00002d
71caef 000030
71cb07 intBox
71cb1f 000018
71cb37 000030
71cb4f activateAdaptationTree
71cb67 mkGoldfishL_adaptation ← (c) mkGoldfishR_adaptation
71cb7f 000390
71cb97 activateAdaptationTree
71cbaf mkBeforeAbove_adaptation
71cbc7 0000c0
71cbdf activateAdaptationTree
71cbf7 mkEmp_adaptation
71cc0f 000030
71cc27 intBox
71cc3f 000000 ← (d) 0x12
71cc57 000030
71cc6f intBox
71cc87 000018
71cc9f 000270
71ccb7 activateAdaptationTree
71cccf mkAbove_adaptation
71cce7 000030
71ccff activateAdaptationTree
71cd17 mkGoldfishR_adaptation ← (e) mkGoldfishL_adaptation
71cd2f 0001e0
71cd47 activateAdaptationTree
71cd5f mkBeforeAbove_adaptation
71cd77 0000c0
71cd8f activateAdaptationTree
71cda7 mkEmp_adaptation
71cdbf 000030
71cdd7 intBox
71cdef 000019
71ce07 000030
71ce1f intBox
71ce37 00001d
71ce4f 0000c0
71ce67 activateAdaptationTree
71ce7f threeFish_adaptation
71ce97 000030
71ceaf activateAdaptationTree
71cec7 mkGoldfishR_adaptation ← (f) mkGoldfishL_adaptation
71cedf 000030
71cef7 activateAdaptationTree
71cf0f emptyBox_adaptation ← (g) mkGoldfishR_adaptation
71cf27 00c662
(14) whale 鯨
- if文の条件を反転する (0x266585にIPPを書く)
- 座標を(410, 200)にする
噴水はwhaleより前に描く必要があります。またcupはwhaleより後に描く必要があります。噴水とcupについては後で記します。
whaleのパラメータは2つのboolです。1番目が表情でPで泣き顔、Fで笑顔です。2番目は使用されていません。if文の条件を反転することで笑顔にしています。ifを書き換えるかわりに呼び出し時の第1パラメータを書き換える手も考えられます。
(15) crater
- 不要なのでskipする
(16) bmu endoさん
- enableBiomorphをPにする (enableBiomorphはGZ+0x033963)
- weather判定と変なRNAをskip (0x0dafadにgoto 0x0db0fbを書く)
- 変なrnaとendocowをskip (0x0df476にgoto 0x0df78cを書く)
- cow-spot-middleの誤り訂正 (correctErrors(0x0d985b, 0x000b34, 0x0da3a7))
- cow-tailの復号 (crypt("9546", 0x4aa77d, 0x00145c))
- cow-tailの色修正 addOpaqueを7個、addTransparentを3個追加
- cow-tailのintegrity checkをskip
enableBiomorphはPにしなくても、ifをskipするだけでもいいです。次でweather判定をskipしているので統合した方がprefixが短くなります(0x0daee5にgoto 0x0db0fbを書く)。
cow-tailは復号しただけだと不透明です。0.3だけ透明にします。cow-tailの最初でbucketをemptyにするRNAコードがあるので、これをつぶしてやります。そうするとintegrity checkが通らなくなるので、integrity checkもskipします。今はintegrity checkの所に透明化用のRNA出力を上書きしています。integrity checkはそのままでcow-tailの途中に飛び込む手もありますが、透明化コードを置く場所に困ります。既存のコードで再利用できそうな部分を探すとよいかもしれません。このあたりはもうちょっと考えた方がよさそうです。
暗号化については修復ガイドの
page 4405829に書かれています(このページの復号結果は
ここです)。cow-tailの暗号鍵9546は力技で
発見しました。どこかにヒントがありそうですが見つかっていません。完全数というわけでもなく謎です。もしかすると特徴のない最小の数かもしれません(笑)。
誤り訂正符号については修復ガイドの
page 84に書かれています(このページは暗号化されていて
鍵は42でした)。
bmuはおおまかに以下のような流れになっています。
void bmu(void)
{
if(enableBioMorph == P){
if(weather == 1 || weather == 2){
cowを描く
endocow();
} else if(ducksShown == P){
superDuck();
} else if(ocamlrules == P){
ocaml();
} else {
mlephant();
}
} else {
endo();
}
}
各変数の初期値は
enableBioMorph(0x033963) = F
weather(0x03394b) = 0
ducksShown(0x033964) = F
ocamlrules(0x0c9228) = P
です。ducksShownはscenarioの中でmotherDuckWithChicksを呼び出す直前でPが代入されています。値を変えると色々な画像が見れます。
endocowにしたときの画像です。
superDuckです。
ocamlです。
mlephantです。
endoです。
長くなってきたので続きます。