αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

αž“αŸ… PHDays 9 αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž™αžΎαž„αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈ hack αžšαŸ„αž„αž…αž€αŸ’αžšαž”αžΌαž˜αž§αžŸαŸ’αž˜αŸαž“ - αž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„ Ninja αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜. αž˜αžΆαž“αž€αž“αŸ’αž›αŸ‚αž„αžˆαžšαž…αŸ†αž“αž½αž“αž”αžΈαž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ (αž‚αŸ’αž˜αžΆαž“αžŸαž“αŸ’αžαž·αžŸαž»αž αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž‘αžΆαž” αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹) αžŠαŸ„αž™αžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ– αžαŸ’αž™αž›αŸ‹αž€αŸ’αžšαŸ„αž˜αžŸαž˜αŸ’αž–αžΆαž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ‰αŸαž„αž”αŸ‰αŸ„αž„αž˜αž½αž™ (αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž‰αŸ’αž…αŸαž‰)αŸ”

αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαž»αžŸαŸ—αž‚αŸ’αž“αžΆαž€αŸαžŠαŸ„αž™ αžŸαž˜αžΆαžŸαž—αžΆαž–αž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αž“αŸƒαž€αž“αŸ’αž›αŸ‚αž„αžˆαžšαž‚αžΊαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ– ស៊េរី Siemens Simatic PLC S7-300; αž”αŸŠαžΌαžαž»αž„αž”αžšαž·αžαŸ’αžαž•αžšαžŽαžΆαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž”αž“αŸ’αž‘αžΆαž“αŸ‹ αž“αž·αž„αž§αž”αž€αžšαžŽαŸαžœαžΆαžŸαŸ‹αžŸαž˜αŸ’αž–αžΆαž’ (αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž’αžΆαžαž»αž”αž‰αŸ’αž…αžΌαž›αžŒαžΈαž‡αžΈαžαž› PLC (DI)); αžœαŸ‰αžΆαž›αŸ‹αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαž·αž•αžšαžŽαžΆ αž“αž·αž„αž”αžšαž·αžαŸ’αžαž•αžšαžŽαžΆαž“αŸƒαžαŸ’αž™αž›αŸ‹ (αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž“αžΉαž„αž›αž‘αŸ’αž’αž•αž›αžŒαžΈαž‡αžΈαžαž›αž“αŸƒ PLC (DO)) - αžŸαžΌαž˜αž˜αžΎαž›αžšαžΌαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

PLC αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž€αžΆαžšαž’αžΆαž“αžŸαž˜αŸ’αž–αžΆαž’ αž“αž·αž„αž’αž“αž»αž›αŸ„αž˜αžαžΆαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αžœαžΆ αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžαžΌαž… αž¬αž”αŸ†αž”αŸ‰αŸ„αž„αž”αžΆαž›αŸ‹ (αž”αžΎαž€ αž“αž·αž„αž”αž·αž‘αžœαŸ‰αžΆαž›αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆ)αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‘αžΈαžαžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αžšαž”αŸ€αž”αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αžŠαŸƒ αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžŸαž“αŸ’αž‘αŸ‡αž”αž·αž‘αž”αžΎαž€αž”αžΆαž“αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαžšαžΉαžαž”αž“αŸ’αžαžΉαž„αžŽαžΆαž˜αž½αž™αž‘αžΎαž™αŸ”

αž€αž“αŸ’αž›αŸ‚αž„αžˆαžšαž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αžΆαžšαž”αžΎαž€αžšαž”αŸ€αž”αž“αŸαŸ‡αŸ– αž“αŸ…αž‘αžΈαžαžΆαŸ†αž„αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž€αžΆαžšαž–αžΆαžš αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžœαžΆ αž αžΎαž™αž“αŸ…αž‘αžΈαžαžΆαŸ†αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹ αžœαžΆαž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‡αžΆαž„αŸ”

αž”αž‰αŸ’αž αžΆαž”αŸ’αžšαžΆαŸ†αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž–αžΈαžšαžαŸ’αž„αŸƒ; αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž…αŸ†αžŽαžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž›αŸαž 233 αž‘αž‘αž½αž›αž”αžΆαž“ 1 αž–αž·αž“αŸ’αž‘αž» (αž‚αžΆαžαŸ‹αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαžšαŸ€αž”αž…αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαž€αž½αž) αŸ” αž’αŸ’αž“αž€αžˆαŸ’αž“αŸ‡αž”αžΈαž“αžΆαž€αŸ‹αŸ– αžαŸ’αž‰αž»αŸ†αžŠαžΆαž€αŸ‹ - aXNUMXexdandy, II - Rubikoid, III - Ze αŸ”

αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž› PHDays αž‚αŸ’αž˜αžΆαž“αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž™αž€αžˆαŸ’αž“αŸ‡αž›αžΎαž‡αŸ†αž αžšαž‘αžΆαŸ†αž„αž”αžΈαž”αžΆαž“αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αžαžΆαž˜αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž αž αžΎαž™αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸαž›αŸ†αž”αžΆαž€αž”αŸ†αž•αž»αžαž“αŸ…αžŠαžΎαž˜αžαŸ‚αž˜αž·αžαž»αž“αžΆαŸ” αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžαŸ’αžšαžΌαžœαž”αŸ†αž–αŸαž‰αž—αžΆαžšαž€αž·αž…αŸ’αž…αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžαŸ‚ αžŸαŸ’αžœαŸ‚αž„αžšαž€αž‘αž„αŸ‹αž‡αžΆαžαž· αž“αž·αž„αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž™αŸ‰αžΆαž„αž›αž˜αŸ’αž’αž·αž αž“αž·αž„αžαžΆαž˜αžšαž”αŸ€αž”αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹αž“αŸαŸ‡ αž™αžΎαž„αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαž…αŸ†αž–αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž–αžΈαž’αŸ’αž“αž€αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžαŸ‚ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αžŠαŸ„αž™ Alexey Kovrizhnykh (a1exdandy) αž˜αž€αž–αžΈαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Digital Security αžŠαŸ‚αž›αž”αžΆαž“αžŠαžŽαŸ’αžŠαžΎαž˜αž…αŸ†αžŽαžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž›αŸαž XNUMX αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž› PHDays αŸ” αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡ αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αž’αžαŸ’αžαž”αž‘αžšαž”αžŸαŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αž‹αž˜

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αžΆαž“αž”αžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž―αž€αžŸαžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • block_upload_traffic.pcapng
  • DB100.bin
  • αž–αŸαžαŸŒαž˜αžΆαž“αž‡αŸ†αž“αž½αž™.txt

αž―αž€αžŸαžΆαžš hints.txt αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αž‡αŸ†αž“αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ” αž“αŸαŸ‡αž‡αžΆαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ–

  1. Petrovich αž”αžΆαž“αž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αžΆαž›αž–αžΈαž˜αŸ’αžŸαž·αž›αž˜αž·αž‰αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‘αž»αž€αž”αŸ’αž›αž»αž€αž–αžΈ PlcSim αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αž‘αžΈ 7 αŸ”
  2. Siemens Simatic S7-300 ស៊េរី PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžˆαžšαŸ”
  3. PlcSim αž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜ PLC αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Siemens S7 PLCs αŸ”

αž―αž€αžŸαžΆαžš DB100.bin αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž˜αžΆαž“αž”αŸ’αž›αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ DB100 PLCαŸ– 00000000: 0100 0102 6e02 0401 0206 0100 0101 0102 ....n......... 00000010: 1002 0501 0202 ០៑០្. ..... ......... 2002: 0501 0206 0100 0102 00000020 0102 7702 0401a0206 ..w............. 0100: 0103 0102 0 02 00000030 0501 ................ 0202: 1602 0501 0206 0100 0104 0102 00000040a7502 0401 u............... 0206: 0100 0105 0102 0 02 0501 ០៑០្ ៣ៀ០្............ៀ. 00000050: 0202 1602 0501 0206 0100 0106 0102 3402 ............&..... 4: 00000060c0401 0206 0100 0107 0102 2602 ...... : 0501 0202 00000070 4 02a0501 0206 0100 0108 ................ 0102: 3302 0401 3 00000080a 0206 0100 0109 0102 .......... ៧. 0a02: 0501 0202b 1602 00000090 0501 0206 0100 010......".....F... 0102b3702: 0401 0206 7c........ 000000 0 0100.... .. 010c0102: 2202d 0501 0202a4602 0501 000000 0 0206 0100 ................ 010d0102: 3302 0401e 0206 0100d3 000000 0 ...... .... 010e0102: 0 02 0501 0202 1602 0501 0206 000000 ........#...... 0f0100: 010 0102 6 02 0401 0206..... ..... 0100: 010 000000 0 0102 1102 0501 0202 2302......%......... 0501: 0206 0100 000000 0 0110 0102 ..... .....&.3502:0401 0206 0100c0111 0102 5 00000100 ....L......

αžŠαžΌαž…αžŠαŸ‚αž›αžˆαŸ’αž˜αŸ„αŸ‡αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰ αž―αž€αžŸαžΆαžš block_upload_traffic.pcapng αž•αŸ’αž‘αž»αž€αž“αžΌαžœαž…αžšαžΆαž…αžšαžŽαŸαž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž”αŸ’αž›αž»αž€αž‘αŸ… PLC αŸ”

αž‚αž½αžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž€αžΆαžšαž…αŸ„αž›αž…αžšαžΆαž…αžšαž“αŸαŸ‡αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŸαž“αŸ’αž“αž·αžŸαžΈαž‘αž‚αžΊαž–αž·αž”αžΆαž€αž‡αžΆαž„αž”αž“αŸ’αžαž·αž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αžΆαž“ αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž™αž›αŸ‹αž’αŸ†αž–αžΈαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αžΈαž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ TeslaSCADA2αŸ” αž–αžΈαžœαžΆαž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αžαžΆαž€αž“αŸ’αž›αŸ‚αž„αž”αŸ„αŸ‡αž…αŸ„αž›αžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŠαŸ„αž™αž”αŸ’αžšαžΎ RC4 αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… αž“αž·αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαžΎαžŸαŸ„αžŠαžΎαž˜αŸ’αž”αžΈαžŒαž·αž‚αŸ’αžšαžΈαž”αžœαžΆαŸ” αž€αžΆαžšαž”αŸ„αŸ‡αž…αŸ„αž›αž”αŸ’αž›αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαž–αž·αž’αžΈαž€αžΆαžš S7 αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαžŸαžΆαž€αž›αŸ’αž”αž„αž–αžΈαž€αž‰αŸ’αž…αž”αŸ‹ Snap7 αŸ”

αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž”αŸ’αž›αž»αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž‰αŸ’αž‰αžΆαž…αŸαž‰αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αž…αžΆαž€αŸ‹αžŸαŸ†αžšαžΆαž˜

αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž€αž“αŸ’αž›αŸ‚αž„αž…αžΆαž€αŸ‹αžŸαŸ†αžšαžΆαž˜ αž’αŸ’αž“αž€αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αžαžΆαžœαžΆαž˜αžΆαž“αž”αŸ’αž›αž»αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž‰αŸ’αž‰αžΆ OB1, FC1, FC2 αž“αž·αž„ FC3αŸ–

αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

αž”αŸ’αž›αž»αž€αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αž™αž€αž…αŸαž‰αŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αžŠαŸ„αž™αž”αžΆαž“αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž…αžšαžΆαž…αžšαž–αžΈαž‘αž˜αŸ’αžšαž„αŸ‹ pcapng αž‘αŸ…αž‡αžΆ pcap αž–αžΈαž˜αž»αž“αŸ–

#!/usr/bin/env python2

import struct
from scapy.all import *

packets = rdpcap('block_upload_traffic.pcap')
s7_hdr_struct = '>BBHHHHBB'
s7_hdr_sz = struct.calcsize(s7_hdr_struct)
tpkt_cotp_sz = 7
names = iter(['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin'])
buf = ''

for packet in packets:
    if packet.getlayer(IP).src == '10.0.102.11':
        tpkt_cotp_s7 = str(packet.getlayer(TCP).payload)
        if len(tpkt_cotp_s7) < tpkt_cotp_sz + s7_hdr_sz:
            continue
        s7 = tpkt_cotp_s7[tpkt_cotp_sz:]
        s7_hdr = s7[:s7_hdr_sz]
        param_sz = struct.unpack(s7_hdr_struct, s7_hdr)[4]
        s7_param = s7[12:12+param_sz]
        s7_data = s7[12+param_sz:]
        if s7_param in ('x1ex00', 'x1ex01'):  # upload
            buf += s7_data[4:]
        elif s7_param == 'x1f':
            with open(next(names), 'wb') as f:
                f.write(buf)
            buf = ''

αžŠαŸ„αž™αž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ’αž›αž»αž€αž›αž‘αŸ’αž’αž•αž› αž’αŸ’αž“αž€αž“αžΉαž„αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αžαžΆαž–αž½αž€αžœαžΆαžαŸ‚αž„αžαŸ‚αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž”αŸƒ 70 70 (pp)αŸ” αž₯αž‘αžΌαžœαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžœαž·αž—αžΆαž‚αž–αž½αž€αž‚αŸαŸ” αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ PlcSim αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αŸ”

αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αžšαž”αžŸαŸ‹αž˜αž“αž»αžŸαŸ’αžŸαž–αžΈαž”αŸ’αž›αž»αž€

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ S7-PlcSim αžŠαŸ„αž™αž•αŸ’αž‘αž»αž€αž”αŸ’αž›αž»αž€αž‡αžΆαž…αŸ’αžšαžΎαž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžŠαŸ‚αž›αŸ— (= Q 0.0) αž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Simmatic αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ PLC αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž‘αŸ…αž―αž€αžŸαžΆαžš example.plc αŸ” αžŠαŸ„αž™αž˜αžΎαž›αž›αžΎαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž―αž€αžŸαžΆαžš αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αžΌαžœαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž”αŸ’αž›αž»αž€αžŠαŸ‚αž›αž”αžΆαž“αž‘αžΆαž‰αž™αž€αžŠαŸ„αž™αž αžαŸ’αžαž›αŸαžαžΆ 70 70 αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž˜αž»αž“αŸ” αž˜αž»αž“αž“αžΉαž„αž”αŸ’αž›αž»αž€ αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž‘αŸ†αž αŸ†αž”αŸ’αž›αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆαžαž˜αŸ’αž›αŸƒ 4-byte little-endian αŸ”

αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž™αžΎαž„αž”αžΆαž“αž‘αž‘αž½αž›αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž―αž€αžŸαžΆαžšαž—αžΈαž’αž·αž›αžŸαŸŠαžΈ αž•αŸ‚αž“αž€αžΆαžšαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž”αžΆαž“αž›αŸαž…αž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ PLC S7αŸ–

  1. αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Simatic αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„ S7-PlcSim αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž‘αž‘αž½αž›αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αž…αžΆαž€αŸ‹αžŸαŸ†αžšαžΆαž˜αŸ” αž‘αŸ†αž αŸ†αž”αŸ’αž›αž»αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„ (αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αžŠαŸ„αž™αž€αžΆαžšαž”αŸ†αž–αŸαž‰αž”αŸ’αž›αž»αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αŸ†αž“αž½αž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš) αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ (OB1, FC1, FC2, FC3) αŸ”
  2. αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ PLC αž‘αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž˜αž½αž™αŸ”
  3. αž™αžΎαž„αž‡αŸ†αž“αž½αžŸαž˜αžΆαžαž·αž€αžΆαž“αŸƒαž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž›αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αž›αž»αž€αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αž…αžΆαž€αŸ‹αžŸαŸ†αžšαžΆαž˜αŸ” αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž”αŸ’αž›αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž αžαŸ’αžαž›αŸαžαžΆαŸ”
  4. αž™αžΎαž„αž•αŸ’αž‘αž»αž€αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž›αž‘αŸ…αž€αŸ’αž“αž»αž„ S7-PlcSim αž αžΎαž™αž˜αžΎαž›αž˜αžΆαžαž·αž€αžΆαž“αŸƒαž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸŠαžΈαž˜αž·αž€αŸ”

αž”αŸ’αž›αž»αž€αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαž§αž‘αžΆαž αžšαžŽαŸαžŠαŸ„αž™αž›αŸαžαž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

with open('original.plc', 'rb') as f:
    plc = f.read()
blocks = []
for fname in ['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin']:
    with open(fname, 'rb') as f:
        blocks.append(f.read())

i = plc.find(b'pp')
for block in blocks:
    plc = plc[:i] + block + plc[i+len(block):]
    i = plc.find(b'pp', i + 1)

with open('target.plc', 'wb') as f:
    f.write(plc)

Alexey αž”αžΆαž“αž™αž€αž•αŸ’αž›αžΌαžœαž–αž·αž”αžΆαž€αž‡αžΆαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ‚αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž™αžΎαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž“αžΉαž„αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ NetToPlcSim αžŠαžΌαž…αŸ’αž“αŸαŸ‡ PlcSim αž’αžΆαž…αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰ αž”αž„αŸ’αž αŸ„αŸ‡αž”αŸ’αž›αž»αž€αž‘αŸ… PlcSim αžαžΆαž˜αžšαž™αŸˆ Snap7 αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‘αžΆαž‰αž™αž€αž”αŸ’αž›αž»αž€αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž–αžΈ PlcSim αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αžšαž·αž™αžΆαž€αžΆαžŸαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ”

αžŠαŸ„αž™αž€αžΆαžšαž”αžΎαž€αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž›αž“αŸ…αž€αŸ’αž“αž»αž„ S7-PlcSim αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αŸ’αž›αž»αž€αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž‡αžΆαž“αŸ‹αž›αžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸŠαžΈαž˜αž·αž€αŸ” αž˜αž»αžαž„αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž§αž”αž€αžšαžŽαŸαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ FC1 αŸ” αž…αŸ†αžŽαžΆαŸ†αž–αž·αžŸαŸαžŸαž‚αžΊαž’αžαŸαžš #TEMP0 αžŠαŸ‚αž›αž“αŸ…αž–αŸαž›αž”αžΎαž€αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ PLC αž‘αŸ…αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ„αž™αžŠαŸƒαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžαž˜αŸ’αž›αŸƒαž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† M2.2 αž“αž·αž„ M2.3 αž”αŸŠαžΈαžαŸ” αžαž˜αŸ’αž›αŸƒ #TEMP0 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž’αž“αž»αž‚αž˜αž“αŸ FC3αŸ”

αžαžΆαž˜αž‚αž“αŸ’αž›αž„αž“αŸƒ Industrial NinjaαŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž› PLC αžαŸ’αžšαžΌαžœαž”αžΆαž“ hack αž“αŸ…αž― Positive Hack Days 9

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžœαž·αž—αžΆαž‚αž˜αž»αžαž„αžΆαžš FC3 αž αžΎαž™αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαžαŸ’αžšαž‘αž”αŸ‹αž‡αžΆαž‘αžΌαž‡αžΈαžαž›αŸ”

αž”αŸ’αž›αž»αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž‰αŸ’αž‰αžΆ PLC αž“αŸ…αž‘αžΈαžαžΆαŸ†αž„ Low Security αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžαžΆαž˜αžšαž”αŸ€αž”αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžš #TEMP0 αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž”αž“αŸ’αž‘αžΆαžαŸ‹αžœαž·αž’αžΈ Ninja αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ DB1αŸ” αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž‚αžΊαžαŸ’αžšαž„αŸ‹αž αžΎαž™αž˜αž·αž“αž‘αžΆαž˜αž‘αžΆαžšαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž‡αŸ’αžšαŸ…αž‡αŸ’αžšαŸ‡αž“αŸƒαž—αžΆαžŸαžΆαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ’αž›αž»αž€αž‘αŸαŸ” αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž“αŸ…αž€αž˜αŸ’αžšαž·αžαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹ αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αžŠαŸƒαž“αžΉαž„αž–αž·αž”αžΆαž€αž‡αžΆαž„ αž αžΎαž™αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž—αžΆαžŸαžΆ STL (αžœαž·αž’αžΈαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžœαž·αž’αžΈαžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ S7 PLC) αŸ”

αž”αŸ’αž›αž»αž€αž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸ FC3

αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž”αŸ’αž›αž»αž€ FC3 αž€αŸ’αž“αž»αž„αžαŸ†αžŽαžΆαž„ STLαŸ–

      L     B#16#0
      T     #TEMP13
      T     #TEMP15
      L     P#DBX 0.0
      T     #TEMP4
      CLR   
      =     #TEMP14
M015: L     #TEMP4
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D   
      JC    M016
      L     DW#16#0
      T     #TEMP0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  
M00d: L     B [AR1,P#0.0]
      T     #TEMP5
      L     W#16#1
      ==I   
      JC    M007
      L     #TEMP5
      L     W#16#2
      ==I   
      JC    M008
      L     #TEMP5
      L     W#16#3
      ==I   
      JC    M00f
      L     #TEMP5
      L     W#16#4
      ==I   
      JC    M00e
      L     #TEMP5
      L     W#16#5
      ==I   
      JC    M011
      L     #TEMP5
      L     W#16#6
      ==I   
      JC    M012
      JU    M010
M007: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M003
      JU    M001
      JU    M002
      JU    M004
M003: JU    M005
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP0
      JU    M006
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP1
      JU    M006
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP2
      JU    M006
M00f: +AR1  P#1.0
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      T     #TEMP11
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      TAR1  #TEMP4
      OPN   DB   101
      L     P#DBX 0.0
      LAR1  
      L     #TEMP11
      +AR1  
      LAR2  #TEMP9
      L     B [AR2,P#0.0]
      T     B [AR1,P#0.0]
      L     #TEMP4
      LAR1  
      JU    M006
M008: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    M005
M00b: L     #TEMP3
      T     #TEMP0
      JU    M006
M00a: L     #TEMP3
      T     #TEMP1
      JU    M006
M00c: L     #TEMP3
      T     #TEMP2
      JU    M006
M00e: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M011: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M012: L     #TEMP15
      INC   1
      T     #TEMP15
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #TEMP4
      L     B#16#0
      T     #TEMP6
      JU    M006
M014: L     #TEMP4
      LAR1  
      L     #TEMP13
      L     L#1
      +I    
      T     #TEMP13
      JU    M006
M006: L     #TEMP0
      T     MB   100
      L     #TEMP1
      T     MB   101
      L     #TEMP2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    M005
M010: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #TEMP4
M005: TAR1  #TEMP4
      CLR   
      =     #TEMP16
      L     #TEMP13
      L     L#20
      ==I   
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M017
      L     #TEMP13
      L     L#20
      <I    
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M018
      JU    M019
M017: SET   
      =     #TEMP14
      JU    M016
M018: CLR   
      =     #TEMP14
      JU    M016
M019: CLR   
      O     #TEMP14
      =     #RET_VAL
      JU    M015
M016: CLR   
      O     #TEMP14
      =     #RET_VAL

αž€αžΌαžŠβ€‹αž“αŸαŸ‡β€‹αž˜αžΆαž“β€‹αž”αŸ’αžšαžœαŸ‚αž„β€‹αžœαŸ‚αž„β€‹αžŽαžΆαžŸαŸ‹ αž αžΎαž™β€‹αž αžΆαž€αŸ‹β€‹αžŠαžΌαž…β€‹αž‡αžΆβ€‹αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰β€‹αž…αŸ†αž–αŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αžŸαŸ’αž‚αžΆαž›αŸ‹ STLαŸ” αž˜αž·αž“αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αžŽαžΆαž˜αž½αž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αžΈαž˜αž½αž™αŸ—αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‘αŸ αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž›αž˜αŸ’αž’αž·αž αž“αž·αž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸƒαž—αžΆαžŸαžΆ STL αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ€αžœαž—αŸ…αžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ– αž”αž‰αŸ’αž‡αžΈαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸ (STL) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ S7-300 αž“αž·αž„ S7-400. αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž€αžΌαžŠαžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš - αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αžŸαŸ’αž›αžΆαž€ αž“αž·αž„αž’αžαŸαžš αž“αž·αž„αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αžŠαŸ‚αž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž“αž·αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž—αžΆαžŸαžΆ STL αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆαž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαž½αžšαž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΌαžŠαž”αŸƒαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž”αŸ’αž›αž»αž€ DB100 αžŠαŸ‚αž›αž‡αžΆαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžŠαŸ‚αž›αž™αžΎαž„αžŠαžΉαž„αŸ” αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž˜αžΆαž“ 1 αž”αŸƒαž“αŸƒαž€αžΌαžŠαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž“αž·αž„αž”αŸƒαž“αŸƒαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ αž˜αž½αž™αž”αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž“αžΈαž˜αž½αž™αŸ—αŸ” αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž…αžΆαžšαžŽαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž–αžΈαžš αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž‡αžΆ X αž“αž·αž„ Y αŸ”

αž€αžΌαžŠαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš]

# Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
      L     B#16#0
      T     #CHECK_N        # Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ
      T     #COUNTER_N      # Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ
      L     P#DBX 0.0
      T     #POINTER        # Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ
      CLR   
      =     #PRE_RET_VAL

# Основной Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°
LOOP: L     #POINTER
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D                   # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Ρ…ΠΎΠ΄Π° указатСля Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
      JC    FINISH
      L     DW#16#0
      T     #REG0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  

# ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ switch - case для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ²
M00d: L     B [AR1,P#0.0]
      T     #OPCODE
      L     W#16#1
      ==I   
      JC    OPCODE_1
      L     #OPCODE
      L     W#16#2
      ==I   
      JC    OPCODE_2
      L     #OPCODE
      L     W#16#3
      ==I   
      JC    OPCODE_3
      L     #OPCODE
      L     W#16#4
      ==I   
      JC    OPCODE_4
      L     #OPCODE
      L     W#16#5
      ==I   
      JC    OPCODE_5
      L     #OPCODE
      L     W#16#6
      ==I   
      JC    OPCODE_6
      JU    OPCODE_OTHER

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΏΠΊΠΎΠ΄Π° 01: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния ΠΈΠ· DB101[X] Π² рСгистр Y
# OP01(X, Y): REG[Y] = DB101[X]
OPCODE_1: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]   # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° X (индСкс Π² DB101)
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]   # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Y (индСкс рСгистра)
      JL    M003            # Аналог switch - case Π½Π° основС значСния Y
      JU    M001            # для Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ рСгистра для записи.
      JU    M002            # ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ конструкции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ…
      JU    M004            # опСрациях Π½ΠΈΠΆΠ΅ для Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ
M003: JU    LOOPEND
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG0           # Π—Π°ΠΏΠΈΡΡŒ значСния DB101[X] Π² REG[0]
      JU    PRE_LOOPEND
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG1           # Π—Π°ΠΏΠΈΡΡŒ значСния DB101[X] Π² REG[1]
      JU    PRE_LOOPEND
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG2           # Π—Π°ΠΏΠΈΡΡŒ значСния DB101[X] Π² REG[2]
      JU    PRE_LOOPEND

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΏΠΊΠΎΠ΄Π° 02: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния X Π² рСгистр Y
# OP02(X, Y): REG[Y] = X
OPCODE_2: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    LOOPEND
M00b: L     #TEMP3
      T     #REG0
      JU    PRE_LOOPEND
M00a: L     #TEMP3
      T     #REG1
      JU    PRE_LOOPEND
M00c: L     #TEMP3
      T     #REG2
      JU    PRE_LOOPEND

# Опкод 03 Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, поэтому пропустим Π΅Π³ΠΎ
...

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΏΠΊΠΎΠ΄Π° 04: сравнСниС рСгистров X ΠΈ Y
# OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
OPCODE_4: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          # ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - X
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[X]
      LAR2  #TEMP10         # REG[Y]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12         # ~(REG[Y] & REG[X])
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW                    # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - Π°Π½Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° равСнство
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΏΠΊΠΎΠ΄Π° 05: Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ рСгистра Y ΠΈΠ· X
# OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
OPCODE_5: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I                    # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΏΠΊΠΎΠ΄Π° 06: ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ #CHECK_N ΠΏΡ€ΠΈ равСнствС рСгистров X ΠΈ Y
# OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
OPCODE_6: L     #COUNTER_N
      INC   1
      T     #COUNTER_N
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          #  REG[X]     
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          #  REG[X]  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[Y]
      LAR2  #TEMP10         # REG[X]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #POINTER
      L     B#16#0
      T     #TEMP6
      JU    PRE_LOOPEND
M014: L     #POINTER
      LAR1  
# Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ значСния #CHECK_N
      L     #CHECK_N
      L     L#1
      +I    
      T     #CHECK_N
      JU    PRE_LOOPEND

PRE_LOOPEND: L     #REG0
      T     MB   100
      L     #REG1
      T     MB   101
      L     #REG2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    LOOPEND

OPCODE_OTHER: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #POINTER

LOOPEND: TAR1  #POINTER
      CLR   
      =     #TEMP16
      L     #CHECK_N
      L     L#20
      ==I   
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
# ВсС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹, Ссли #CHECK_N == #COUNTER_N == 20
      JC    GOOD
      L     #CHECK_N
      L     L#20
      <I    
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
      JC    FAIL
      JU    M019
GOOD: SET   
      =     #PRE_RET_VAL
      JU    FINISH
FAIL: CLR   
      =     #PRE_RET_VAL
      JU    FINISH
M019: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL
      JU    LOOP
FINISH: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL

αžŠαŸ„αž™αž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αžŸαžΌαž˜αžŸαžšαžŸαŸαžšαž§αž”αž€αžšαžŽαŸαž”αŸ†αž”αŸ‚αž€αžαžΌαž…αž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαž‰αŸ‚αž€ bytecode αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ DB100αŸ–

import string
alph = string.ascii_letters + string.digits

with open('DB100.bin', 'rb') as f:
    m = f.read()

pc = 0

while pc < len(m):
    op = m[pc]
    if op == 1:
        print('R{} = DB101[{}]'.format(m[pc + 2], m[pc + 1]))
        pc += 3
    elif op == 2:
        c = chr(m[pc + 1])
        c = c if c in alph else '?'
        print('R{} = {:02x} ({})'.format(m[pc + 2], m[pc + 1], c))
        pc += 3
    elif op == 4:
        print('R0 = 0; R{} = (R{} == R{})'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 5:
        print('R0 = 0; R{} = R{} - R{}'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 6:
        print('CHECK (R{} == R{})n'.format(
            m[pc + 1], m[pc + 2]))
        pc += 3
    else:
        print('unk opcode {}'.format(op))
        break

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΌαžŠαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΌαžŠαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž

R1 = DB101[0]
R2 = 6e (n)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[1]
R2 = 10 (?)
R0 = 0; R1 = R1 - R2
R2 = 20 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[2]
R2 = 77 (w)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[3]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[4]
R2 = 75 (u)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[5]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[6]
R2 = 34 (4)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[7]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[8]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[9]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[10]
R2 = 37 (7)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[11]
R2 = 22 (?)
R0 = 0; R1 = R1 - R2
R2 = 46 (F)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[12]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[13]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[14]
R2 = 6d (m)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[15]
R2 = 11 (?)
R0 = 0; R1 = R1 - R2
R2 = 23 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[16]
R2 = 35 (5)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[17]
R2 = 12 (?)
R0 = 0; R1 = R1 - R2
R2 = 25 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[18]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[19]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαž½αž’αž€αŸ’αžŸαžšαž“αžΈαž˜αž½αž™αŸ—αž–αžΈ DB101 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αžŸαŸ’αž˜αžΎαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ” αž”αž“αŸ’αž‘αžΆαžαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊ: n0w u 4r3 7h3 m4573r αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαŸ’αžŸαŸ‚αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ DB101 αž“αŸ„αŸ‡αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ PLC αžŠαŸ„αž™αžŠαŸƒαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜ αž αžΎαž™αžœαžΆαž“αžΉαž„αž’αžΆαž…αž•αŸ’αž‘αž»αŸ‡ αž¬αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ‰αŸ„αž„αž”αŸ‰αŸ„αž„αž”αžΆαž“αŸ”β€¨

αž’αžŸαŸ‹αž αžΎαž™! Alexey αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αž“αŸƒαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αžŠαŸ‚αž›αžŸαž€αŸ’αžαž·αžŸαž˜αž‡αžΆ Ninja αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜ :) αž™αžΎαž„αž”αžΆαž“αž•αŸ’αž‰αžΎαžšαž„αŸ’αžœαžΆαž“αŸ‹αžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž”αŸ†αž—αŸ’αž›αŸαž…αž”αžΆαž“αžŠαž›αŸ‹αž’αŸ’αž“αž€αžˆαŸ’αž“αŸ‡αŸ” αž’αžšαž‚αž»αžŽαž…αŸ’αžšαžΎαž“αž…αŸ†αž–αŸ„αŸ‡αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹!

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹