Skip to content

Instantly share code, notes, and snippets.

@jonman364
Created November 7, 2014 14:27
Show Gist options
  • Save jonman364/3ef44d56ca24f9efdcfd to your computer and use it in GitHub Desktop.
Save jonman364/3ef44d56ca24f9efdcfd to your computer and use it in GitHub Desktop.
OneClick to Tar files
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace oneclick2tars {
class Program {
static void Main(string[] args) {
long offset = 0;
string file = @"c:\users\jon\desktop\SGH\SGH-I717UCLE2_74A55FA71D15964F9EC9E9489B34DE4E.exe";
string[] files = { /*"amss.bin" , "mdm.bin",*/ /*"boot.img",*/ /*"system.img.ext4"*/ };
while(offset >= 0) {
offset = find(file, new int[] { 0x75, 0x73, 0x74, 0x61, 0x72, 0x20, 0x20 }, offset + 1);
if(offset > 0){
TarFile tarFile = GetTarHeader(file, offset);
Console.WriteLine(tarFile);
//if(files.Contains(tarFile.FileName)){
Console.WriteLine("Getting file {0}", tarFile.FileName);
GetFile(file, tarFile);
//}
offset += tarFile.Size;
}
}
}
static long find(string filename, int[] needle, long offset) {
FileStream file = File.OpenRead(filename);
file.Seek(offset, SeekOrigin.Begin);
long len = file.Length;
while(offset < len) {
int buf = file.ReadByte();
int i = 0;
for(; i < needle.Length; i++) {
if(needle[i] == buf)
buf = file.ReadByte();
else
break;
}
if(i == needle.Length)
return offset;
else if(i > 0)
file.Seek(i * -1, SeekOrigin.Current);
offset++;
}
return -1;
}
static TarFile GetTarHeader(string filename, long offset){
FileStream file = File.OpenRead(filename);
file.Seek(offset - 0x101, SeekOrigin.Begin);
byte[] buf = new byte[512];
file.Read(buf, 0, 512);
TarFile tarFile = new TarFile();
tarFile.FileName = GetString(buf, 0);
tarFile.Size = Convert.ToInt64(GetString(buf, 124), 8);
tarFile.Offset = offset - 0x101;
tarFile.Length = (tarFile.Size % 0x200) == 0 ? (tarFile.Size + 0x200) : (((tarFile.Size / 0x200) + 1) * 0x200) + 0x200;
file.Close();
return tarFile;
}
static void GetFile(string fileName, TarFile file){
FileStream iFile = File.OpenRead(fileName);
FileStream oFile = File.OpenWrite(@"c:\users\jon\Desktop\oneclick2tar\" + file.FileName + ".tar");
long written = 0;
byte[] buf = new byte[512];
iFile.Seek(file.Offset, SeekOrigin.Begin);
iFile.Read(buf, 0, 512);
oFile.Write(buf, 0, 512);
while(written < file.Size){
buf = new byte[512];
iFile.Read(buf, 0, (int)Math.Min(file.Size - written, 512L));
oFile.Write(buf, 0, 512);
written += 512;
}
buf = new byte[512];
oFile.Write(buf, 0, 512);
oFile.Write(buf, 0, 512);
oFile.Close();
iFile.Close();
}
static string GetString(byte[] buf, int offset) {
StringBuilder retval = new StringBuilder();
for(int i = offset; i < buf.Length; i++) {
if(buf[i] == 0)
break;
retval.Append((char)(buf[i]));
}
return retval.ToString();
}
struct TarFile {
public string FileName;
public long Size;
public long Offset;
public long Length;
public override string ToString() {
return String.Format("{0}\n\tOffset: 0x{1:X10}\n\tSize: 0x{2:X10}\n\tEnd: 0x{3:X10}", FileName, Offset, Size, Offset + Length);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment