04/03/28

//- モモ王 a.k.a キムタク


ついに1-6コンプリート(実物で


04/03/26

//- うどん

なかにしうどんと山下を食った
宮武もいけるかと思ったら休みだった
一説によれば754軒以上あるらしいので
全部回るのは無理だなぁ

//- コロガス タマシイ オウサマと




04/03/21

//- うどん

去年も行ったんですが今年もまたうどんを食べに行きます.
5日ほど留守にする.


04/03/20

//- ZIP(再考)

BBSで教わったんだけど,LhaplusもZeldaもZipTVていうコンポーネントを使ってるらしい.

zipは暗号化するときに,先頭に12バイトの乱数列を埋め込む.
infozip系統の実装では
main(){srand(time(NULL) ^ 31415192);}
rand(){ return (seed = (seed * 0x343fd) + 0x269ec3);}
encode(){
  zip_init( password ); for(i:10) { header[i] = zip_encode(rand() >> 7); }
  zip_init( password ); for(i:10) { header[i] = zip_encode(header[i]); }
}
	  
みたいになってる. つまり,srand()が一度しか発生しない.
でも,ZipTVでは
rand(){ return (seed = (seed * 0x08088405) + 1)) >> 32; }
encode(){
  srand(time(NULL));
  zip_init( password ); for(i:10) { header[i] = zip_encode(rand() >> 7); }
  zip_init( password ); for(i:10) { header[i] = zip_encode(header[i]); }
}
	  
なんてことになってる.

infozip系の実装だと,3ファイルくらいあれば乱数の種がバレる.
最初のheader[0]は, rand() ^ key ^ key = rand(); そのままだから.
ZipTVはそうじゃない. 初期値が可変だ(もちろん変化範囲はそう多くはないけど).

おかげでこっちとしては攻撃できなくて困っちゃうわけだけど. 泣きたい.


04/03/14

//- ZIP

DLL不要の圧縮ソフトを逆汗. 乱数生成機のチェック. dispe使ってます.
Lhaca/Lhaz :: (343fd * seed) + 269ec3 ( MSVCRT.DLLと同じ )
Lhaplus/Zelda :: (seed * 0x08088405) + 1 ( Crypt-o-Text とかいうソフトの仕様?)
Winzip/Winrar :: まだ見てない

ここで不思議なのが,LhaplusとZeldaのソースがほとんど同じこと. 以下抜粋.

--- LHAPLUS ---
00402c44 f3ab                  rep     stosd
00402c46 89d1                  mov     ecx,edx
00402c48 83e103                and     ecx,byte +003h
00402c4b f3aa                  rep     stosb
00402c4d 5f                   pop     edi
00402c4e c3                   ret
00402c4f                      align 16,nop
00402c50 691544a04b0005840808 imul    edx,dword [L004ba044],dword 008088405h
00402c5a 42                   inc     edx
00402c5b 891544a04b00         mov     dword [L004ba044],edx
00402c61 f7e2                 mul     edx
00402c63 89d0                 mov     eax,edx
00402c65 c3                   ret
00402c66 8bc0                 mov     eax,eax
00402c68 53                   push    ebx
00402c69 56                   push    esi
00402c6a 57                   push    edi
00402c6b 89c6                 mov     esi,eax
00402c6d 50                   push    eax
00402c6e 85c0                 test    eax,eax
00402c70 7473                 jz      C00402ce5
00402c72 31c0                 xor     eax,eax
00402c74 31db                 xor     ebx,ebx
00402c76 bfcccccc0c           mov     edi,dword 00ccccccch
			
--- ZELDA ---
00402d20 f3ab                  rep     stosd
00402d22 89d1                  mov     ecx,edx
00402d24 83e103                and     ecx,byte +003h
00402d27 f3aa                  rep     stosb
00402d29 5f                   pop     edi
00402d2a c3                   ret
00402d2b                      align 4,nop
00402d2c 69154030500005840808 imul    edx,dword [L00503040],dword 008088405h
00402d36 42                   inc     edx
00402d37 891540305000         mov     dword [L00503040],edx
00402d3d f7e2                 mul     edx
00402d3f 89d0                 mov     eax,edx
00402d41 c3                   ret
00402d42 8bc0                 mov     eax,eax
00402d44 53                   push    ebx
00402d45 56                   push    esi
00402d46 57                   push    edi
00402d47 89c6                 mov     esi,eax
00402d49 50                   push    eax
00402d4a 85c0                 test    eax,eax
00402d4c 7473                 jz      C00402dc1
00402d4e 31c0                 xor     eax,eax
00402d50 31db                 xor     ebx,ebx
00402d52 bfcccccc0c           mov     edi,dword 00ccccccch
			

いやこれ一致しすぎだろ〜


04/03/11

//- 本とか
神は沈黙せず
あしたのロボット

読了.
疲れた.睡眠不足になりかけた.
04/03/05

//- PKE

公開鍵暗号をうまく使えば、絶対にクラックできない
シリアル認証が実現できるような気がする.

シリアル番号には署名をつけておくのは当前なんだけど,
クラックされうる部分(たとえば jz → jnz みたいな)を
仮想マシンで実行するようにしておいて,
仮想マシン用のコードを秘密鍵で暗号化しておく.

公開鍵で展開することはできるけど,公開鍵に対応する秘密鍵が手に入らないため,
条件判断部分を書き換えることはできない.

これで,クラックされないシリアル認証が実現できる気がする.


04/03/02

7万行の逆アセンブルコードを読んでいます


04/03/01

スキー(というかボード)行ってました.
下半身の強化をしたのですべりが変わった.

あとチャリのFDをDEOREにした.チェーンも変えた.最高.