C pre-preprocesor

Re:C pre-preprocesor
« Odpověď #15 kdy: 13. 04. 2023, 23:17:34 »
Hoši děkuju za tohle vlákno :-) Konkrétně Capstone je veliký rozcestník na další čtení. Obor nějak soustavně nesleduju, takže mě překvapilo, kolik volně dostupného softu kolem toho je. A přestože jsem už notně off topic, zmínil bych třeba tuhle paní - ta zjevně umí:
https://hasherezade.github.io/
https://www.youtube.com/@hasherezade/videos
https://hshrzd.wordpress.com/how-to-start/


mhi

  • *****
  • 500
    • Zobrazit profil
Re:C pre-preprocesor
« Odpověď #16 kdy: 18. 04. 2023, 10:06:23 »
Problem techto nastroju je, ze kdyz chce clovek neco specifickeho, stoji casto vic casu jejich prepracovani, nez udelat vyvoj "skoro od nuly". Myslim tim to, ze nekde najdu vhodny zdroj opkodu a ten pouziju-napsat jednoduchy disasm pro novou architekturu je pak otazka odpoledne. Diky nejakemu odkazu tady jsem objevil, ze Ghidra ma slusnou definici opkodu pro TriCore, ktery ted budu potrebovat udelat.

Mam tu ale dalsi tema a to je indentace assembler kodu (podobne jako IDA umi udelat strom). Hezky to obcas dela ChatGPT, zde je priklad:

Kód: [Vybrat]
        ; Load array address into r0
        LDR r0, =ARRAY
        ; Load array size into r1
        LDR r1, =SIZE
        ; Subtract 1 from array size
        SUBS r1, #1
        ; Loop outer
        outer_loop:
                ; Move outer loop index to r2
                MOV r2, r1
                ; Move outer loop index to r3
                MOV r3, r1
                ; Loop inner
                inner_loop:
                        ; Load ARRAY[r2].x into r4
                        LDRB r4, [r0, r2]
                        ; Load ARRAY[r2].y into r5
                        LDRB r5, [r0, r2, LSL #1]
                        ; Load ARRAY[r3].x into r6
                        LDRB r6, [r0, r3]
                        ; Load ARRAY[r3].y into r7
                        LDRB r7, [r0, r3, LSL #1]
                        ; Compare x values
                        CMP r4, r6
                        ; If ARRAY[r2].x >= ARRAY[r3].x, skip swap
                        IT GE
                        MOVGE r9, r2
                        MOVGE r2, r3
                        MOVGE r3, r9
                        ; Compare y values
                        CMP r5, r7
                        ; If ARRAY[r2].y >= ARRAY[r3].y, skip swap
                        IT GE
                        MOVGE r9, r2
                        MOVGE r2, r3
                        MOVGE r3, r9
                        ; Decrement inner loop index
                        SUBS r2, r2, #1
                        ; Loop inner while inner loop index >= 0
                        BGE inner_loop
                ; Decrement outer loop index
                SUBS r1, r1, #1
                ; Loop outer while outer loop index >= 0
                BGE outer_loop
        ; Return
        BX lr

Mate nejaky napad na pravidla jak tohle delat? Jsou jasne ruzne if-else-endif, pokud jdou po sobe, ale ne vzdy to tak je. Uvital bych odkazy na pripadne dalsi nastroje, ktere tohle nejak umi. ChatGPT jsem se ptal jestli mi napise pravidla ktera pouziva a kdybych veril ze tam je "rozum", tak bych rekl, ze "jsme si vubec neporozumeli" :-). Ani na nekolikaty pokus ji vysvetlit co mne zajima.

Re:C pre-preprocesor
« Odpověď #17 kdy: 18. 04. 2023, 11:13:30 »
ChatGPT jsem se ptal jestli mi napise pravidla ktera pouziva a kdybych veril ze tam je "rozum", tak bych rekl, ze "jsme si vubec neporozumeli" :-). Ani na nekolikaty pokus ji vysvetlit co mne zajima.

Což je mimochodem *velice* zajímavý poznatek. Člověk by řekl, že tu věc má "naučenou hrubou silou v motorické paměti", asi jako základní úkony řízení auta nebo jízdu na lyžích. "Držení rovnováhy" taky těžko vysvětlíte.
Přitom ale v jiných oblastech dokáže zdůvodňovat docela hezky...

Toto si dokážu vysvětlit dvěma různými způsoby:

A) GPT4 řeší různé činnosti/oblasti různými způsoby. Proto má některé "v motorické paměti" a jiné umí přesně spočítat a zhruba zdůvodnit

B) narazil jste na oblast, kterou vysvětlovat nechce/nesmí = cenzura, obchodní tajemství. Když umí zdvořile odmítnout odpověď na "sprostá témata", proč by nemohl odmítnout odpověď na témata obchodně hodnotná...

alex6bbc

  • *****
  • 1 641
    • Zobrazit profil
    • E-mail
Re:C pre-preprocesor
« Odpověď #18 kdy: 18. 04. 2023, 11:58:11 »
Problem techto nastroju je, ze kdyz chce clovek neco specifickeho, stoji casto vic casu jejich prepracovani, nez udelat vyvoj "skoro od nuly". Myslim tim to, ze nekde najdu vhodny zdroj opkodu a ten pouziju-napsat jednoduchy disasm pro novou architekturu je pak otazka odpoledne. Diky nejakemu odkazu tady jsem objevil, ze Ghidra ma slusnou definici opkodu pro TriCore, ktery ted budu potrebovat udelat.

Mam tu ale dalsi tema a to je indentace assembler kodu (podobne jako IDA umi udelat strom). Hezky to obcas dela ChatGPT, zde je priklad:

Kód: [Vybrat]
        ; Load array address into r0
        LDR r0, =ARRAY
        ; Load array size into r1
        LDR r1, =SIZE
        ; Subtract 1 from array size
        SUBS r1, #1
        ; Loop outer
        outer_loop:
                ; Move outer loop index to r2
                MOV r2, r1
                ; Move outer loop index to r3
                MOV r3, r1
                ; Loop inner
                inner_loop:
                        ; Load ARRAY[r2].x into r4
                        LDRB r4, [r0, r2]
                        ; Load ARRAY[r2].y into r5
                        LDRB r5, [r0, r2, LSL #1]
                        ; Load ARRAY[r3].x into r6
                        LDRB r6, [r0, r3]
                        ; Load ARRAY[r3].y into r7
                        LDRB r7, [r0, r3, LSL #1]
                        ; Compare x values
                        CMP r4, r6
                        ; If ARRAY[r2].x >= ARRAY[r3].x, skip swap
                        IT GE
                        MOVGE r9, r2
                        MOVGE r2, r3
                        MOVGE r3, r9
                        ; Compare y values
                        CMP r5, r7
                        ; If ARRAY[r2].y >= ARRAY[r3].y, skip swap
                        IT GE
                        MOVGE r9, r2
                        MOVGE r2, r3
                        MOVGE r3, r9
                        ; Decrement inner loop index
                        SUBS r2, r2, #1
                        ; Loop inner while inner loop index >= 0
                        BGE inner_loop
                ; Decrement outer loop index
                SUBS r1, r1, #1
                ; Loop outer while outer loop index >= 0
                BGE outer_loop
        ; Return
        BX lr

Mate nejaky napad na pravidla jak tohle delat? Jsou jasne ruzne if-else-endif, pokud jdou po sobe, ale ne vzdy to tak je. Uvital bych odkazy na pripadne dalsi nastroje, ktere tohle nejak umi. ChatGPT jsem se ptal jestli mi napise pravidla ktera pouziva a kdybych veril ze tam je "rozum", tak bych rekl, ze "jsme si vubec neporozumeli" :-). Ani na nekolikaty pokus ji vysvetlit co mne zajima.

v principu to je jen problem "balanced bracket", takze bych googlil algoritmy na tohle.

RDa

  • *****
  • 2 686
    • Zobrazit profil
    • E-mail
Re:C pre-preprocesor
« Odpověď #19 kdy: 18. 04. 2023, 12:23:14 »
Mate nejaky napad na pravidla jak tohle delat?

Heuristikou detekovat co je loop (tj. label - codeblock - jumpback) a treba if/then/else, a to indentovat. jakekoliv labely a jumpy navic jsou netypicke a nechaj je jak jsou.

Takze rozparsovat, analyzovat, pattern matching, rule priorities - pridani atributu a pak uz jen vystupni re-formatovani.

Tohle je celkem straight-forward, bez nutnosti nasazovani "AI u ktere netusime co provede".

Ale prvne bych se podival, zda nejaky "asm prettyprint" neexistuje, cim dal tim vice jsou vsechny bezne problemy pokryte.


mhi

  • *****
  • 500
    • Zobrazit profil
Re:C pre-preprocesor
« Odpověď #20 kdy: 18. 04. 2023, 15:36:35 »
Ja to nemyslel ze bych to resil pres AI, ale ze konkretne ChatGPT to obcas tiskne moc hezky a vidim v tom nejaky smysl.

To co pises je celkem jasne, ale prave ta pravidla jak to delat uz tak jasna nejsou. Kdyz si vezmu ruzne ukazky praktickych kodu, tak obcas sam nevim jak to udelat "hezky". Treba kde se v loopu skace tam-zpet a je tam treba nejaka dvojita podminka ... tohle nevim jak udelat aby to bylo dostatecne čitelné (ani rucne v editoru nemam jasno, dabel je v tech detailech).

Ona ta indentace asm je takova nouzovka pro zprehledneni, ale je to "zadarmo" - zrovna to bych mohl trivialne implementovat, moje disassemblery oznacuji skoky i terminacni instrukce (jump && !terminace ==> podmineny skok) pro analyzu flow.

RDa

  • *****
  • 2 686
    • Zobrazit profil
    • E-mail
Re:C pre-preprocesor
« Odpověď #21 kdy: 18. 04. 2023, 16:14:15 »
To co pises je celkem jasne, ale prave ta pravidla jak to delat uz tak jasna nejsou. Kdyz si vezmu ruzne ukazky praktickych kodu, tak obcas sam nevim jak to udelat "hezky". Treba kde se v loopu skace tam-zpet a je tam treba nejaka dvojita podminka ... tohle nevim jak udelat aby to bylo dostatecne čitelné (ani rucne v editoru nemam jasno, dabel je v tech detailech).

Tak porad mas prostor to implementovat i vertikalnim odsazenim - to co je zrejma soucastast condition v if/then/else, tak muzes slepit dokupy, a bloky kodu odsazovat.

To vertikalni odsazovani jsem pouival ja - call target = 2-3 radky, jump target = 1 radek (pred navestim). Horizontalne me to nenapadlo odsazovat.. ale ja tam mel rovnou i dump adres a hexa kodu, podobne jak to dela treba IDA. A pak jsem tam spis pridaval komentare - zpetne reference, odkud se sem skace. Takze bylo poznat ze neco s 1 referenci je neco jineho.. nez neco s hromadou referenci.

Re:C pre-preprocesor
« Odpověď #22 kdy: 20. 04. 2023, 02:04:53 »
Potrebujes ten asm kod rozsekat na "basic blocks" (BB), z toho si udelas control flow graph (CFG) a pak uz jen pouzivas algoritmy na to urcene (klicove slova treba "loop detection in CFG"):

prvni odkaz na google:
https://pages.cs.wisc.edu/~fischer/cs701.f14/finding.loops.html

Doporucil bych nastudovat graph theory, na tyto veci se hodi.

mhi

  • *****
  • 500
    • Zobrazit profil
Re:C pre-preprocesor
« Odpověď #23 kdy: 20. 04. 2023, 12:22:33 »
Tohle forum je opravdu zajimave. Clovek si tak rika, jestli autor prispevku vubec cetl na co reaguje.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

RDa: oddeleni pomoci newline mam, sice trosku jinak, ale ano, takhle to delam. Mne jde skutecne jen o tu indentaci. Staci si (napr.) v IDA otevrit defacto jakoukoliv binarku se slozitejsim optimalizovanym algoritmem (nejake zanorene cykly a if-y v sobe) a k tomu se zamyslet nad indentacnimi pravidly. Primitivni pravidlo ze telo kazdeho if-else-endif a while-endwhile indentuju o jednu uroven neni uplne nejprehlednejsi. ChatGPT tohle umi mnohem lip, akorat tam nic nedisassembluje, ale generuje novy kod, kde ten vyznam zna, a indentaci to AI nekdo zrejme naucil (otazka je zda sikovnymi pravidly, nebo opet pres uceni).
« Poslední změna: 20. 04. 2023, 12:24:08 od mhi »

RDa

  • *****
  • 2 686
    • Zobrazit profil
    • E-mail
Re:C pre-preprocesor
« Odpověď #24 kdy: 20. 04. 2023, 22:56:01 »
Tak realny kod ale muze byt v binarce taky out of order - takze to bude skakat sem tam a tohle nezaindentuje ani clovek, natoz stroj.

Takze si vem par jednodussich pravidel a zkus je aplikovat na svuj code flow na vystupu disasm