Advertisement
Guest User

unTAR

a guest
Jan 24th, 2012
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.37 KB | None | 0 0
  1. { This small pascal program will extract files
  2.  from a .tar file from a dev_flash base folder (Right!!!)
  3.  Remember, this program is only for educational
  4.  and research purpose (Right again!!!)
  5.  Feel free to improve!
  6.  Questions? No? Thank you!
  7.  Made by rodq }
  8.  
  9. {M 2048, 0, 0}
  10. program unTAR;
  11. uses crt,dos;
  12.  
  13. var
  14. fisier: file of byte;
  15. batfile: Text;
  16. fsize,i: longint;
  17. sursa,nfisier,id1,id2,id3,id4,id5,id6,id7: string;
  18. c1: char;
  19. x1: byte;
  20. dev,tipfisier,Code,nrdir,nrsdir,nrfis: integer;
  21.  
  22. Procedure fixdir;
  23. var
  24.   a: integer;
  25. begin
  26.   for a:=1 to length(nfisier) do
  27.    if nfisier[a]='/'
  28.     then nfisier[a]:='\';
  29. end;
  30.  
  31. Procedure creazadirector;
  32. var
  33.   batwrite: string;
  34. begin
  35.   assign(batfile,'runme.bat');
  36.   {$I-}
  37.   append(batfile);
  38.   {$I+}
  39.   fixdir;
  40.   batwrite:=concat('MKDIR ',nfisier);
  41.   writeln(batfile,batwrite);
  42.   close(batfile);
  43.   writeln('Creating folder: ',nfisier);
  44.   nrdir:=nrdir+1;
  45. end;
  46.  
  47. Function conversieocto(soctal:string):longint;
  48. {converteste un numar intreg in octo}
  49. var
  50. octo,power: longint;
  51. loctal,a,b,Code,temp,pow: integer;
  52. begin
  53. loctal:=length(soctal);
  54. octo:=0;
  55. for a:=1 to loctal do
  56.  begin
  57.   val(soctal[a],temp,Code);
  58.   if temp=0
  59.    then
  60.      power:=0
  61.    else
  62.     power:=1;
  63.   pow:=0;
  64.   if temp<>0
  65.   then
  66.    begin
  67.     for b:=a to (loctal-1) do
  68.      begin
  69.       pow:=pow+1;
  70.       power:=power*8;
  71.      end;
  72.     end;
  73.   if temp=0
  74.    then
  75.     octo:=octo+temp
  76.    else
  77.     octo:=octo+temp*power;
  78.  end; {for}
  79. conversieocto:=octo;
  80. end;
  81.  
  82.  
  83. Procedure creazafisier;
  84. var
  85. fisier2: file of byte;
  86. target,v1,batwrite: string;
  87. dummy: byte;
  88. jo,fo,fr,bkp,ii:longint;
  89. begin
  90. jo:=conversieocto(id4);
  91. textcolor(white);
  92. writeln;
  93. write('File found: ');
  94. textcolor(green);
  95. writeln(nfisier);
  96. textcolor(white);
  97. write('Starting: ');
  98. textcolor(blue);
  99. write(i+354);
  100. textcolor(white);
  101. write(' size: ');
  102. textcolor(red);
  103. write(jo);
  104. textcolor(white);
  105. writeln(' bytes');
  106. textcolor(cyan);
  107. writeln('---------------------------------------------------------------');
  108. textcolor(white);
  109. nrfis:=nrfis+1;
  110. str(nrfis,v1);
  111. target:=concat('file',v1,'.bin');
  112. bkp:=i;
  113. fo:=0;
  114. fo:=i+354;
  115. writeln;
  116. write('Creating file...');
  117. seek(fisier,fo);
  118. assign(fisier2,target);
  119. assign(batfile,'runme.bat');
  120. {$I-}
  121. rewrite(fisier2);
  122. {$I+}
  123. {$I-}
  124. append(batfile);
  125. {$I+}
  126. batwrite:='';
  127. batwrite:=concat('MOVE ',target,' ',nfisier);
  128. writeln(batfile,batwrite);
  129. close(batfile);
  130. for fr:=1 to jo do
  131.  begin
  132.    read(fisier,dummy);
  133.    write(fisier2,dummy);
  134.  end;
  135. close(fisier2);
  136. close(fisier);
  137. assign(fisier,sursa);
  138. {$I-}
  139. reset(fisier);
  140. {$I+}
  141. {de creat fisier}
  142. i:=jo+fo; {sare de fisierul gasit = speeeed}
  143. writeln(' Done.');
  144. seek(fisier,i);
  145. end;
  146.  
  147. procedure readbyte; {citeste byte din fisier si transforma in c1 char}
  148. begin
  149. read(fisier,x1);
  150. c1:=chr(x1);
  151. end;
  152.  
  153. procedure searchdevflash;
  154. begin
  155.  if c1='d'
  156.   then
  157.   begin
  158.    readbyte;
  159.    i:=i+1;
  160.    if c1='e'
  161.     then
  162.     begin
  163.      readbyte;
  164.      i:=i+1;
  165.      if c1='v'
  166.       then
  167.       begin
  168.        readbyte;
  169.        i:=i+1;
  170.        if c1='_'
  171.         then
  172.         begin
  173.          readbyte;
  174.          i:=i+1;
  175.          if c1='f'
  176.           then
  177.           begin
  178.            readbyte;
  179.            i:=i+1;
  180.            if c1='l'
  181.             then
  182.             begin
  183.              readbyte;
  184.              i:=i+1;
  185.              if c1='a'
  186.               then
  187.               begin
  188.                readbyte;
  189.                i:=i+1;
  190.                if c1='s'
  191.                 then
  192.                 begin
  193.                  readbyte;
  194.                  i:=i+1;
  195.                  if c1='h'
  196.                   then
  197.                   begin
  198. {                  writeln('dev_flash was found @ ',i-8-1,' ! '); }
  199.                    dev:=dev+1;
  200.                    nfisier:='dev_flash';
  201.                    readbyte;
  202.                    i:=i+1;
  203.                    while ord(c1)<>0 do
  204.                     begin
  205.                      nfisier:=nfisier+c1;
  206.                      readbyte;
  207.                      i:=i+1;
  208.                     end;
  209. {                  writeln('     Path is: ',nfisier); }
  210.                    while ord(c1)=0 do
  211.                     begin
  212.                      readbyte;
  213.                      i:=i+1;
  214.                     end;
  215.                    id1:='';
  216.                    while ord(c1)<>0 do
  217.                     begin
  218.                      id1:=id1+c1;
  219.                      readbyte;
  220.                      i:=i+1;
  221.                     end;
  222.                    id2:='';
  223.                    readbyte;
  224.                    i:=i+1;
  225.                    while ord(c1)<>0 do
  226.                     begin
  227.                      id2:=id2+c1;
  228.                      readbyte;
  229.                      i:=i+1;
  230.                     end;
  231.                    id3:='';
  232.                    readbyte;
  233.                    i:=i+1;
  234.                    while ord(c1)<>0 do
  235.                     begin
  236.                      id3:=id3+c1;
  237.                      readbyte;
  238.                      i:=i+1;
  239.                     end;
  240.                    id4:='';
  241.                    readbyte;
  242.                    i:=i+1;
  243.                    while ord(c1)<>0 do
  244.                     begin
  245.                      id4:=id4+c1;
  246.                      readbyte;
  247.                      i:=i+1;
  248.                     end;
  249.                    id5:='';
  250.                    readbyte;
  251.                    i:=i+1;
  252.                    while ord(c1)<>0 do
  253.                     begin
  254.                      id5:=id5+c1;
  255.                      readbyte;
  256.                      i:=i+1;
  257.                     end;
  258.                    id6:='';
  259.                    readbyte;
  260.                    i:=i+1;
  261.                    while ord(c1)<>0 do
  262.                     begin
  263.                      id6:=id6+c1;
  264.                      readbyte;
  265.                      i:=i+1;
  266.                     end;
  267.                    id7:='';
  268.                    readbyte;
  269.                    i:=i+1;
  270.                    readbyte;
  271.                    i:=i+1;
  272.                    while ord(c1)<>0 do
  273.                     begin
  274.                      id7:=id7+c1;
  275.                      readbyte;
  276.                      i:=i+1;
  277.                     end;
  278.                     {writeln;
  279.                    writeln(id1,'-',id2,'-',id3,'-',id4,'-',id5,'-',id6,'-',id7,'   ',i); }
  280.                    tipfisier:=0;
  281.                    Code:=0;
  282.                    val(id1,tipfisier,Code);
  283.            if (conversieocto(id1)> 699) and (conversieocto(id4)>0)
  284.             then
  285.                     begin
  286.              textcolor(red);
  287.              writeln('Probably a firmware bug... Folder is not a File!!!');
  288.              textcolor(white);
  289.             end;
  290.            if (conversieocto(id1)<700) and (conversieocto(id4)=0)
  291.                     then
  292.              begin
  293.               textcolor(red);
  294.               writeln('Probably a firmware bug... File is not a Folder!!!');
  295.               textcolor(white);
  296.              end;
  297.                    if (conversieocto(id4)=0) and (nfisier[length(nfisier)]='/')
  298.                      then creazadirector
  299.                      else creazafisier;
  300.                  end; {h}
  301.                end; {s}
  302.              end; {a}
  303.            end; {l}
  304.          end; {f}
  305.        end; {_}
  306.      end; {v}
  307.    end; {e}
  308.  end; {d}
  309. end; {procedure devflash}
  310.  
  311. begin
  312. clrscr;
  313. textcolor(white);
  314. dev:=0;
  315. nrdir:=0;  {numar directoare}
  316. nrfis:=0;  {numar fisiere}
  317. nrsdir:=0; {numar subdirectoare}
  318. writeln;
  319. assign(batfile,'runme.bat');
  320. {$I-}
  321. rewrite(batfile);
  322. {$I+}
  323. writeln(batfile,'@echo off');
  324. writeln(batfile,'@echo This will push all files to the right place');
  325. close(batfile);
  326. write('Input source target (8 chars max): '); { MS-DOS }
  327. readln(sursa);
  328. assign(fisier,sursa);
  329. {$I-}
  330. reset(fisier);
  331. {$I+}
  332. writeln;
  333. If (IOResult <> 0) then
  334.   begin
  335.     writeln('File not found! Press ENTER to Exit!');
  336.     readln;
  337.   end
  338.   else
  339.   begin
  340.     fsize:=filesize(fisier);
  341.     clrscr;
  342.     writeln;
  343.     writeln('File ',sursa,' is ',fsize,' bytes.');
  344.     writeln;
  345.     writeln('Now doing things. Please wait!');
  346.     for i:=1 to fsize do
  347.     begin
  348.      readbyte;
  349.      searchdevflash;
  350.     end;   {for search}
  351.   end;  {if io error}
  352.   close(fisier);
  353.   textcolor(red);
  354.   writeln;
  355.   writeln;
  356.   writeln('WARNING! Firmware may contain bugs! This is only for testing!');
  357.   writeln;
  358.   textcolor(white);
  359.   writeln('Total: ',nrfis,' files and ',nrdir,' folders found.');
  360.   writeln;
  361.   textcolor(yellow);
  362.   writeln;
  363.   writeln(' Program ended. File ',sursa,' is done. RUNME.BAT to fix files!');
  364.   textcolor(white);
  365. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement