[DEV] sdat2img 1.1 - img2sdat 1.7 ◦ Unpack/re-pack android DAT files

Search This thread

xpirt

Recognized Developer / Inactive RC
Feb 19, 2013
5,070
21,225
Introduction
You probably know already that starting from Android 5.x (Lollipop) compiled roms (aosp,cm,stock) are not compressed anymore the way they used to be on previous android versions. On previous versions all content inside /system folder that has to be extracted within our device was either uncompressed (simple /system folder inside our flashable zip) or compressed in a system.img file, which it is a ext4 compressed file; both of these, anyway, were readable and we could see all system files (app,framework, etc).
The problem comes in >=5.0 versions, this method is not used anymore. Why? Because roms started to be always larger, so it is necessary to compress them even more.


What does new Android zips (full roms, but also otas) contain?
New Android flashable zips are made this way:
boot.img (kernel)
file_contexts (selinux related)
META-INF (folder containing scripts)
system.new.dat (compressed /system partition)
system.patch.dat (for OTAs)
system.transfer.list (see explanation below)​


What does updater-script contains then?
The updater-script uses a brand new function: block_image_update(), this method basically decompresses necessary files inside the device. Let's study it.
From google git source code, if we go inside the new file /bootable/recovery/updater/blockimg.c, we find at the end of it the registration of the function block_image_update() as the method BlockImageUpdateFn() which starts at line 254. Here finally we find all information we need to know about the decompression of the .dat file(s). First file we analyze is system.transfer.list which Google tells us:

The transfer list is a text file containing commands to transfer data from one place to another on the target partition.


But what each line means?:
First line is the version number of the transfer list; 1 for android 5.0.x, 2 for android 5.1.x, 3 for android 6.0.x, 4 for android 7.x/8.x
Second line is the total number of blocks being written
Third line is how many stash entries are needed simultaneously (only on versions >= 2)
Fourth line is the maximum number of blocks that will be stashed simultaneously (only on versions >= 2)
Fifth line and subsequent lines are all individual transfer commands.


Ok, but how to decompress the system.new.dat file?
All instructions are below. sdat2img, rimg2sdat and img2sdat binaries are involved. Please read carefully step by step.


NOTE for OTAs
If you are looking on decompressing system.patch.dat file or .p files, therefore reproduce the patching system on your PC, check imgpatchtools out by @erfanoabdi.


You can use/modify these files and/or include them in your work as long as proper credits and a link to this thread are given.

If you have questions or problems write here ;)


Are you building from source and want to revert to the old flashing method without DAT files?
Do this (thx @Elluel):
1 - Delete this line
2 - Make sure you have this commit


Thanks
- howellzhu & luxi78 - for initial source codes
- all contributors from github
 
Last edited:

xpirt

Recognized Developer / Inactive RC
Feb 19, 2013
5,070
21,225
Ubuntu

Ubuntu 64-bit - Guide

Step 1 - Decompressing = DAT (sparse data) -> EXT4 (raw image)

We're now using sdat2img binary, the usage is very simple (make sure you have python 2.7+ installed):
./sdat2img.py <transfer_list> <system_new_file> [system_img]​
- <transfer_list> = input, system.transfer.list from rom zip
- <system_new_file> = input, system.new.dat from rom zip
- [system_img] = output ext4 raw image file

and a quick example:
./sdat2img.py system.transfer.list system.new.dat system.img​
by running this command you will get as output the file my_new_system.img which is the raw ext4 image.


Step 2 - Decompress EXT4 (raw image) -> OUTPUT folder -> Compress EXT4 (raw image)

Now we need to mount or ext4 raw image into an output folder so we can see apks/jars etc.
To do this we need to type this command:
sudo mount -t ext4 -o loop system.img output/​
As you can see there is a new folder called output which we can edit/modify/delete your files (not able to? see here)

Now we need to compress it back to a raw ext4 image, to do this we need the make_ext4fs binary. Make sure you have the file_contexts file (taken from the Rom zip) inside the make_ext4fs path. Then type this (got issues? see here)
./make_ext4fs -T 0 -S file_contexts -l 1073741824 -a system system_new.img output/​
You will get the new raw ext4 image called 'system_new.img' ready for the next step.

Step 3 - Converting = EXT4 (raw image) -> IMG (sparse image)

Now we need to convert the ext4 raw image into a sparse image. For this you need img2simg binary you can find here (thx to @A.S._id).
The usage is simple:
img2simg <raw_image_file> <sparse_image_file>​
Pretty self-explanatory, the output will be a new sparse image (.img).


Step 4 - Converting = IMG (sparse image) -> DAT (sparse data)

Now we need the img2sdat binary, the usage is very simple (make sure you have python 2.7+ installed):
./img2sdat.py <system_img>​
- <system_img> = name of input sparse image file (from step 3)

As you can see the output is composed by system.transfer.list, (system.patch.dat) & system.new.dat, ready to be replaced inside your Rom zip.


DOWNLOADs
sdat2img.py
- github.com
make_ext4fs
- mega.co.nz
img2sdat.py
- github.com
 
Last edited:

xpirt

Recognized Developer / Inactive RC
Feb 19, 2013
5,070
21,225
Windows

Windows 32/64 bit - Guide

Step 1 - Decompressing = DAT (sparse data) -> EXT4 (raw image)

We're now using sdat2img.py binary, the usage is very simple (make sure you have python 3.x installed):
sdat2img.py <transfer_list> <system_new_file> <system_ext4>​
- <transfer_list> = input, system.transfer.list from rom zip
- <system_new_file> = input, system.new.dat from rom zip
- <system_ext4> = output ext4 raw image file

and a quick example:
sdat2img.py system.transfer.list system.new.dat system.img​
by running this command you will get as output the file my_new_system.img which is the raw ext4 image.


Step 2 - Decompress EXT4 (raw image) -> OUTPUT folder -> Compress EXT4 (raw image)

Now you should either move to Ubuntu x64/x86 or follow the 2nd step from the Ubuntu guide on cygwin 32 bit.

Step 3 - Converting = EXT4 (raw image) -> IMG (sparse image)

Now we need to convert the ext4 raw image into a sparse image. For this you need img2simg binary you can find here (thx to @A.S._id).
The usage is simple:
img2simg.exe <raw_image_file> <sparse_image_file>​
Pretty self-explanatory, the output will be a new sparse image (.img).


Step 4 - Converting = IMG (sparse image) -> DAT (sparse data)

Now we need the img2sdat binary, the usage is very simple (make sure you have python 2.7+ installed):
img2sdat.py <system_img>​
- <system_img> = name of input sparse image file (from step 3)

As you can see the output is composed by system.transfer.list, (system.patch.dat) & system.new.dat, ready to be replaced inside your Rom zip.


DOWNLOADs
sdat2img.py
- github.com
make_ext4fs
- mega.co.nz
img2sdat.py
- github.com
 
Last edited:

Incredible_Culp

Senior Member
May 13, 2010
1,279
1,105
i don't think so, though you can install ubuntu in a virtual machine as 64-bit and decompress there without problems.

I found one, Ext2Explore, it can browse and extract lollipop .dat files

Confirmed.

Works perfectly..

Thanks a lot! This will save a lot of time theming.. (pulling the system, settings, framework without having to flash the rom first)

Oh, just for s&g's i extracted ("decompiled") the system.new file, the files (app, prive-app, framework, media, etc) all got placed on my desktop -- i deleted the system.new file from the rom -- i then placed the folders and files that got extracted and placed them in the rom -- i flashed it -- it booted! lol.. didnt think it would... but anyways, there's that.

For those who want to try:
--- > its basically self explanatory.
- once downloaded (the link above) extract the contents from the zip (i just went ahead and extracted to my desktop)
- right click the linux penguin
- run as administrator - the window will pop up
- go to file > open image > find your system.new image (should already be extracted from the rom and placed on your desktop)
- click open
- you should now see your image (or path) in the windows -- double click them (i doubled clicked both the right and left side)
- now you should be able to see all the folders

---> if you want to extract those folders
- just go up to the top
- click save and choose an extraction :) (i chose Desktop)

Hoped i helped -- any questions or confusion, dont be shy to ask -- i probably went too fast, idk lol

Enjoy!
 
Last edited:

webdroidmt

Senior Member
Dec 20, 2011
1,674
1,156
NJ
Confirmed.

Works perfectly..

Thanks a lot! This will save a lot of time theming.. (pulling the system, settings, framework without having to flash the rom first)

Oh, just for s&g's i extracted ("decompiled") the system.new file, the files (app, prive-app, framework, media, etc) all got placed on my desktop -- i deleted the system.new file from the rom -- i then placed the folders and files that got extracted and placed them in the rom -- i flashed it -- it booted! lol.. didnt think it would... but anyways, there's that.

For those who want to try:
--- > its basically self explanatory.
- once downloaded (the link above) extract the contents from the zip (i just went ahead and extracted to my desktop)
- right click the linux penguin
- run as administrator - the window will pop up
- go to file > open image > find your system.new image (should already be extracted from the rom and placed on your desktop)
- click open
- you should now see your image (or path) in the windows -- double click them (i doubled clicked both the right and left side)
- now you should be able to see all the folders

---> if you want to extract those folders
- just go up to the top
- click save and choose an extraction :) (i chose Desktop)

Hoped i helped -- any questions or confusion, dont be shy to ask -- i probably went too fast, idk lol

Enjoy!

I can't get this to work at all. I'm using Win 7 Pro and I've actually used this app before with stock Nexus 7 factory images and it worked fine.. What file did you actually download? I d/l 2 different versions, one was beta 2.0 and the other was a zip that said 2.2.71 but the about on the exe says 2.1, which is the version I've been using for quite a while.

With the beta 2.0, there's not even an option to open a file and with the 2.1, it errors out every time. After opening system.new.dat image and double clicking, it just hangs and the program stops responding. If I try clicking on it and selecting save, it allows me to select a folder to save it in but I just get a dialog box that says saving files and then hangs at 24% every time, finally crashing with a Microsoft C++ runtime error.

Oh btw, you didn't go too fast LOL, this is really a simple app to use but it's just not working for me with these block image files. Maybe I'm missing something but it's got me scratching my head. :laugh: If you have any ideas, I'm all ears.

Thanks,
Mike T
 
Last edited:

Incredible_Culp

Senior Member
May 13, 2010
1,279
1,105
I can't get this to work at all. I'm using Win 7 Pro and I've actually used this app before with stock Nexus 7 factory images and it worked fine.. What file did you actually download? I d/l 2 different versions, one was beta 2.0 and the other was a zip that said 2.2.71 but the about on the exe says 2.1, which is the version I've been using for quite a while.

With the beta 2.0, there's not even an option to open a file and with the 2.1, it errors out every time. After opening system.new.dat image and double clicking, it just hangs and the program stops responding. If I try clicking on it and selecting save, it allows me to select a folder to save it in but I just get a dialog box that says saving files and then hangs at 24% every time, finally crashing with a Microsoft C++ runtime error.

Oh btw, you didn't go too fast LOL, this is really a simple app to use but it's just not working for me with these block image files. Maybe I'm missing something but it's got me scratching my head. :laugh: If you have any ideas, I'm all ears.

Thanks,
Mike T

hmm interesting..

im using windows 8.1

idk how much help i can be because i just downloded the first option (provided by the link above) and went from there.

like you said, theres two.. the .exe and the .zip.. i downloaded the .exe
 

webdroidmt

Senior Member
Dec 20, 2011
1,674
1,156
NJ
hmm interesting..

im using windows 8.1

idk how much help i can be because i just downloded the first option (provided by the link above) and went from there.

like you said, theres two.. the .exe and the .zip.. i downloaded the .exe

So, did you d/l the zip that was modified 2006-8-26, which is version 2.0 beta, or did you click the link which said download latest release?

Mike T
 

Incredible_Culp

Senior Member
May 13, 2010
1,279
1,105
So, did you d/l the zip that was modified 2006-8-26, which is version 2.0 beta, or did you click the link which said download latest release?

Mike T

ha! didnt even see there was a latest release..

i downloaded the 2006-8-26 apparently -- didnt even look at that date either LOL

i dont want to try the latest now -- this one works fine for me lmao -- dont want to ruin it.. ah, screw it, im downloading the latest now

EDIT: Ok, i lied.. i just checked my trash.. i did download the lastest release .zip .. the 2271..
 
Last edited:
  • Like
Reactions: webdroidmt

webdroidmt

Senior Member
Dec 20, 2011
1,674
1,156
NJ
Maybe something with my PC setup or Win 7 because the 2006-8-26 version doesn't even give me an option for opening a file image. It actually loads up looking like an incomplete application, it's also a very small filesize. Did you just d/l the ext2explore exe, or did you also d/l ext2read2 beta zip?

Mike T
 

Elluel

Senior Member
Jan 14, 2014
5,168
3,057
26
えうれる
Maybe something with my PC setup or Win 7 because the 2006-8-26 version doesn't even give me an option for opening a file image. It actually loads up looking like an incomplete application, it's also a very small filesize. Did you just d/l the ext2explore exe, or did you also d/l ext2read2 beta zip?

Mike T

Use the download link in the above post and click the green download button, and it should be the correct version, from 2012 rather than 2006.
 
  • Like
Reactions: webdroidmt

webdroidmt

Senior Member
Dec 20, 2011
1,674
1,156
NJ
Last edited:

Elluel

Senior Member
Jan 14, 2014
5,168
3,057
26
えうれる
That's the one I've been using for quite some time. As mentioned in my previous post, the system.new.dat files just "appear" to be saving but hangs at 24%, then eventually crashes. I'm stumped, should be so easy but it doesn't want to cooperate. LOL

Thanks anyway,
Mike T

Weird. Try redownloading the ROM you're trying to extract?
 

webdroidmt

Senior Member
Dec 20, 2011
1,674
1,156
NJ
Use the download link in the above post and click the green download button, and it should be the correct version, from 2012 rather than 2006.

Thanks for trying guys, that is exactly the one I've been using. I downloaded it again a few seconds ago and still getting the same result. :confused: :laugh:

Thanks.
Mike T

---------- Post added at 01:09 AM ---------- Previous post was at 01:08 AM ----------

Weird. Try redownloading the ROM you're trying to extract?

I've actually tried with images from 3 different roms and they all give me the same result. It's cool, I just won't be able to play around as much as I used to porting stuff.

Mike T

---------- Post added at 01:15 AM ---------- Previous post was at 01:09 AM ----------

Weird. Try redownloading the ROM you're trying to extract?

Just curious, you guys aren't changing the file extension to something other than .dat, right?

Mike T
 

Top Liked Posts

  • There are no posts matching your filters.
  • 325
    Introduction
    You probably know already that starting from Android 5.x (Lollipop) compiled roms (aosp,cm,stock) are not compressed anymore the way they used to be on previous android versions. On previous versions all content inside /system folder that has to be extracted within our device was either uncompressed (simple /system folder inside our flashable zip) or compressed in a system.img file, which it is a ext4 compressed file; both of these, anyway, were readable and we could see all system files (app,framework, etc).
    The problem comes in >=5.0 versions, this method is not used anymore. Why? Because roms started to be always larger, so it is necessary to compress them even more.


    What does new Android zips (full roms, but also otas) contain?
    New Android flashable zips are made this way:
    boot.img (kernel)
    file_contexts (selinux related)
    META-INF (folder containing scripts)
    system.new.dat (compressed /system partition)
    system.patch.dat (for OTAs)
    system.transfer.list (see explanation below)​


    What does updater-script contains then?
    The updater-script uses a brand new function: block_image_update(), this method basically decompresses necessary files inside the device. Let's study it.
    From google git source code, if we go inside the new file /bootable/recovery/updater/blockimg.c, we find at the end of it the registration of the function block_image_update() as the method BlockImageUpdateFn() which starts at line 254. Here finally we find all information we need to know about the decompression of the .dat file(s). First file we analyze is system.transfer.list which Google tells us:

    The transfer list is a text file containing commands to transfer data from one place to another on the target partition.


    But what each line means?:
    First line is the version number of the transfer list; 1 for android 5.0.x, 2 for android 5.1.x, 3 for android 6.0.x, 4 for android 7.x/8.x
    Second line is the total number of blocks being written
    Third line is how many stash entries are needed simultaneously (only on versions >= 2)
    Fourth line is the maximum number of blocks that will be stashed simultaneously (only on versions >= 2)
    Fifth line and subsequent lines are all individual transfer commands.


    Ok, but how to decompress the system.new.dat file?
    All instructions are below. sdat2img, rimg2sdat and img2sdat binaries are involved. Please read carefully step by step.


    NOTE for OTAs
    If you are looking on decompressing system.patch.dat file or .p files, therefore reproduce the patching system on your PC, check imgpatchtools out by @erfanoabdi.


    You can use/modify these files and/or include them in your work as long as proper credits and a link to this thread are given.

    If you have questions or problems write here ;)


    Are you building from source and want to revert to the old flashing method without DAT files?
    Do this (thx @Elluel):
    1 - Delete this line
    2 - Make sure you have this commit


    Thanks
    - howellzhu & luxi78 - for initial source codes
    - all contributors from github
    140
    Ubuntu

    Ubuntu 64-bit - Guide

    Step 1 - Decompressing = DAT (sparse data) -> EXT4 (raw image)

    We're now using sdat2img binary, the usage is very simple (make sure you have python 2.7+ installed):
    ./sdat2img.py <transfer_list> <system_new_file> [system_img]​
    - <transfer_list> = input, system.transfer.list from rom zip
    - <system_new_file> = input, system.new.dat from rom zip
    - [system_img] = output ext4 raw image file

    and a quick example:
    ./sdat2img.py system.transfer.list system.new.dat system.img​
    by running this command you will get as output the file my_new_system.img which is the raw ext4 image.


    Step 2 - Decompress EXT4 (raw image) -> OUTPUT folder -> Compress EXT4 (raw image)

    Now we need to mount or ext4 raw image into an output folder so we can see apks/jars etc.
    To do this we need to type this command:
    sudo mount -t ext4 -o loop system.img output/​
    As you can see there is a new folder called output which we can edit/modify/delete your files (not able to? see here)

    Now we need to compress it back to a raw ext4 image, to do this we need the make_ext4fs binary. Make sure you have the file_contexts file (taken from the Rom zip) inside the make_ext4fs path. Then type this (got issues? see here)
    ./make_ext4fs -T 0 -S file_contexts -l 1073741824 -a system system_new.img output/​
    You will get the new raw ext4 image called 'system_new.img' ready for the next step.

    Step 3 - Converting = EXT4 (raw image) -> IMG (sparse image)

    Now we need to convert the ext4 raw image into a sparse image. For this you need img2simg binary you can find here (thx to @A.S._id).
    The usage is simple:
    img2simg <raw_image_file> <sparse_image_file>​
    Pretty self-explanatory, the output will be a new sparse image (.img).


    Step 4 - Converting = IMG (sparse image) -> DAT (sparse data)

    Now we need the img2sdat binary, the usage is very simple (make sure you have python 2.7+ installed):
    ./img2sdat.py <system_img>​
    - <system_img> = name of input sparse image file (from step 3)

    As you can see the output is composed by system.transfer.list, (system.patch.dat) & system.new.dat, ready to be replaced inside your Rom zip.


    DOWNLOADs
    sdat2img.py
    - github.com
    make_ext4fs
    - mega.co.nz
    img2sdat.py
    - github.com
    126
    Guys, gathered a simple script, converts and extracts. In Russian and English languages. The main task of Extractor is only to unpack, without installing additional software on the PC. Only Windows 64\32bit ;)
    Follow the instructions...
    View attachment 4388717
    Update script v3.6 - Updated sdat2img (DATE: 2018-10-27 10:33:21 CEST)
    Update script v3.5 - Fix 3 settings item
    Update script v3.4 - Fix 10 settings item
    Update script v3.3 - Updated sdat2img (DATE: 2018-05-25 12:19:12 CEST)
    Update script v3.3 - Updated sdat2img (DATE: 2018-05-25 12:19:12 CEST)
    Update script v3.2 - Add supported vendor.new.dat.br
    Update script v3.1 - Repack sdat2img - https://www.virustotal.com/#/file/5...64c133a65233d7df5effc92fa8dd33f578b/detection
    Update script v3.0 - Add convert
    Update script v2.9 - Add support "system.new.dat.br"
    Update script v2.8 - Fixed compatibility with Windows 32bit
    Update script v2.7 - Updated sdat2img (DATE: 2017-08-25 16:20:11 CST)\add support Android 7.0-8.0
    Update script v2.6 - Updated sdat2img (DATE: 2016-11-23 16:20:11 CST)
    Update script v2.5 - Updated sdat2img (DATE: 2016-09-22 17:44:06 CST)
    Update script v2.4 - Updated sdat2img in latest github source
    Update script v2.2 - Updated sdat2img
    Update script v2.1 - Remove the extra folders, corrected description. add system.img.ext4
    Update script v2.0 - add support Android 6.0
    Update script v1.7 - fix select items
    Update script v1.6 - add system.img, recovery.img, boot.img
    98
    Windows

    Windows 32/64 bit - Guide

    Step 1 - Decompressing = DAT (sparse data) -> EXT4 (raw image)

    We're now using sdat2img.py binary, the usage is very simple (make sure you have python 3.x installed):
    sdat2img.py <transfer_list> <system_new_file> <system_ext4>​
    - <transfer_list> = input, system.transfer.list from rom zip
    - <system_new_file> = input, system.new.dat from rom zip
    - <system_ext4> = output ext4 raw image file

    and a quick example:
    sdat2img.py system.transfer.list system.new.dat system.img​
    by running this command you will get as output the file my_new_system.img which is the raw ext4 image.


    Step 2 - Decompress EXT4 (raw image) -> OUTPUT folder -> Compress EXT4 (raw image)

    Now you should either move to Ubuntu x64/x86 or follow the 2nd step from the Ubuntu guide on cygwin 32 bit.

    Step 3 - Converting = EXT4 (raw image) -> IMG (sparse image)

    Now we need to convert the ext4 raw image into a sparse image. For this you need img2simg binary you can find here (thx to @A.S._id).
    The usage is simple:
    img2simg.exe <raw_image_file> <sparse_image_file>​
    Pretty self-explanatory, the output will be a new sparse image (.img).


    Step 4 - Converting = IMG (sparse image) -> DAT (sparse data)

    Now we need the img2sdat binary, the usage is very simple (make sure you have python 2.7+ installed):
    img2sdat.py <system_img>​
    - <system_img> = name of input sparse image file (from step 3)

    As you can see the output is composed by system.transfer.list, (system.patch.dat) & system.new.dat, ready to be replaced inside your Rom zip.


    DOWNLOADs
    sdat2img.py
    - github.com
    make_ext4fs
    - mega.co.nz
    img2sdat.py
    - github.com