เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเฉฐเจœเจพ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ•เจฆเจฎเจพเจ‚ 'เจคเฉ‡: เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆเจ• เจฆเจฟเจจ 9 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ€เจเจฒเจธเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€

เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเฉฐเจœเจพ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ•เจฆเจฎเจพเจ‚ 'เจคเฉ‡: เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆเจ• เจฆเจฟเจจ 9 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ€เจเจฒเจธเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€

เจชเจฟเจ›เจฒเฉ‡ PHDays 9 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ—เฉˆเจธ เจชเฉฐเจชเจฟเฉฐเจ— เจชเจฒเจพเจ‚เจŸ เจจเฉ‚เฉฐ เจนเฉˆเจ• เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฎเฉเจ•เจพเจฌเจฒเจพ เจ†เจฏเฉ‹เจœเจฟเจค เจ•เฉ€เจคเจพ - เจฎเฉเจ•เจพเจฌเจฒเจพ เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเจฃเจœเจพเจน. เจธเจพเจˆเจŸ 'เจคเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ (เจ•เฉ‹เจˆ เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจ˜เฉฑเจŸ เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจ‰เฉฑเจš เจธเฉเจฐเฉฑเจ–เจฟเจ†) เจฆเฉ‡ เจจเจพเจฒ เจคเจฟเฉฐเจจ เจธเจŸเฉˆเจ‚เจก เจธเจจ, เจ‰เจธเฉ‡ เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ: เจฆเจฌเจพเจ… เจนเฉ‡เจ  เจนเจตเจพ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ—เฉเจฌเจพเจฐเฉ‡ เจตเจฟเฉฑเจš เจชเฉฐเจช เจ•เฉ€เจคเจพ เจ—เจฟเจ† (เจ…เจคเฉ‡ เจซเจฟเจฐ เจ›เฉฑเจกเจฟเจ† เจ—เจฟเจ†)เฅค

เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, เจธเจŸเฉˆเจ‚เจกเจพเจ‚ เจฆเฉ€ เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจฐเจšเจจเจพ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ€ เจธเฉ€: เจธเฉ€เจฎเฉ‡เจ‚เจธ เจธเจฟเจฎเจŸเจฟเจ• เจชเฉ€เจเจฒเจธเฉ€ S7-300 เจธเฉ€เจฐเฉ€เจœเจผ; เจเจฎเจฐเจœเฉˆเจ‚เจธเฉ€ เจกเจฟเจซเจฒเฉ‡เจธเจผเจจ เจฌเจŸเจจ เจ…เจคเฉ‡ เจฆเจฌเจพเจ… เจฎเจพเจชเจฃ เจตเจพเจฒเจพ เจฏเฉฐเจคเจฐ (เจชเฉ€เจเจฒเจธเฉ€ เจกเจฟเจœเฉ€เจŸเจฒ เจ‡เจจเจชเฉเจŸเจธ (เจกเฉ€เจ†เจˆ) เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ†); เจฎเจนเจฟเฉฐเจ—เจพเจˆ เจ…เจคเฉ‡ เจนเจตเจพ เจฆเฉ‡ เจจเจฟเจ˜เจพเจฐ เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจตเจพเจฒเจต (PLC (DO) เจฆเฉ‡ เจกเจฟเจœเฉ€เจŸเจฒ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเจพเจฒ เจœเฉเฉœเฉ‡) - เจนเฉ‡เจ เจพเจ‚ เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡เจ–เฉ‹เฅค

เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเฉฐเจœเจพ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ•เจฆเจฎเจพเจ‚ 'เจคเฉ‡: เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆเจ• เจฆเจฟเจจ 9 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ€เจเจฒเจธเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€

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 เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉ€เจฎเฉ‡เจ‚เจธ 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 00000020a0102 7702 เจฏเฉ‚............. 0401 0206............ 0100. 0103: 0102 0 02 00000030 0501 0202 1602 0501 0206 0100 0104 0102 00000040 7502 0401 0206 0100 0105 0102 0 02 0501 00000050 0202 1602 0501 0206 0100 0106 0102 3402 4 00000060 0401 0206 0100 0107 0102 2602 0501 0202 00000070 4..02. : 0501 0206 0100 0108 0102a3302 0401 3 00000080................. ' โ€ฆ .... 0206e0100: 0109 0102 0 02 0501 0202 1602 00000090 ........#...... 0501f0206: 0100 010 0102 3702 0401 0206.....7..... ..... 000000: 0 0100 010 0102 2202 0501 0202 4602 ......%......... 0501: 000000 0 0206 0100 010 0102..... .....&. 3302: 0401 0206 0100c3 000000 0 010 ....L......

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจจเจพเจฎ เจธเฉเจเจพเจ… เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, block_upload_traffic.pcapng เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš PLC เจฒเจˆ เจฌเจฒเจพเจ• เจ…เฉฑเจชเจฒเฉ‹เจก เจŸเฉเจฐเฉˆเจซเจฟเจ• เจฆเจพ เจ‡เฉฑเจ• เจกเฉฐเจช เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ•เจพเจจเจซเจฐเฉฐเจธ เจฆเฉŒเจฐเจพเจจ เจฎเฉเจ•เจพเจฌเจฒเฉ‡ เจตเจพเจฒเฉ€ เจฅเจพเจ‚ 'เจคเฉ‡ เจ‡เจน เจŸเฉเจฐเฉˆเจซเจฟเจ• เจกเฉฐเจช เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจฎเฉเจธเจผเจ•เจฒ เจธเฉ€. เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, TeslaSCADA2 เจฒเจˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจธเฉ€. เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจน เจธเจฎเจเจฃเจพ เจธเฉฐเจญเจต เจธเฉ€ เจ•เจฟ RC4 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจเจจเจ•เฉเจฐเจฟเจชเจŸเจก เจกเฉฐเจช เจ•เจฟเฉฑเจฅเฉ‡ เจธเจฅเจฟเจค เจธเฉ€ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉ€เจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเจจ เจฒเจˆ เจ•เจฟเจนเฉœเฉ€ เจ•เฉเฉฐเจœเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจธเฉ€เฅค เจธเจพเจˆเจŸ 'เจคเฉ‡ เจกเจพเจŸเจพ เจฌเจฒเจพเจ•เจพเจ‚ เจฆเฉ‡ เจกเฉฐเจช เจจเฉ‚เฉฐ S7 เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจฎเฉˆเจ‚ Snap7 เจชเฉˆเจ•เฉ‡เจœ เจคเฉ‹เจ‚ เจกเฉˆเจฎเฉ‹ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€.

เจŸเฉเจฐเฉˆเจซเจฟเจ• เจกเฉฐเจช เจคเฉ‹เจ‚ เจธเจฟเจ—เจจเจฒ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฌเจฒเจพเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉฑเจขเจฃเจพ

เจกเฉฐเจช เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจธเจฎเจ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ‡เจธ เจตเจฟเฉฑเจš เจธเจฟเจ—เจจเจฒ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฌเจฒเจพเจ• OB1, FC1, FC2 เจ…เจคเฉ‡ FC3 เจธเจผเจพเจฎเจฒ เจนเจจ:

เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเฉฐเจœเจพ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ•เจฆเจฎเจพเจ‚ 'เจคเฉ‡: เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆเจ• เจฆเจฟเจจ 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 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจฌเจฒเจพเจ•เจพเจ‚ เจคเฉ‹เจ‚ เจฎเจจเฉเฉฑเจ–เฉ€-เจชเฉœเฉเจนเจจ เจฏเฉ‹เจ— เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ

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

เจ‰เจฆเจฏเฉ‹เจ—เจฟเจ• เจจเจฟเฉฐเจœเจพ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ•เจฆเจฎเจพเจ‚ 'เจคเฉ‡: เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆเจ• เจฆเจฟเจจ 9 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ€เจเจฒเจธเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€

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 'เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉ€เจเจฒเจธเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€

เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹