{"id":24288575,"url":"https://github.com/bonk-dev/maszyna-turinga-patcher","last_synced_at":"2025-10-07T15:54:53.122Z","repository":{"id":271734330,"uuid":"910152088","full_name":"bonk-dev/maszyna-turinga-patcher","owner":"bonk-dev","description":"W tym repozytorium znajduje się patcher służący do poprawy dwóch bugów uniemożliwiających wygodne  korzystanie z symulatora maszyny Turinga, stworzonego  przez autorów www.MaszynaTuringa.info.","archived":false,"fork":false,"pushed_at":"2025-01-27T09:29:59.000Z","size":10,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T00:20:11.849Z","etag":null,"topics":["patch","polski","reverse-engineering","turing-machine","x86-assembly"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bonk-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-30T16:11:18.000Z","updated_at":"2025-01-27T09:30:02.000Z","dependencies_parsed_at":"2025-01-09T15:42:16.009Z","dependency_job_id":"af629a35-a2f0-42e5-b189-cc5fa16aa67a","html_url":"https://github.com/bonk-dev/maszyna-turinga-patcher","commit_stats":null,"previous_names":["bonk-dev/maszyna-turinga-patcher"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bonk-dev/maszyna-turinga-patcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bonk-dev%2Fmaszyna-turinga-patcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bonk-dev%2Fmaszyna-turinga-patcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bonk-dev%2Fmaszyna-turinga-patcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bonk-dev%2Fmaszyna-turinga-patcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bonk-dev","download_url":"https://codeload.github.com/bonk-dev/maszyna-turinga-patcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bonk-dev%2Fmaszyna-turinga-patcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278802799,"owners_count":26048566,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["patch","polski","reverse-engineering","turing-machine","x86-assembly"],"created_at":"2025-01-16T10:18:30.912Z","updated_at":"2025-10-07T15:54:53.094Z","avatar_url":"https://github.com/bonk-dev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Łatki do symulatora maszyny turinga\n\nW tym repozytorium znajduje się patcher służący do poprawy dwóch bugów uniemożliwiających wygodne \nkorzystanie z symulatora maszyny Turinga, stworzonego \nprzez autorów [www.MaszynaTuringa.info](https://web.archive.org/web/20090214013001/http://www.maszynaturinga.info/).\n\n## Przygotowanie pliku exe\nSymulator jest spakowany przy użyciu packera [UPX](https://github.com/upx/upx).\nAby go spatchować, należy go najpierw wypakować:\n```\nupx.exe -d maszyna_turinga.exe\n```\n\n## Użycie patchera\nPo wypakowaniu pliku exe:\n```\npython3 main.py maszyna_turinga.exe maszyna_turinga_poprawiona.exe\n```\n\n## Opis łatek\n### Zawieszenie przy wykonywaniu tabelki:\n    \nFunkcja FUN_00401ef4 wpada w nieskończoną pętlę dokładnie w 0x00401efe, gdy local_8 jest mniejsze od 0x15.\nNie wiem czemu miało to służyć, ale rozwiązaniem jest wyNOPowanie instrukcji. \n\nOryginał:\n```\n                     undefined __cdecl FUN_00401ef4(int param_1)\n     undefined         AL:1           \u003cRETURN\u003e\n     int               Stack[0x4]:4   param_1                                 XREF[1]:     00401f07(R)  \n     undefined4        Stack[-0x8]:4  local_8                                 XREF[3]:     00401ef8(R), \n                                                                                           00401efe(R), \n                                                                                           00401f04(RW)  \n                     FUN_00401ef4                                    XREF[1]:     FUN_00401bd8:00401d88(c)  \n00401ef4 55              PUSH       EBP\n00401ef5 8b ec           MOV        EBP,ESP\n00401ef7 51              PUSH       ECX\n00401ef8 83 7d fc 14     CMP        dword ptr [EBP + local_8],0x14\n00401efc 7f 06           JG         LAB_00401f04\n                     LAB_00401efe                                    XREF[1]:     00401f02(j)  \n00401efe 83 7d fc 14     CMP        dword ptr [EBP + local_8],0x14\n00401f02 7e fa           JLE        LAB_00401efe\n                     LAB_00401f04                                    XREF[1]:     00401efc(j)  \n00401f04 ff 45 fc        INC        dword ptr [EBP + local_8]\n00401f07 8b 45 08        MOV        EAX,dword ptr [EBP + param_1]\n00401f0a b9 0a 00        MOV        ECX,0xa\n         00 00\n00401f0f 99              CDQ\n00401f10 f7 f9           IDIV       ECX\n00401f12 50              PUSH       EAX\n00401f13 e8 c0 b4        CALL       KERNEL32.DLL::Sleep                              void Sleep(DWORD dwMilliseconds)\n         0c 00\n00401f18 a1 98 de        MOV        EAX,[PTR_DAT_004dde98]                           = 004e04f4\n         4d 00\n00401f1d 8b 00           MOV        EAX=\u003eDAT_004e04f4,dword ptr [EAX]\n00401f1f e8 a8 8b        CALL       FUN_0044aacc                                     undefined FUN_0044aacc(int param\n         04 00\n00401f24 59              POP        ECX\n00401f25 5d              POP        EBP\n00401f26 c3              RET\n```\n\nPo spatchowaniu:\n```\n                     undefined __cdecl inf_loop_start(int param_1)\n     undefined         AL:1           \u003cRETURN\u003e\n     int               Stack[0x4]:4   param_1                                 XREF[1]:     00401f07(R)  \n     undefined4        Stack[-0x8]:4  local_8\n                     inf_loop_start                                  XREF[1]:     FUN_00401bd8:00401d88(c)  \n00401ef4 55              PUSH       EBP\n00401ef5 8b ec           MOV        EBP,ESP\n00401ef7 90              NOP\n00401ef8 90              NOP\n00401ef9 90              NOP\n00401efa 90              NOP\n00401efb 90              NOP\n00401efc 66 90           NOP\n00401efe 90              NOP\n00401eff 90              NOP\n00401f00 90              NOP\n00401f01 90              NOP\n00401f02 66 90           NOP\n00401f04 90              NOP\n00401f05 90              NOP\n00401f06 90              NOP\n00401f07 8b 45 08        MOV        EAX,dword ptr [EBP + param_1]\n00401f0a b9 0a 00        MOV        ECX,0xa\n         00 00\n00401f0f 99              CDQ\n00401f10 f7 f9           IDIV       ECX\n00401f12 50              PUSH       EAX\n00401f13 e8 c0 b4        CALL       KERNEL32.DLL::Sleep                              void Sleep(DWORD dwMilliseconds)\n         0c 00\n00401f18 a1 98 de        MOV        EAX,[PTR_DAT_004dde98]                           = 004e04f4\n         4d 00\n00401f1d 8b 00           MOV        EAX=\u003eDAT_004e04f4,dword ptr [EAX]\n00401f1f e8 a8 8b        CALL       FUN_0044aacc                                     undefined FUN_0044aacc(int param\n         04 00\n00401f24 90              NOP\n00401f25 5d              POP        EBP\n00401f26 c3              RET\n```\n\n### Zawieszanie przy zakończeniu edycji tabelki\nJeżeli przed zapisem pliku, naciśniemy \"Zakończ edycję\", program będzie chciał, żebyśmy zapisali nasz projekt. \nWskazanie ścieżki do zapisu spowoduje nieskończoną pętlę, a anulowanie spowoduje użycie starej wersji tabelki.\n\nRozwiązaniem było wyNOPowanie powtórzonej części handlera przycisku \"Zakończ edycję\" \nodpowiedzialnej za zapis i wczytanie tabelki po jej modyfikacji. Następnie potrzebne było zastąpienie tej części\nkodem wywołującym handlera akcji zapisu z menu Plik (wtedy dialog o zapis wyświetli się tylko raz), po czym kod\nkopiuje wskaźnik do nazwy pliku do zapisu do miejsca na wskaźnik do nazwy pliku do odczytu.\n\nJeżeli użytkownik nie wskazał pliku do zapisu, kod skacze do sekcji BŁĄD, która wyświetla komunikat\nbłędu (treść jest alokowana na stosie za pomocą wartości natychmiastowych) a tryb edycji tabelki nie kończy się.\n\nNatomiast jeśli użytkownik wybrał plik do zapisu, to plik jest wczytywany na nowo (tak program oryginalnie odczytywał \nzmiany w tabelce).\n\nCała łatka zmieściła się w oryginalnej funkcji, ale jest trochę za duża na README.md.\nJest ona dostępna do wglądu w [main.py](main.py).\n\n### Branding\nZamieniłem \"2OO1\" na \"bonk\" w okienku \"O programie\" :)\n\nOryginał:\n```\n00115F50 43 61 70 74 69 6F 6E 06 04 32 4F 4F 31 0C 46 6F Caption..2OO1.Fo\n```\n\nPo spatchowaniu:\n```\n00115F50 43 61 70 74 69 6F 6E 06 04 62 6F 6E 6B 0C 46 6F Caption..bonk.Fo\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbonk-dev%2Fmaszyna-turinga-patcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbonk-dev%2Fmaszyna-turinga-patcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbonk-dev%2Fmaszyna-turinga-patcher/lists"}