āĻāϤ PHDays 9 āĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āϝāĻžāϏ āĻĒāĻžāĻŽā§āĻĒāĻŋāĻ āĻĒā§āϞā§āϝāĻžāύā§āĻ āĻšā§āϝāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻž āĻāϰā§āĻāĻŋ - āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻž . āϏāĻžāĻāĻā§ āϤāĻŋāύāĻāĻŋ āϏā§āĻā§āϝāĻžāύā§āĻĄ āĻāĻŋāϞ āĻŦāĻŋāĻāĻŋāύā§āύ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āϏāĻš (āĻā§āύ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύā§āĻ, āύāĻŋāĻŽā§āύ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž, āĻāĻā§āĻ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž), āĻāĻāĻ āĻļāĻŋāϞā§āĻĒ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻ āύā§āĻāϰāĻŖ āĻāϰā§: āĻāĻžāĻĒā§āϰ āĻŽāϧā§āϝ⧠āĻŦāĻžāϝāĻŧā§ āĻāĻāĻāĻŋ āĻŦā§āϞā§āύ⧠āĻĒāĻžāĻŽā§āĻĒ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ (āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻā§āĻĄāĻŧā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ)āĨ¤
āĻŦāĻŋāĻāĻŋāύā§āύ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āϏāϤā§āϤā§āĻŦā§āĻ, āϏā§āĻā§āϝāĻžāύā§āĻĄāĻā§āϞāĻŋāϰ āĻšāĻžāϰā§āĻĄāĻāϝāĻŧā§āϝāĻžāϰ āϰāĻāύāĻž āĻāĻāĻ āĻāĻŋāϞ: āϏāĻŋāĻŽā§āύā§āϏ āϏāĻŋāĻŽā§āϝāĻžāĻāĻŋāĻ āĻĒāĻŋāĻāϞāϏāĻŋ S7-300 āϏāĻŋāϰāĻŋāĻ; āĻāϰā§āϰ⧠āĻĄāĻŋāĻĢā§āϞā§āĻļāύ āĻŦā§āϤāĻžāĻŽ āĻāĻŦāĻ āĻāĻžāĻĒ āĻŽāĻžāĻĒāĻžāϰ āĻĄāĻŋāĻāĻžāĻāϏ (āĻĒāĻŋāĻāϞāϏāĻŋ āĻĄāĻŋāĻāĻŋāĻāĻžāϞ āĻāύāĻĒā§āĻ (āĻĄāĻŋāĻāĻ) āĻāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ); āĻŦāĻžāϤāĻžāϏā§āϰ āϏā§āĻĢā§āϤāĻŋ āĻāĻŦāĻ āĻĄāĻŋāĻĢā§āϞā§āĻļāύā§āϰ āĻāύā§āϝ āĻāĻžāϞāĻ āĻāĻžāĻ āĻāϰ⧠(āĻĒāĻŋāĻāϞāϏāĻŋ (āĻĄāĻŋāĻ) āĻāϰ āĻĄāĻŋāĻāĻŋāĻāĻžāϞ āĻāĻāĻāĻĒā§āĻā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ) - āύā§āĻā§āϰ āĻāĻŋāϤā§āϰāĻāĻŋ āĻĻā§āĻā§āύāĨ¤

āĻĒāĻŋāĻāϞāϏāĻŋ, āĻĒā§āϰā§āϏāĻžāϰ āϰāĻŋāĻĄāĻŋāĻāϝāĻŧā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻāĻŦāĻ āϤāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻ
āύā§āϏāĻžāϰā§, āĻŦāϞāĻāĻŋāĻā§ āĻĄāĻŋāĻĢā§āϞā§āĻ āĻŦāĻž āϏā§āĻĢā§āϤ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻā§ (āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻāĻžāϞāĻāĻā§āϞāĻŋ āĻā§āϞāĻž āĻāĻŦāĻ āĻŦāύā§āϧ āĻāϰā§āĻā§)āĨ¤ āϝāĻžāĻāĻšā§āĻ, āϏāĻŽāϏā§āϤ āϏā§āĻā§āϝāĻžāύā§āĻĄā§āϰ āĻāĻāĻāĻŋ āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞ āĻāύā§āĻā§āϰā§āϞ āĻŽā§āĻĄ āĻāĻŋāϞ, āϝāĻž āĻā§āύāĻ āĻŦāĻŋāϧāĻŋāύāĻŋāώā§āϧ āĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻžāϞāĻāĻā§āϞāĻŋāϰ āĻ
āĻŦāϏā§āĻĨāĻž āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāĻž āϏāĻŽā§āĻāĻŦ āĻāϰā§āĻāĻŋāϞāĨ¤
āϏā§āĻā§āϝāĻžāύā§āĻĄāĻā§āϞāĻŋ āĻāĻ āĻŽā§āĻĄāĻāĻŋ āϏāĻā§āώāĻŽ āĻāϰāĻžāϰ āĻāĻāĻŋāϞāϤāĻžāϝāĻŧ āĻāĻŋāύā§āύ āĻāĻŋāϞ: āĻ āϰāĻā§āώāĻŋāϤ āϏā§āĻā§āϝāĻžāύā§āĻĄā§ āĻāĻāĻŋ āĻāϰāĻž āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ āĻāĻŋāϞ āĻāĻŦāĻ āĻāĻā§āĻ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āϏā§āĻā§āϝāĻžāύā§āĻĄā§ āĻāĻāĻŋ āĻ āύā§āϰā§āĻĒāĻāĻžāĻŦā§ āĻāϰāĻ āĻāĻ āĻŋāύ āĻāĻŋāϞāĨ¤
āĻāϝāĻŧāĻāĻŋ āϏāĻŽāϏā§āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻĒāĻžāĻāĻāĻāĻŋāϰ āϏāĻŽāĻžāϧāĻžāύ āĻšāϝāĻŧā§āĻā§ āĻĻā§āĻ āĻĻāĻŋāύā§; āĻĒā§āϰāĻĨāĻŽ āϏā§āĻĨāĻžāύā§āϰ āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰ⧠233 āĻĒāϝāĻŧā§āύā§āĻ āĻ āϰā§āĻāύ āĻāϰā§āĻā§ (āϤāĻŋāύāĻŋ āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϏā§āϤā§āϤāĻŋāϰ āĻāύā§āϝ āĻāĻ āϏāĻĒā§āϤāĻžāĻš āĻāĻžāĻāĻŋāϝāĻŧā§āĻā§āύ)āĨ¤ āϤāĻŋāύāĻāύ āĻŦāĻŋāĻāϝāĻŧā§: āĻāĻŽāĻŋ āϰāĻžāĻāĻŋ - a1exdandy, II - Rubikoid, III - ZeāĨ¤
āϝāĻžāĻāĻšā§āĻ, PHDay-āĻāϰ āϏāĻŽāϝāĻŧ, āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻā§āĻāĻ āϤāĻŋāύāĻāĻŋ āϏā§āĻā§āϝāĻžāύā§āĻĄ āĻ āϤāĻŋāĻā§āϰāĻŽ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϝāĻŧāύāĻŋ, āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻ āύāϞāĻžāĻāύ āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻž āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋ āĻāĻŦāĻ āĻā§āύā§āϰ āĻļā§āϰā§āϤ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻāĻ āĻŋāύ āĻāĻžāĻāĻāĻŋ āĻĒā§āϰāĻāĻžāĻļ āĻāϰā§āĻāĻŋāĨ¤ āĻ āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰā§āĻĻā§āϰ āĻāĻ āĻŽāĻžāϏā§āϰ āĻŽāϧā§āϝ⧠āĻāĻžāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰāϤ⧠āĻšāĻŦā§, āĻĒāϤāĻžāĻāĻžāĻāĻŋ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āϏāĻŽāĻžāϧāĻžāύāĻāĻŋ āĻŦāĻŋāĻļāĻĻāĻāĻžāĻŦā§ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻāĻĒāĻžāϝāĻŧā§ āĻŦāϰā§āĻŖāύāĻž āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻžāĻā§āϰ āύā§āĻā§ āĻāĻŽāϰāĻž āĻāĻ āĻŽāĻžāϏā§āϰ āĻŽāϧā§āϝ⧠āĻĒā§āϰā§āϰāĻŋāϤāĻĻā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āĻāĻžāϏā§āĻā§āϰ āϏāϰā§āĻŦā§āϤā§āϤāĻŽ āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻŋ, āĻāĻāĻŋ āĻĄāĻŋāĻāĻŋāĻāĻžāϞ āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻā§āĻŽā§āĻĒāĻžāύāĻŋāϰ āĻ ā§āϝāĻžāϞā§āĻā§āϏāĻŋ āĻā§āĻāϰāĻŋāĻāύāĻŋāĻ (a1exdandy) āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāĻāϝāĻŧāĻž āĻā§āĻā§, āϝāĻŋāύāĻŋ PHDays āϏāĻŽāϝāĻŧ āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻžāϝāĻŧ XNUMXāĻŽ āϏā§āĻĨāĻžāύ āĻ āϧāĻŋāĻāĻžāϰ āĻāϰā§āĻāĻŋāϞā§āύāĨ¤ āύā§āĻā§ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻŽāύā§āϤāĻŦā§āϝ āϏāĻš āϤāĻžāϰ āĻĒāĻžāĻ ā§āϝ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻāĻŋāĨ¤
āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ
āϏā§āϤāϰāĻžāĻ, āĻāĻžāϏā§āĻāĻāĻŋāϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āϏāĻāϰāĻā§āώāĻŖāĻžāĻāĻžāϰ āϰāϝāĻŧā§āĻā§:
- block_upload_traffic.pcapng
- DB100.bin
- hints.txt
hints.txt āĻĢāĻžāĻāϞāĻāĻŋāϤ⧠āĻāĻžāĻāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āϤāĻĨā§āϝ āĻāĻŦāĻ āĻāĻā§āĻāĻŋāϤ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻāĻžāύ⧠āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āϰāϝāĻŧā§āĻā§:
- āĻĒā§āĻā§āϰā§āĻāĻŋāĻ āĻāϤāĻāĻžāϞ āĻāĻŽāĻžāĻā§ āĻŦāϞā§āĻāĻŋāϞā§āύ āϝ⧠āĻāĻĒāύāĻŋ PlcSim āĻĨā§āĻā§ āϧāĻžāĻĒ 7 āĻ āĻŦā§āϞāĻ āϞā§āĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
- āϏāĻŋāĻŽā§āύā§āϏ āϏāĻŋāĻŽā§āϝāĻžāĻāĻŋāĻ S7-300 āϏāĻŋāϰāĻŋāĻā§āϰ PLC āϏā§āĻā§āϝāĻžāύā§āĻĄā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤
- 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 00000040 7502 0401 0206 0100 0105 ......... & ..... 0102: 0C02 0501 00000050 0202 1602 0501 0206 0100 āĻāϞ ......... 0106āĨ¤ .. 0102 : 3402 4 00000060 0401 0206a0100 0107 0102 2602 ................ 0501: 0202 00000070 4 02a 0501 0206 0100 0108 .......... 0102a3302: 0401 3b 00000080 0206 0100 0109 0102 0 ......".....F... 02b0501: 0202 1602 00000090c 0501 0206 0100 ... 010 .......... .. 0102c3702: 0401d 0206 7a000000 0 0100 010 0102 2202................ 0501d0202: 4602 0501e 000000 0d0206 0100 010 0102 3302 0401 0206 0100.. .... 3e000000: 0 010 0102 0 02 0501 0202 1602 ........#...... 0501f0206: 000000 0 0100 010 0102 6..... ..... 02: 0401 0206 0100 010 000000 0 0102 1102 ......%......... 0501: 0202 2302 0501 0206 0100 000000..... .....&. 0: 0110 0102 3502c0401 0206 0100 0111 ....L......
āύāĻžāĻŽ āĻ āύā§āϏāĻžāϰā§, block_upload_traffic.pcapng āĻĢāĻžāĻāϞāĻāĻŋāϤ⧠āĻĒāĻŋāĻāϞāϏāĻŋ-āϤ⧠āĻŦā§āϞāĻ āĻāĻĒāϞā§āĻĄ āĻā§āϰāĻžāĻĢāĻŋāĻā§āϰ āĻāĻāĻāĻŋ āĻĄāĻžāĻŽā§āĻĒ āϰāϝāĻŧā§āĻā§āĨ¤
āĻāĻāĻŋ āϞāĻā§āώāĻŖā§āϝāĻŧ āϝ⧠āϏāĻŽā§āĻŽā§āϞāύā§āϰ āϏāĻŽāϝāĻŧ āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻžāϰ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻāĻ āĻā§āϰā§āϝāĻžāĻĢāĻŋāĻ āĻĄāĻžāĻŽā§āĻĒāĻāĻŋ āĻĒāĻžāĻāϝāĻŧāĻž āĻāϰāĻ āĻāĻŋāĻā§āĻāĻž āĻāĻ āĻŋāύ āĻāĻŋāϞāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, TeslaSCADA2 āĻāϰ āĻāύā§āϝ āĻĒā§āϰāĻāϞā§āĻĒ āĻĢāĻžāĻāϞ āĻĨā§āĻā§ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻŦā§āĻāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŋāϞāĨ¤ āĻāĻāĻŋ āĻĨā§āĻā§ āĻŦā§āĻāĻž āϏāĻŽā§āĻāĻŦ āĻāĻŋāϞ āϝ⧠RC4 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāύāĻā§āϰāĻŋāĻĒā§āĻ āĻāϰāĻž āĻĄāĻžāĻŽā§āĻĒāĻāĻŋ āĻā§āĻĨāĻžāϝāĻŧ āĻ āĻŦāϏā§āĻĨāĻŋāϤ āĻāĻŦāĻ āĻāĻāĻŋ āĻĄāĻŋāĻā§āϰāĻŋāĻĒā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§ āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻĻāϰāĻāĻžāϰāĨ¤ āϏāĻžāĻāĻā§ āĻĄā§āĻāĻž āĻŦā§āϞāĻā§āϰ āĻĄāĻžāĻŽā§āĻĒ S7 āĻĒā§āϰā§āĻā§āĻāϞ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰāĻžāĻĒā§āϤ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāϰ āĻāύā§āϝ āĻāĻŽāĻŋ Snap7 āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āĻĄā§āĻŽā§ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻāĻŋāĨ¤
āĻāĻāĻāĻŋ āĻā§āϰāĻžāĻĢāĻŋāĻ āĻĄāĻžāĻŽā§āĻĒ āĻĨā§āĻā§ āϏāĻāĻā§āϤ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻŦā§āϞāĻ āύāĻŋāώā§āĻāĻžāĻļāύ āĻāϰāĻž āĻšāĻā§āĻā§
āĻĄāĻžāĻŽā§āĻĒā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻā§ āĻāĻĒāύāĻŋ āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āϝ⧠āĻāϤ⧠āϏāĻŋāĻāύā§āϝāĻžāϞ āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻŦā§āϞāĻ OB1, FC1, FC2 āĻāĻŦāĻ FC3 āϰāϝāĻŧā§āĻā§:

āĻāĻ āĻŦā§āϞāĻ āĻ
āĻĒāϏāĻžāϰāĻŖ āĻāϰāĻž āĻāĻŦāĻļā§āϝāĻ. āĻāĻāĻŋ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āϏāĻžāĻšāĻžāϝā§āϝā§, āĻĒā§āϰā§āĻŦā§ 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 (āĻĒāĻŋāĻĒāĻŋ) āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻšāϝāĻŧāĨ¤ āĻāĻāύ āĻāĻĒāύāĻžāĻā§ āϤāĻžāĻĻā§āϰ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰāϤ⧠āĻļāĻŋāĻāϤ⧠āĻšāĻŦā§āĨ¤ āĻ ā§āϝāĻžāϏāĻžāĻāύāĻŽā§āύā§āĻ āĻāĻā§āĻāĻŋāϤ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻā§āϝāĻŧ āϝ⧠āĻāĻĒāύāĻžāĻā§ āĻāϰ āĻāύā§āϝ PlcSim āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻŦā§āϞāĻ āĻĨā§āĻā§ āĻŽāĻžāύāĻŦ-āĻĒāĻ āύāϝā§āĻā§āϝ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻĒāĻžāĻāϝāĻŧāĻž
āĻĒā§āϰāĻĨāĻŽā§, āϏāĻŋāĻŽā§āϝāĻžāĻāĻŋāĻ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āϏāĻĢā§āĻāĻāϝāĻŧā§āϝāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻŋāϤ⧠āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋāĻŽā§āϞāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠(= Q 7) āϏāĻš āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻŦā§āϞāĻ āϞā§āĻĄ āĻāϰ⧠S0.0-PlcSim āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻŽā§āϞā§āĻāϰ⧠āĻĒā§āϰāĻžāĻĒā§āϤ PLC āĻā§ example.plc āĻĢāĻžāĻāϞ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĨ¤ āĻĢāĻžāĻāϞā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻā§, āĻāĻĒāύāĻŋ āϏāĻšāĻā§āĻ 70 70 āϏā§āĻŦāĻžāĻā§āώāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āĻŦā§āϞāĻā§āϰ āĻļā§āϰ⧠āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻāĻŽāϰāĻž āĻāĻā§ āĻāĻŦāĻŋāώā§āĻāĻžāϰ āĻāϰā§āĻāĻŋāĨ¤ āĻŦā§āϞāĻā§āϰ āĻāĻā§, āĻĻā§āĻļā§āϝāϤ, āĻŦā§āϞāĻā§āϰ āĻāĻāĻžāϰ 4-āĻŦāĻžāĻāĻ āϞāĻŋāĻāϞ-āĻāύā§āĻĄāĻŋāϝāĻŧāĻžāύ āĻŽāĻžāύ āĻšāĻŋāϏāĻžāĻŦā§ āϞā§āĻāĻž āĻšāϝāĻŧāĨ¤

āĻāĻŽāϰāĻž āĻĒāĻŋāĻāϞāϏāĻŋ āĻĢāĻžāĻāϞā§āϰ āĻāĻ āύ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻĒāĻžāĻāϝāĻŧāĻžāϰ āĻĒāϰ, āĻĒāĻŋāĻāϞāϏāĻŋ āĻāϏ7 āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĒāĻĄāĻŧāĻžāϰ āĻāύā§āϝ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāϰā§āĻŽ āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž āĻāĻĒāϏā§āĻĨāĻŋāϤ āĻšāϝāĻŧā§āĻā§:
- āϏāĻŋāĻŽā§āϝāĻžāĻāĻŋāĻ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻāĻŽāϰāĻž S7-PlcSim-āĻ āĻāĻāĻāĻŋ āĻŦā§āϞāĻ āĻāĻžāĻ āĻžāĻŽā§ āϤā§āϰāĻŋ āĻāϰāĻŋ āϝāĻž āĻāĻŽāϰāĻž āĻĄāĻžāĻŽā§āĻĒ āĻĨā§āĻā§ āĻĒā§āϝāĻŧā§āĻāĻŋāĨ¤ āĻŦā§āϞāĻā§āϰ āĻāĻāĻžāϰ āĻ āĻŦāĻļā§āϝāĻ āĻŽāĻŋāϞāϤ⧠āĻšāĻŦā§ (āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āϏāĻāĻā§āϝāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻĻāĻŋāϝāĻŧā§ āĻŦā§āϞāĻāĻā§āϞāĻŋ āĻĒā§āϰāĻŖ āĻāϰ⧠āĻāĻāĻŋ āĻ āϰā§āĻāύ āĻāϰāĻž āĻšāϝāĻŧ) āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻļāύāĻžāĻā§āϤāĻāĻžāϰ⧠(OB1, FC1, FC2, FC3)āĨ¤
- PLC āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ⧠āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āύāĨ¤
- āĻāĻŽāϰāĻž āĻĢāϞāĻžāĻĢāϞ āĻĢāĻžāĻāϞ⧠āĻŦā§āϞāĻā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻā§āϰāĻžāĻĢāĻŋāĻ āĻĄāĻžāĻŽā§āĻĒ āĻĨā§āĻā§ āĻŦā§āϞāĻā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŋāĨ¤ āĻŦā§āϞāĻā§āϰ āĻļā§āϰ⧠āϏā§āĻŦāĻžāĻā§āώāϰ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āĻšāϝāĻŧāĨ¤
- āĻāĻŽāϰāĻž āĻĢāϞāĻžāĻĢāϞ āĻĢāĻžāĻāϞāĻāĻŋ 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 āĻĢāĻžāĻāĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āϏā§āĻ āĻāϰāĻž āĻšāϝāĻŧāĨ¤

āϏāĻŽāϏā§āϝāĻžāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāĻā§ FC3 āĻĢāĻžāĻāĻļāύ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āĻŦā§āĻāϤ⧠āĻšāĻŦā§ āĻā§ āĻāϰāĻž āĻĻāϰāĻāĻžāϰ āϝāĻžāϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āϝā§āĻā§āϤāĻŋāĻ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤
āĻĒā§āϰāϤāĻŋāϝā§āĻāĻŋāϤāĻžāϰ āϏā§āĻĨāĻžāύ⧠āϞ⧠āϏāĻŋāĻāĻŋāĻāϰāĻŋāĻāĻŋ āϏā§āĻā§āϝāĻžāύā§āĻĄā§ āĻĒāĻŋāĻāϞāϏāĻŋ āϏāĻŋāĻāύā§āϝāĻžāϞ āĻĒā§āϰāϏā§āϏāĻŋāĻ āĻŦā§āϞāĻāĻā§āϞāĻŋ āĻāĻāĻāĻāĻžāĻŦā§ āϏāĻžāĻāĻžāύ⧠āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻŋāύā§āϤ⧠#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 āĻāĻžāώāĻžāϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻāĻŦāĻ āĻā§āώāĻŽāϤāĻž āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞāĻāĻŋāϤ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§: . āĻāĻāĻžāύ⧠āĻāĻŽāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻĒāϰ⧠āĻāĻāĻ āĻā§āĻĄ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦ - āϞā§āĻŦā§āϞ āĻāĻŦāĻ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āύāĻžāĻŽ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻāĻŦāĻ āĻ āĻĒāĻžāϰā§āĻļāύ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻāĻŦāĻ āĻāĻŋāĻā§ 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
