Created
November 7, 2014 14:27
-
-
Save jonman364/3ef44d56ca24f9efdcfd to your computer and use it in GitHub Desktop.
OneClick to Tar files
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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