strcpy---アセンブリのプロセス

4305 ワード

strcpyでアセンブリするプロセス

00401191       mov edi,dword ptr ss:[esp+0x8]           ;  buffer 
00401195       jmp short test.00401201
...
00401201       mov ecx,dword ptr ss:[esp+0xC]           ;  cpy 
00401205       test ecx,0x3                             ;   cpy 
0040120B       je short test.00401226
...
00401226       mov edx,0x7EFEFEFF
0040122B       mov eax,dword ptr ds:[ecx]              ;  eax buffer 
0040122D       add edx,eax                             ;  eax+7EFEFEFF
0040122F       xor eax,-0x1                            ;   eax 
00401232       xor eax,edx                             ;  eax  xor (7EFEFEFF+eax)
00401234       mov edx,dword ptr ds:[ecx]              ;   buffer 
00401236       add ecx,0x4                             ;  ecx-->buffer+4
00401239       test eax,0x81010100                     ;  ** **
0040123E       je short test.00401221
00401240       test dl,dl
00401242       je short test.00401278                  ;   00
00401244       test dh,dh
00401246       je short test.0040126F                  ;   00
00401248       test edx,0xFF0000
0040124E       je short test.00401262                  ;   00
00401250       test edx,0xFF000000
00401256       je short test.0040125A                  ;   00
00401258       jmp short test.00401221
0040125A       mov dword ptr ds:[edi],edx
0040125C       mov eax,dword ptr ss:[esp+0x8]
00401260       pop edi                                  ;  0012FB20
00401261       retn
00401262       mov word ptr ds:[edi],dx
00401265       mov eax,dword ptr ss:[esp+0x8]
00401269       mov byte ptr ds:[edi+0x2],0x0
0040126D       pop edi                                  ;  0012FB20
0040126E       retn
0040126F       mov word ptr ds:[edi],dx
00401272       mov eax,dword ptr ss:[esp+0x8]
00401276       pop edi                                  ;  0012FB20
00401277       retn
00401278       mov byte ptr ds:[edi],dl
0040127A       mov eax,dword ptr ss:[esp+0x8]
0040127E       pop edi                                  ;  0012FB20
0040127F       retn


注記:0 x 81010100と同様にしたり演算したりして、変更配列に00が存在すると判断し、それぞれ4つのケースがある
  • の最初のバイトは00:0040122 D add edx,eaxではedxの最後のバイトは必ずFFであり、同時にキャリーが発生しない場合、2番目のバイト数は(xx-2)xor(!xx)、8番目のバイトは必然的に1であり、0でなければ、その場所(xx-1)xor(!xx)の8番目のビットは必然的に0である.同じ理屈で2番目、3番目.
  • の4番目のバイトは00で、add edx、eaxでedxの1番目のバイトは必ず7 F(7 E+00+3番目のビットの進位)で、7 F xor(!00)=0 x 1000,000,
  • したがって、test 0 x 81010100は、4バイトに00が存在する場合にのみ1ではなく、ループから飛び出し、次に00のバイト数と判断される.