UPXもどきを作る#1
(1)
- UPXするとWindows Defenderにマルウェア扱い受けることがある。これは悲しい。どうにかしてマルウェア扱いを受けないようにしたい。
(2)
- UPXでesbasic32.exeを圧縮してみると、UPX0, UPX1, UPX2という3つのセクションができる。これは明らかに「普通」ではない。普通なら、まず「.text」があって、「.data」があって、「.bss」があって、最後に「.idata」がある。・・・ここを見てWindows Defenderはケチをつけてきているのかもしれない。
- 私が、winchars0i.exeを作った時に分かったこととして、セクションは「.text」の一個だけでも許してくれるので(.idataを.textの末尾に入れられる)、.textの一つで何とかできないだろうか?
- とはいえ、一度にあれこれと改造するとたぶん収拾がつかなくなるので、まずは「.text」「.bss」「.idata」の順番にすることを試みよう。具体的にはどうするのかというと、UPX1のセクションの内容の頭に、メモリ転送プログラムを付ける。その後にUPX版のエントリポイントにJMP。これでUPX0, UPX1の順番でロードされたかのように振る舞う。
(3)
- [分かったこと#1]
- セクションのサイズは4KB単位で切り上げることは許されるけど、それよりも1バイトでも大きくすると怒られる。
- [分かったこと#2]
- UPXではインポートテーブルを少しでも小さくするために、ASCIZの末尾のゼロを省略できるときは省略している。これは攻めている!
- [分かったこと#3]
- UPXが出力する.exeファイルのヘッダサイズは4KBということになっているが、実際は512バイトしかない。でもWindowsはこれをとがめない。
- このフィールドを無視しているというわけではなく、0にすると起動できなくなる。
- いやでも、ここでいうheaderは0x400000〜0x400fffの4KBのサイズのことを言っているのかもしれない。それならおかしくはない。
- [分かったこと#4]
- KERNEL32.dllをインポートする指定にすると、途端にチェックが厳しくなるようだ。
- [分かったこと#5]
- .idataのセクションは他のセクションとマージしてはいけない。それをやるとWindows7では実行できないバイナリになってしまう。・・・ようだ。
- でも、この.idataのセクションはサイズを切り詰めることは可能っぽい。
- いや、それもだめだった・・・。
こめんと欄
|