เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

เช›เซ‡เชฒเซเชฒเชพ PHDays 9 เชฎเชพเช‚ เช…เชฎเซ‡ เช—เซ‡เชธ เชชเชฎเซเชชเชฟเช‚เช— เชชเซเชฒเชพเชจเซเชŸเชจเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชฐเซเชงเชพ เชฏเซ‹เชœเซ€ เชนเชคเซ€ - เชธเซเชชเชฐเซเชงเชพ เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพ. เชธเชพเช‡เชŸ เชชเชฐ เชตเชฟเชตเชฟเชง เชธเซเชฐเช•เซเชทเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹ (เช•เซ‹เชˆ เชธเซเชฐเช•เซเชทเชพ, เช“เช›เซ€ เชธเซเชฐเช•เซเชทเชพ, เช‰เชšเซเชš เชธเซเชฐเช•เซเชทเชพ) เชธเชพเชฅเซ‡ เชคเซเชฐเชฃ เชธเซเชŸเซ‡เชจเซเชก เชนเชคเชพ, เชœเซ‡ เชธเชฎเชพเชจ เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เช…เชจเซเช•เชฐเชฃ เช•เชฐเซ‡ เช›เซ‡: เชฆเชฌเชพเชฃ เชนเซ‡เช เชณเชจเซ€ เชนเชตเชพเชจเซ‡ เชฌเชฒเซ‚เชจเชฎเชพเช‚ เชชเชฎเซเชช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ (เช…เชจเซ‡ เชชเช›เซ€ เช›เซ‹เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€).

เชตเชฟเชตเชฟเชง เชธเชฒเชพเชฎเชคเซ€ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชธเซเชŸเซ‡เชจเซเชกเชจเซ€ เชนเชพเชฐเซเชกเชตเซ‡เชฐ เชฐเชšเชจเชพ เชธเชฎเชพเชจ เชนเชคเซ€: เชธเชฟเชฎเซ‡เชจเซเชธ เชธเชฟเชฎเซ‡เชŸเชฟเช• PLC S7-300 เชถเซเชฐเซ‡เชฃเซ€; เช•เชŸเซ‹เช•เชŸเซ€ เชกเชฟเชซเซเชฒเซ‡เชถเชจ เชฌเชŸเชจ เช…เชจเซ‡ เชฆเชฌเชพเชฃ เชฎเชพเชชเชตเชพเชจเซเช‚ เช‰เชชเช•เชฐเชฃ (เชชเซ€เชเชฒเชธเซ€ เชกเชฟเชœเชฟเชŸเชฒ เช‡เชจเชชเซเชŸเซเชธ (DI) เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ); เชซเซเช—เชพเชตเชพ เช…เชจเซ‡ เชนเชตเชพเชจเชพ เชกเชฟเชซเซเชฒเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเชฐเชค เชตเชพเชฒเซเชต (PLC (DO) เชจเชพ เชกเชฟเชœเชฟเชŸเชฒ เช†เช‰เชŸเชชเซเชŸ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ) - เชจเซ€เชšเซ‡เชจเซ‹ เช†เช‚เช•เชกเซ‹ เชœเซเช“.

เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

PLC, เชชเซเชฐเซ‡เชถเชฐ เชฐเซ€เชกเชฟเช‚เช—เซเชธเชจเชพ เช†เชงเชพเชฐเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชจเซเชธเชพเชฐ, เชฌเซ‹เชฒเชจเซ‡ เชกเชฟเชซเซเชฒเซ‡เชŸ เช…เชฅเชตเชพ เชซเซเชฒเชพเชตเชตเชพเชจเซ‹ เชจเชฟเชฐเซเชฃเชฏ เชฒเซ€เชงเซ‹ (เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชพเชฒเซเชต เช–เซ‹เชฒเซเชฏเชพ เช…เชจเซ‡ เชฌเช‚เชง เช•เชฐเซเชฏเชพ). เชœเซ‹ เช•เซ‡, เชฌเชงเชพ เชธเซเชŸเซ‡เชจเซเชกเซเชธเชฎเชพเช‚ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฎเซ‹เชก เชนเชคเซเช‚, เชœเซ‡เชฃเซ‡ เช•เซ‹เชˆเชชเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃเซ‹ เชตเชฟเชจเชพ เชตเชพเชฒเซเชตเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซเชฏเซเช‚ เชนเชคเซเช‚.

เช† เชฎเซ‹เชกเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพเชจเซ€ เชœเชŸเชฟเชฒเชคเชพเชฎเชพเช‚ เชธเซเชŸเซ‡เชจเซเชก เช…เชฒเช— เชนเชคเชพ: เช…เชธเซเชฐเช•เซเชทเชฟเชค เชธเซเชŸเซ‡เชจเซเชก เชชเชฐ เช† เช•เชฐเชตเซเช‚ เชธเซŒเชฅเซ€ เชธเชฐเชณ เชนเชคเซเช‚, เช…เชจเซ‡ เช‰เชšเซเชš เชธเซเชฐเช•เซเชทเชพ เชธเซเชŸเซ‡เชจเซเชก เชชเชฐ เชคเซ‡ เช…เชจเซเชฐเซ‚เชช เชฐเซ€เชคเซ‡ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชคเซเช‚.

เช›เชฎเชพเช‚เชฅเซ€ เชชเชพเช‚เชš เชธเชฎเชธเซเชฏเชพเช“ เชฌเซ‡ เชฆเชฟเชตเชธเชฎเชพเช‚ เช‰เช•เซ‡เชฒเชพเชˆ เช—เชˆ; เชชเซเชฐเชฅเชฎ เชธเซเชฅเชพเชจเชจเชพ เชธเชนเชญเชพเช—เซ€เช 233 เชชเซ‹เชˆเชจเซเชŸเซเชธ เชฎเซ‡เชณเชตเซเชฏเชพ (เชคเซ‡เชฃเซ‡ เชธเซเชชเชฐเซเชงเชพเชจเซ€ เชคเซˆเชฏเชพเชฐเซ€เชฎเชพเช‚ เชเช• เชธเชชเซเชคเชพเชน เช—เชพเชณเซเชฏเซ‹). เชคเซเชฐเชฃ เชตเชฟเชœเซ‡เชคเชพเช“: I เชธเซเชฅเชพเชจ - a1exdandy, II - Rubikoid, III - Ze.

เชœเซ‹ เช•เซ‡, PHDays เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชธเชนเชญเชพเช—เซ€เช“เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆ เชชเชฃ เชคเซเชฐเชฃเซ‡เชฏ เชธเซเชŸเซ‡เชจเซเชกเชจเซ‡ เชชเชพเชฐ เช•เชฐเซ€ เชถเช•เซเชฏเซเช‚ เชจ เชนเชคเซเช‚, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช‘เชจเชฒเชพเช‡เชจ เชธเซเชชเชฐเซเชงเชพ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ เชœเซ‚เชจเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชฎเซเชถเซเช•เซ‡เชฒ เช•เชพเชฐเซเชฏ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซเชฏเซเช‚. เชธเชนเชญเชพเช—เซ€เช“เช เชเช• เชฎเชนเชฟเชจเชพเชจเซ€ เช…เช‚เชฆเชฐ เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชนเชคเซเช‚, เชงเซเชตเชœ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เช‰เช•เซ‡เชฒเชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เช…เชจเซ‡ เชฐเชธเชชเซเชฐเชฆ เชฐเซ€เชคเซ‡ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชจเซเช‚ เชนเชคเซเช‚.

เช•เชŸเชจเซ€ เชจเซ€เชšเซ‡ เช…เชฎเซ‡ เชฎเชนเชฟเชจเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เช•เชพเชฐเซเชฏเชจเชพ เชถเซเชฐเซ‡เชทเซเช  เช‰เช•เซ‡เชฒเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช เช›เซ€เช, เชคเซ‡ เชกเชฟเชœเชฟเชŸเชฒ เชธเชฟเช•เซเชฏเซเชฐเชฟเชŸเซ€ เช•เช‚เชชเชจเซ€เชจเชพ เชเชฒเซ‡เช•เซเชธเซ€ เช•เซ‹เชตเชฐเชฟเชเซเชจเซ€เช– (a1exdandy) เชฆเซเชตเชพเชฐเชพ เชœเชพเชฃเชตเชพ เชฎเชณเซเชฏเซเช‚ เชนเชคเซเช‚, เชœเซ‡เชฎเชฃเซ‡ PHDays เชฆเชฐเชฎเชฟเชฏเชพเชจ เชธเซเชชเชฐเซเชงเชพเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชธเซเชฅเชพเชจ เชฎเซ‡เชณเชตเซเชฏเซเช‚ เชนเชคเซเช‚. เชจเซ€เชšเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‹ เชŸเซ‡เช•เซเชธเซเชŸ เช…เชฎเชพเชฐเซ€ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เชธเชพเชฅเซ‡ เชฐเชœเซ‚ เช•เชฐเซ€เช เช›เซ€เช.

เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเชฃ

เชคเซ‡เชฅเซ€, เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเซ€ เชซเชพเช‡เชฒเซ‹ เชธเชพเชฅเซ‡เชจเซ‹ เช†เชฐเซเช•เชพเช‡เชต เช›เซ‡:

  • block_upload_traffic.pcapng
  • DB100.bin
  • hints.txt

hints.txt เชซเชพเช‡เชฒเชฎเชพเช‚ เช•เชพเชฐเซเชฏเชจเซ‡ เชนเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฎเชพเชนเชฟเชคเซ€ เช…เชจเซ‡ เชธเช‚เช•เซ‡เชคเซ‹ เช›เซ‡. เช…เชนเซ€เช‚ เชคเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ เช›เซ‡:

  1. เชชเซ‡เชŸเซเชฐเซ‹เชตเชฟเชšเซ‡ เชฎเชจเซ‡ เช—เชˆเช•เชพเชฒเซ‡ เช•เชนเซเชฏเซเช‚ เชนเชคเซเช‚ เช•เซ‡ เชคเชฎเซ‡ PlcSim เชฅเซ€ เชธเซเชŸเซ‡เชช7 เชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เซเชธ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.
  2. เชธเซเชŸเซ‡เชจเซเชก เชชเชฐ เชธเชฟเชฎเซ‡เชจเซเชธ เชธเชฟเชฎเซ‡เชŸเชฟเช• S7-300 เชถเซเชฐเซ‡เชฃเซ€ PLC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.
  3. PlcSim เช PLC เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ Siemens S7 PLC เชฎเชพเชŸเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชตเชพ เช…เชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

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 0401 0206a0100 ..w............. ............ 0103 0102............0. 02: 00000030 0501 0202 1602 0501 0206 0100 0104 ......... & ..... 0102: 00000040c7502 0401 0206 0100 0105 0102 0 02 0501 เชเชฒ ......... 00000050. : 0202 1602 0501 0206 0100a0106 0102 3402 4 ................ 00000060: 0401 0206 0100 0107a 0102 2602 0501 0202 .......... 00000070a4: 02 0501b 0206 0100 0108 0102 3302 0401 ......".....F... 3b00000080: 0206 0100 0109c 0102 0 02 .... .. 0501c0202: 1602d 00000090 0501a0206 0100 010 0102 3702 0401 ................ 0206d7: 000000 0e 0100 010d0102 2202 0501 0202 4602 0501 000000 0. .... 0206e0100: 010 0102 3302 0401 0206 0100 3 000000 ........#...... 0f010: 0102 0 02 0501 0202 1602..... 0501..... .....0206: 000000 0 0100 010 0102 6 02 0401 ......%......... 0206: 0100 010 000000 0 0102 1102..... .....&. 0501: 0202 2302 0501c0206 0100 000000 0 ....เชเชฒ......

เชจเชพเชฎ เชธเซ‚เชšเชตเซ‡ เช›เซ‡ เชคเซ‡เชฎ, block_upload_traffic.pcapng เชซเชพเช‡เชฒ PLC เชชเชฐ เชฌเซเชฒเซ‹เช• เช…เชชเชฒเซ‹เชก เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‹ เชกเชฎเซเชช เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เช•เซ‹เชจเซเชซเชฐเชจเซเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชธเซเชชเชฐเซเชงเชพเชจเชพ เชธเซเชฅเชณเซ‡ เช† เชŸเซเชฐเชพเชซเชฟเช• เชกเชฎเซเชช เชฎเซ‡เชณเชตเชตเชพเชจเซเช‚ เชฅเซ‹เชกเซเช‚ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชคเซเช‚. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, TeslaSCADA2 เชฎเชพเชŸเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชธเชฎเชœเชตเซ€ เชœเชฐเซ‚เชฐเซ€ เชนเชคเซ€. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชคเซ‡ เชธเชฎเชœเชตเซเช‚ เชถเช•เซเชฏ เชนเชคเซเช‚ เช•เซ‡ RC4 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเชจเช•เซเชฐเชฟเชชเซเชŸ เชฅเชฏเซ‡เชฒ เชกเชฎเซเชช เช•เซเชฏเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชกเชฟเช•เซเชฐเชฟเชชเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชˆ เช•เซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. S7 เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชพเช‡เชŸ เชชเชฐเชจเชพ เชกเซ‡เชŸเชพ เชฌเซเชฒเซ‹เช•เซเชธเชจเชพ เชกเชฎเซเชชเซเชธ เชฎเซ‡เชณเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช† เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ Snap7 เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชฎเซ‹ เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹.

เชŸเซเชฐเชพเชซเชฟเช• เชกเชฎเซเชชเชฎเชพเช‚เชฅเซ€ เชธเชฟเช—เซเชจเชฒ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชฌเซเชฒเซ‹เช•เซเชธ เช•เชพเชขเชตเชพ

เชกเชฎเซเชชเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ เชœเซ‹เชคเชพ, เชคเชฎเซ‡ เชธเชฎเชœเซ€ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชคเซ‡เชฎเชพเช‚ เชธเชฟเช—เซเชจเชฒ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชฌเซเชฒเซ‹เช•เซเชธ OB1, FC1, FC2 เช…เชจเซ‡ FC3 เช›เซ‡:

เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

เช† เชฌเซเชฒเซ‹เช•เซเชธ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชœ เชœเซ‹เชˆเช. เช† เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชจเซ€เชšเซ‡เชจเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡, เช…เช—เชพเช‰ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ 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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เซเชธเชฎเชพเช‚เชฅเซ€ เชฎเชพเชจเชต-เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ เชธเซ‚เชšเชจเชพเช“ เชฎเซ‡เชณเชตเชตเซ€

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชธเชฟเชฎเซ‡เชŸเชฟเช• เชฎเซ‡เชจเซ‡เชœเชฐ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชธเซ‚เชšเชจเชพเช“ (= Q 7) เชธเชพเชฅเซ‡ เช˜เชฃเชพ เชฌเซเชฒเซ‹เช•เซเชธ เชฒเซ‹เชก เช•เชฐเซ€เชจเซ‡ เช…เชจเซ‡ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชณเชตเซ‡เชฒเชพ PLCเชจเซ‡ example.plc เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชพเชšเชตเซ€เชจเซ‡ S0.0-PlcSim เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช. เชซเชพเช‡เชฒเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ เชœเซ‹เชˆเชจเซ‡, เชคเชฎเซ‡ เชธเชนเซ€ 70 70 เชฆเซเชตเชพเชฐเชพ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ เชฌเซเชฒเซ‹เช•เซเชธเชจเซ€ เชถเชฐเซ‚เช†เชค เชธเชฐเชณเชคเชพเชฅเซ€ เชจเช•เซเช•เซ€ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡ เช…เชฎเซ‡ เช…เช—เชพเช‰ เชถเซ‹เชงเซเชฏเซเช‚ เชนเชคเซเช‚. เชฌเซเชฒเซ‹เช•เซเชธ เชชเชนเซ‡เชฒเชพเช‚, เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เชฌเซเชฒเซ‹เช•เชจเซเช‚ เช•เชฆ 4-เชฌเชพเช‡เชŸ เชฒเชฟเชŸเชฒ-เชเชจเซเชกเชฟเชฏเชจ เชฎเซ‚เชฒเซเชฏ เชคเชฐเซ€เช•เซ‡ เชฒเช–เชพเชฏเซ‡เชฒเซเช‚ เช›เซ‡.

เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

เช…เชฎเชจเซ‡ plc เชซเชพเช‡เชฒเซ‹เชจเซ€ เชฐเชšเชจเชพ เชตเชฟเชถเซ‡ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเชพ เชชเช›เซ€, PLC S7 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เช•เซเชฐเชฟเชฏเชพ เชฏเซ‹เชœเชจเชพ เชฆเซ‡เช–เชพเชˆ:

  1. เชธเชฟเชฎเซ‡เชŸเชฟเช• เชฎเซ‡เชจเซ‡เชœเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช…เชฎเซ‡ 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)

เชเชฒเซ‡เช•เซเชธเซ€เช เช•เชฆเชพเชš เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ, เชชเชฐเช‚เชคเซ เชนเชœเซ€ เชชเชฃ เชธเชพเชšเซ‹ เชฎเชพเชฐเซเช— เชฒเซ€เชงเซ‹. เช…เชฎเซ‡ เชงเชพเชฐเซเชฏเซเช‚ เช•เซ‡ เชธเชนเชญเชพเช—เซ€เช“ NetToPlcSim เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ PlcSim เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชถเช•เซ‡, Snap7 เชฆเซเชตเชพเชฐเชพ PlcSim เชชเชฐ เชฌเซเชฒเซ‹เช•เซเชธ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เชตเชฟเช•เชพเชธ เชตเชพเชคเชพเชตเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ PlcSim เชฎเชพเช‚เชฅเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชคเชฐเซ€เช•เซ‡ เช† เชฌเซเชฒเซ‹เช•เซเชธเชจเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‡.

เชชเชฐเชฟเชฃเชพเชฎเซ€ เชซเชพเช‡เชฒเชจเซ‡ S7-PlcSim เชฎเชพเช‚ เช–เซ‹เชฒเซ€เชจเซ‡, เชคเชฎเซ‡ เชธเชฟเชฎเซ‡เชŸเชฟเช• เชฎเซ‡เชจเซ‡เชœเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชŸ เช•เชฐเซ‡เชฒเชพ เชฌเซเชฒเซ‹เช•เซเชธ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹. เชฎเซเช–เซเชฏ เช‰เชชเช•เชฐเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เช•เชพเชฐเซเชฏเซ‹ เชฌเซเชฒเซ‹เช• FC1 เชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช–เชพเชธ เชจเซ‹เช‚เชง เช #TEMP0 เชšเชฒ เช›เซ‡, เชœเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชšเชพเชฒเซ เชฅเชพเชฏ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ M2.2 เช…เชจเซ‡ M2.3 เชฌเซ€เชŸ เชฎเซ‡เชฎเชฐเซ€ เชฎเซ‚เชฒเซเชฏเซ‹เชจเชพ เช†เชงเชพเชฐเซ‡ PLC เชจเชฟเชฏเช‚เชคเซเชฐเชฃเชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชฎเซ‹เชก เชชเชฐ เชธเซ‡เชŸ เช•เชฐเชคเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. #TEMP0 เชฎเซ‚เชฒเซเชฏ เชซเช‚เช•เซเชถเชจ FC3 เชฆเซเชตเชพเชฐเชพ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เช›เซ‡.

เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพเชจเชพเช‚ เชชเช—เชฒเซ‡: เชชเซ‹เชเชฟเชŸเชฟเชต เชนเซ‡เช• เชกเซ‡เช 9 เชชเชฐ PLC เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚

เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ FC3 เชซเช‚เช•เซเชถเชจเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชถเซเช‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชคเซ‡ เชฒเซ‹เชœเชฟเช•เชฒ เชชเชฐเชค เช•เชฐเซ‡.

เชธเซเชชเชฐเซเชงเชพเชจเชพ เชธเซเชฅเชณเซ‡ เชฒเซ‹ เชธเชฟเช•เซเชฏเซเชฐเชฟเชŸเซ€ เชธเซเชŸเซ‡เชจเซเชก เชชเชฐเชจเชพ PLC เชธเชฟเช—เซเชจเชฒ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชฌเซเชฒเซ‹เช•เซเชธ เช เชœ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ, เชชเชฐเช‚เชคเซ #TEMP0 เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, DB1 เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชฎเชพเชฐเซ€ เชจเชฟเชจเซเชœเชพ เชฐเซ€เชคเซ‡ เชฒเชพเช‡เชจ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชนเชคเซเช‚. เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏ เชคเชชเชพเชธเชตเซเช‚ เชธเซ€เชงเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเซเชฒเซ‹เช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเชจเชพ เชŠเช‚เชกเชพ เชœเซเชžเชพเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เช‰เชšเซเชš เชธเซเชฐเช•เซเชทเชพ เชธเซเชคเชฐเซ‡, เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชนเชพเช‚เชธเชฒ เช•เชฐเชตเซเช‚ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชถเซ‡ เช…เชจเซ‡ STL เชญเชพเชทเชพเชจเซ€ เชœเชŸเชฟเชฒเชคเชพเช“เชจเซ‡ เชธเชฎเชœเชตเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ (S7 PLC เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชเช• เชฐเซ€เชค).

เชฐเชฟเชตเชฐเซเชธ เชฌเซเชฒเซ‹เช• FC3

STL เชฐเชœเซ‚เช†เชคเชฎเชพเช‚ FC3 เชฌเซเชฒเซ‹เช•เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€:

      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 เชญเชพเชทเชพเชจเซ€ เชตเชฟเช—เชคเชตเชพเชฐ เชธเซ‚เชšเชจเชพเช“ เช…เชจเซ‡ เช•เซเชทเชฎเชคเชพเช“ เชธเช‚เชฌเช‚เชงเชฟเชค เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพเชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡: S7-300 เช…เชจเซ‡ S7-400 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชธเซเชŸเซ‡เชŸเชฎเซ‡เชจเซเชŸ เชฒเชฟเชธเซเชŸ (STL).. เช…เชนเซ€เช‚ เชนเซเช‚ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชธเชฎเชพเชจ เช•เซ‹เชก เชฐเชœเซ‚ เช•เชฐเซ€เชถ - เชฒเซ‡เชฌเชฒเซเชธ เช…เชจเซ‡ เชšเชฒเซ‹เชจเซเช‚ เชจเชพเชฎ เชฌเชฆเชฒเชตเซเช‚ เช…เชจเซ‡ เช‘เชชเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช…เชจเซ‡ เช•เซ‡เชŸเชฒเซ€เช• 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

เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เช–เซเชฏเชพเชฒ เชฎเซ‡เชณเชตเซเชฏเชพ เชชเช›เซ€, เชšเชพเชฒเซ‹ 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 เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชธเช•เซเชฐเชฟเชฏ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชฌเชฒเซ‚เชจเชจเซ‡ เชตเชฟเชธเซเชซเซ‹เชŸ เช…เชฅเชตเชพ เชกเชฟเชซเซเชฒเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชถเซ‡.โ€จ

เชฌเชธ เชเชŸเชฒเซเช‚ เชœ! เชเชฒเซ‡เช•เซเชธเซ€เช เช”เชฆเซเชฏเซ‹เช—เชฟเช• เชจเซ€เชจเซเชœเชพ เชฎเชพเชŸเซ‡ เชฒเชพเชฏเช• เช‰เชšเซเชš เชธเซเชคเชฐเชจเซเช‚ เชœเซเชžเชพเชจ เชฆเชฐเซเชถเชพเชตเซเชฏเซเช‚ :) เช…เชฎเซ‡ เชตเชฟเชœเซ‡เชคเชพเชจเซ‡ เชฏเชพเชฆเช—เชพเชฐ เชˆเชจเชพเชฎเซ‹ เชฎเซ‹เช•เชฒเซเชฏเชพ. เชฌเชงเชพ เชธเชนเชญเชพเช—เซ€เช“ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เช†เชญเชพเชฐ!

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹