Jump to content
inc0gnito

Confuzie cu un program Delphi

Recommended Posts

Posted (edited)

Salut zilele acestea am gasit prin calculator un program de facut teste si am zis sa fac un "cheat" care sa arate raspunsul corect doar ca problema este urmatoarea, nu imi dau seama cum citeste acel program .exe de creare teste pe fisierul .tst (cum isi da seama care e raspunsul corect? Am observat ca variantele de raspuns nu sunt "codate"). Orice raspuns e bine venit.

Am folosit 3 decompilatoare ca sa il aduc la sursa doar ca niciunul nu prea a fost de folos...

Link program: https://workupload.com/file/fbaX2qXXeJb

 

Edited by inc0gnito
Posted

Salut,

Delphi compileaza direct in assembler.

Prim pas poti incerca "detect iti easy" sa fii sigur ca e scris cu delphi.

Apoi mai erau dede si idr (interactive delphi reconstructor), dar acolo vezi putin gui si codul recuperat e bineinteles asm.

Succes!

  • Like 1
Posted (edited)

Salut. Am aruncat o privire. Nu e mare chestie.
fisierul TST stocheaza si intrebarile si raspunsurile in format binar. (HEX)

Raspunsurile sunt stocate la finalul fiecarei intrebari, dupa itemi:

Formatul e de genul:

nume test
intrebare
item1
item2
...
raspuns(in format binar)
nume test
intrebare2
item
...



Toata teoria sta in a parsa fisierul TST, nu stiu exact ce format are, stringurile sunt precedate de 2 byte pentru lungimea stringului.
Mi se pare ca intrebarile/itemii su un offset fix unele fata de altele, deci ar fi trivial sa imparti TST-ul un chunks ca sa extragi intrebarile.

Zi in ce limbaj de programare te pricepi, si daca te incurci undeva in parsarea fisierului.

Edited by yoyois
  • Like 1
Posted
On 3/31/2022 at 10:18 PM, gigiRoman said:

Salut,

Delphi compileaza direct in assembler.

Prim pas poti incerca "detect iti easy" sa fii sigur ca e scris cu delphi.

Apoi mai erau dede si idr (interactive delphi reconstructor), dar acolo vezi putin gui si codul recuperat e bineinteles asm.

Succes!

Le-am incercat deja doar ca nu prea am gasit ceva care sa ma ajute prea mult in aflarea raspunsului

9 minutes ago, yoyois said:

Salut. Am aruncat o privire. Nu e mare chestie.
fisierul TST stocheaza si intrebarile si raspunsurile in format binar. (HEX)

Raspunsurile sunt stocate la finalul fiecarei intrebari, dupa itemi:

Formatul e de genul:

nume test
intrebare
item1
item2
...
raspuns(in format binar)
nume test
intrebare2
item
...



Toata teoria sta in a parsa fisierul TST, nu stiu exact ce format are, stringurile sunt precedate de 2 byte pentru lungimea stringului.
Mi se pare ca intrebarile/itemii su un offset fix unele fata de altele, deci ar fi trivial sa imparti TST-ul un chunks ca sa extragi intrebarile.

Zi in ce limbaj de programare te pricepi, si poate iti dau un code snippet ca sa incepi parsarea.

Ma pricep in C++, acum am observat si eu dupa ce mi-ai spus ca inainte de numele testului arata varianta de raspuns in format (01,02,03,04 etc)

Posted (edited)
6 hours ago, yoyois said:

Salut. Am aruncat o privire. Nu e mare chestie.
fisierul TST stocheaza si intrebarile si raspunsurile in format binar. (HEX)

Raspunsurile sunt stocate la finalul fiecarei intrebari, dupa itemi:

Formatul e de genul:

nume test
intrebare
item1
item2
...
raspuns(in format binar)
nume test
intrebare2
item
...



Toata teoria sta in a parsa fisierul TST, nu stiu exact ce format are, stringurile sunt precedate de 2 byte pentru lungimea stringului.
Mi se pare ca intrebarile/itemii su un offset fix unele fata de altele, deci ar fi trivial sa imparti TST-ul un chunks ca sa extragi intrebarile.

Zi in ce limbaj de programare te pricepi, si daca te incurci undeva in parsarea fisierului.

Am facut ceva in Python cu ajutorul lui Google doar ca am o problema cu conditiile.. imi arata unele bune si cateva gresit

import sys
import argparse
import os.path

parser = argparse.ArgumentParser()
parser.add_argument("Fisier", help="numele fisierului pe care doresti sa vezi raspunsurile", type=str)
args = parser.parse_args()

try:
    with open(args.Fisier, "rb") as f:
        n = 0
        b = f.read(16)

        while b:
            s1 = " ".join([f"{i:02x}" for i in b])
            if("00 01 0d" in s1): print("a")
            if("00 02 0d" in s1): print("b")
            if("00 03 0d" in s1): print("c")
            if("00 04 0d" in s1): print("d")
          
            b = f.read(16)

except Exception as e:
    print(__file__, ": ", type(e).__name__, " - ", e, sep="", file=sys.stderr)

 

Edited by inc0gnito
Posted (edited)
import sys
import argparse
import os.path
import netstruct

#parseaza un string in format binar lungime+caractere, to UTF-8
def unpackString(d):
	return str(netstruct.unpack(b"b$",d)[0],'UTF-8',errors="ignore")

#parseaza itemii de raspuns
def unpackItems(d):
	items = []
	num = netstruct.unpack(b"b",d[:1])
	for n in range(num[0]):
		items.append(unpackString(d[256*n+1:]))
	return items

#parseaza ultimul byte, numarul intrebarii corecte
def unpackCorrectAnswer(d):
	return netstruct.unpack(b"b",d)

#deschide fisierul
with open("test internet9.tst", "rb") as f:
	#fiecare intrebare are 1589 byte
	b = f.read(1589)
	
	while b:
		#parsam fiecare intrebare in bloc de 1588 bytes
		
		#primii 51b sunt numele testului
		numetest = unpackString(b[:51])
		#urmatorii 255b sunt textul intrebarii
		intrebare = unpackString(b[51:51+255])
		
		#urmeaza un vecor de itemi de raspuns (parsat caz special)
		items = unpackItems(b[307:-1])
		
		#ultimul byte e numarul intrebarii corecte
		answer = unpackCorrectAnswer(b[1588:])
		
		print(numetest)
		print(intrebare)
		print(items)
		print(answer[0])
		print("=================")
		
		b = f.read(1589)


Nu ma pricep la python structs asa ca am folosit netstruct. Il iei easy cu
 

pip install netstruct

 

 

Scriptul e cam spaghetti dar face si afisarea intrebarilor si raspunsurilor. "unpackItems" e cea mai complexa, in rest implementarea e foarte directa

Edited by yoyois
  • Thanks 1
  • Upvote 2
Posted
13 minutes ago, yoyois said:
import sys
import argparse
import os.path
import netstruct

#parseaza un string in format binar lungime+caractere, to UTF-8
def unpackString(d):
	return str(netstruct.unpack(b"b$",d)[0],'UTF-8',errors="ignore")

#parseaza itemii de raspuns
def unpackItems(d):
	items = []
	num = netstruct.unpack(b"b",d[:1])
	for n in range(num[0]):
		items.append(unpackString(d[256*n+1:]))
	return items

#parseaza ultimul byte, numarul intrebarii corecte
def unpackCorrectAnswer(d):
	return netstruct.unpack(b"b",d)

#deschide fisierul
with open("test internet9.tst", "rb") as f:
	#fiecare intrebare are 1589 byte
	b = f.read(1589)
	
	while b:
		#parsam fiecare intrebare in bloc de 1588 bytes
		
		#primii 51b sunt numele testului
		numetest = unpackString(b[:51])
		#urmatorii 255b sunt textul intrebarii
		intrebare = unpackString(b[51:51+255])
		
		#urmeaza un vecor de itemi de raspuns (parsat caz special)
		items = unpackItems(b[307:-1])
		
		#ultimul byte e numarul intrebarii corecte
		answer = unpackCorrectAnswer(b[1588:])
		
		print(numetest)
		print(intrebare)
		print(items)
		print(answer[0])
		print("=================")
		
		b = f.read(1589)


Nu ma pricep la python structs asa ca am folosit netstruct. Il iei easy cu
 

pip install netstruct

 

 

Scriptul e cam spaghetti dar face si afisarea intrebarilor si raspunsurilor. "unpackItems" e cea mai complexa, in rest implementarea e foarte directa

Wow, merge :)  Multumesc de ajutor!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...