Italian Edit File binario

Discussion in 'Italian Forum' started by klingon467, Jul 9, 2015.

  1. klingon467

    klingon467 Member Licensed User

    Ciao a tutti,
    ho il seguente problema ho creato un semplice editor in B4J per editare un file apk in cui devo inserire (alla fine del file possibilemente) dei parametri per poi leggerli quando viene eseguita l'apk sul dispositivo. vi posto il sorgente di quello che sono riuscito a fare...
    Code:
    Sub Process_Globals
        
    Private fx As JFX
        
    Private MainForm As Form
        
    Dim raf As RandomAccessFile
        
    Private btnWrite As Button
        
    Private btnRead As Button
        
    Dim txtHost As TextField
        
    Dim txtPort As TextField
        
    Dim MsgBox As Msgboxes
        
    Private btnRead As Button
        
    Private btnOpen As Button
        
    Dim txtPath As TextField
       
        
    'blocco dialog

        
    Dim stubName As String
        
    Dim stubPath As String


    End Sub

    Sub AppStart (Form1 As Form, Args() As String)
        MainForm = Form1
        MainForm.RootPane.LoadLayout(
    "Main"'Load the layout file.
        MainForm.Show
        stubName = 
    "myar.apk.bak"
        stubPath = 
    File.DirApp
        
    If File.Exists(stubPath, "myar.apk") = True Then
        
    File.Delete(stubPath, "myar.apk")
        
    Else
        
    File.Copy(stubPath, stubName, stubPath, "myar.apk")
        
    End If
        raf.Initialize(stubPath, 
    "myar.apk"False)
    End Sub
    Public Sub Write (whost As String, wport As String)
    Dim whostB() As Byte
    Dim wportB() As Byte

    whostB = whost.GetBytes(
    "UTF8")
    wportB = wport.GetBytes(
    "UTF8")

    raf.WriteBytes(wportB, 
    0,  wportB.Length, 8850)'write the port + split on position 8850
    raf.WriteBytes(whostB, 0, whostB.Length, 8858)'write the hostname + split on position 8858

    End Sub
    Sub btnWrite_Action
    Try
    Dim host As String
    Dim port As String
    host = txtHost.Text & 
    "SPLT"
    port = txtPort.Text & 
    "SPLT"
        Write(host, port)
        
    MsgBox.Show("Done!","Info")
        
    Catch
        
    Log(LastException.Message)
        
    End Try
    End Sub
    Sub btnRead_Action
        Read
    End Sub
    Public Sub Read
    Dim buffer(48As Byte
    Dim str As String
    Dim strArr() As String

    For i = 0 To buffer.Length
    raf.ReadBytes(buffer, 
    0, buffer.Length, 8850)
    str = 
    BytesToString(buffer, 0, buffer.Length, "UTF8")
    strArr = 
    Regex.Split("SPLT", str)

    Next
    Log(strArr(0)) 'read port
    Log(strArr(1)) 'read host
    End Sub
    Questo funziona bene ma l'apk risulta corrotta perchè scrivo in un offset apparentemente con byte nulli ma a quanto pare corrompe l'app.
    Ho notato che editando l'apk con un editor esadecimale (es: HexWorkshop) ed aggiungendo a mano i parametri alla fine l'apk funziona in pratica esiste un equivalente di:

    visual studio 6 code:
    Code:
    Function WriteFile(PathToWFile As String, WriteData As StringAs String 'simple Function to write the Data in a File
    Open PathToWFile For Binary As #2
    Put 
    #2, , WriteData
    Close 
    #2
    End Function
    grazie in anticipo
     
  2. picenainformatica

    picenainformatica Active Member Licensed User

    In vb6 funziona?
     
  3. iz0ndg

    iz0ndg Member Licensed User

    Scusami, magari dico una sciocchezza, ma da quello che so io un file apk è un file compresso e se appendi direttamente a questo file qualcosa è normale che ti si corrompa. Credo che la procedura giusta sia di scompattarlo, aggiungerci un file con quello che ti serve e ricompattarlo.
    Preciso che non ho mai provato.
     
  4. maxware

    maxware Well-Known Member Licensed User

    Klingon...non capisco lo scopo
     
  5. picenainformatica

    picenainformatica Active Member Licensed User

    Penso di aver capito. Aggiunge in coda al file APK (senza modificarne il contenuto) un qualche cosa tipo numero di serie dal leggere dall'APK originale e non dentro le installazioni. In Windows funziona(va), non ho più usato questo metodo da anni.
     
    klingon467 likes this.
  6. klingon467

    klingon467 Member Licensed User

    Bravo! esattamente il file apk è formato compresso quindi si può aggiungere dati solo in fondo (EOF) e funziona perfettamente fatto la prova utilizzando HexWorkshop (screen.JPG) inserendolo manualmente. Il problema ora è capire come scrivere in fondo all'apk tramite b4j ma con la funzione:

    Code:
    raf.WriteBytes(wportB, 0,  wportB.Length, 8850)
    chiede chiaramente di specificare un offset dove iniziare a scrivere i dati

    in visual basic puro è piuttosto banale:

    editor:
    Code:
    Private Sub Command1_Click()
    Dim myStub As String
    Dim ResourceFile As String
    Dim ResultFile As String
    Dim message As String

    message = 
    "Hello Word!"


    myStub = App.Path & 
    "\stub.exe" 'my resource
    ResourceFile = LoadFile(myStub) 'read my resource


    ResultFile = App.Path & 
    "\result.exe" 'final results

    'write data into resource file
    Call WriteFile(ResultFile, ResourceFile & "####" & message & "####")

    MsgBox ("Done")
    End Sub
    Function LoadFile(PathToFile 
    As StringAs String 'simple Function to Read the Data of the File
    Open PathToFile For Binary As #1
    LoadFile = Space(LOF(
    1))
    Get 
    #1, , LoadFile
    Close 
    #1
    End Function
    Function WriteFile(PathToWFile 
    As String, WriteData As StringAs String 'simple Function to write the Data in a File
    Open PathToWFile For Binary As #2
    Put 
    #2, , WriteData
    Close 
    #2
    End Function

    stub:

    Code:
    Private Sub Form_Load()
    Dim Datos As String
    Dim sData() As String

    Datos = LoadFile(App.Path & 
    "\" & App.EXEName & ".exe")

    sData = Split(Datos, 
    "####"'split data

    MsgBox (sData(1))
    Unload Me

    End Sub
    Function LoadFile(PathToFile 
    As StringAs String 'simple Function to Read the Data of the File
    Open PathToFile For Binary As #1
    LoadFile = Space(LOF(
    1))
    Get 
    #1, , LoadFile
    Close 
    #1
    End Function
     

    Attached Files:

  7. picenainformatica

    picenainformatica Active Member Licensed User

    come offset dai la lunghezza del file apk. se non sbaglio lof(1) corrisponde a basestream.length

    @maxware, tu non vieni da Klingon
     
  8. maxware

    maxware Well-Known Member Licensed User

    In effetti un po di rughe ne ho
     
  9. klingon467

    klingon467 Member Licensed User

    Quasi! modificando così:
    Code:
    Public Sub Write (whost As String, wport As String)
    Dim whostB() As Byte
    Dim wportB() As Byte

    whostB = whost.GetBytes(
    "UTF8")
    wportB = wport.GetBytes(
    "UTF8")

    raf.WriteBytes(wportB, 
    0,  wportB.Length, wportB.Length)'write the port + split
    raf.WriteBytes(whostB, 0, whostB.Length, wportB.Length + 8)'write the hostname + split
    End Sub
    ma scrive in testa al file! :eek:
     

    Attached Files:

    • azz!.JPG
      azz!.JPG
      File size:
      111.9 KB
      Views:
      11
  10. LucaMs

    LucaMs Expert Licensed User

    Io sono invece curioso di sapere come farai poi a leggere quei dati a runtime, da dentro l'app (se non è questo lo scopo, allora... non ho capito lo scopo :D)
     
    klingon467 likes this.
  11. LucaMs

    LucaMs Expert Licensed User


    Dovresti usare raf.Size, nella WriteBytes

    upload_2015-7-10_11-12-32.png

    raf.Size al posto di Position
     
  12. picenainformatica

    picenainformatica Active Member Licensed User

    @LucaMs Il tuo APK è dentro il terminale. Qualcuno (MyAPK) li estrae e li salva all'esterno. Dentro la cartella "data/system" trovi "packages.xml" con dentro l'elenco degli APK sparsi nel tablet con il nome ed il percorso completo.
     
  13. LucaMs

    LucaMs Expert Licensed User

    Ok, ma poi? Una volta trovato l'apk (tramite un'altra app - [App1]) che fai? Ne leggi i dati aggiunti e...? La fai installare dall'app App1? Non penso sia possibile.
     
  14. picenainformatica

    picenainformatica Active Member Licensed User

    Ci fai quello che vuoi, compreso tirarle fuori, decompilarle o metterle da parte. @klingon467 rileggerà i suoi dati e saprà che strada ha fatto l'APK ad entrare nel tablet (ossia da quale canale è stato scaricato o se è stato estratto da qualcuno per passarlo a qualcun altro).
     
  15. klingon467

    klingon467 Member Licensed User

    Ottima intuizione! è proprio questo lo scopo!
    infatti già cercavo un surrogato di Application.Startupath

    +Rep per LucaMs funziona a meraviglia utilizzando raf.size

    ora rimane come da te intuito leggere dati in runtime.... e trovare un equivalente in (b4a) di application.startupath o se preferisci app.path & "\" & EXEname & ".exe"

    grazie per la dritta comunque!
     

    Attached Files:

    • ok!.JPG
      ok!.JPG
      File size:
      59.5 KB
      Views:
      11
    Last edited: Jul 10, 2015
  16. picenainformatica

    picenainformatica Active Member Licensed User

    Le informazioni che ho scritto le trovi nel forum.
     
    klingon467 likes this.
  17. klingon467

    klingon467 Member Licensed User

    Non riesco a leggerli per ora sempre con b4j la funzione che utilizzo è:

    Code:
    Public Sub Read
    Dim buffer() As Byte
    Dim str As String
    Dim strArr() As String

    For i = 0 To buffer.Length
    raf.ReadBytes(buffer, 
    0, buffer.Length, raf.Size)
    str = 
    BytesToString(buffer, 0, buffer.Length, "UTF8")
    strArr = 
    Regex.Split("SPLT", str)

    Next
    Log(strArr(0)) 'read port
    Log(strArr(1)) 'read host
    End Sub
    lo split "SPLT" per definire i vari blocchi da leggere

    strArr(0) porta
    strArr(1) l'host

    ma mi restituisce un eccezione:
    avete idee?
     
  18. picenainformatica

    picenainformatica Active Member Licensed User

    Usa la libreria RandomAccessFile. Usa la stessa logica del tuo esempio in VB6.
     
Loading...