Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Script still fails after attribute list step #79

Closed
norristh opened this issue Jan 12, 2021 · 9 comments
Closed

Script still fails after attribute list step #79

norristh opened this issue Jan 12, 2021 · 9 comments
Labels

Comments

@norristh
Copy link

Thanks for fixing #78 !

However, now the script version 1.1.3 fails with:

INFO:root:Finding partition geometry
INFO:root:Finalizing MFT reconstruction of partition at offset 0
INFO:root:Adding extra attributes from $ATTRIBUTE_LIST
Traceback (most recent call last):
  File "main.py", line 374, in <module>
    main()
  File "main.py", line 357, in main
    parts.update(scanner.get_partitions())
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 836, in get_partitions
    self.finalize_reconstruction(part)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 672, in finalize_reconstruction
    self.add_from_attribute_list(parsed, part, node.offset)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 627, in add_from_attribute_list
    _integrate_attribute_list(parsed, part, image)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 248, in _integrate_attribute_list
    child_parsed = parse_file_record(dump)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 139, in parse_file_record
    if (header['size_alloc'] > len(entry) or
TypeError: '>' not supported between instances of 'NoneType' and 'int'
@Lazza Lazza closed this as completed in 67f5bf0 Jan 12, 2021
@Lazza Lazza added the bug label Jan 12, 2021
@Lazza
Copy link
Owner

Lazza commented Jan 12, 2021

Thank you for reporting this issue.

OK, this is a bit weird. It seems there is a file record which is not complete (truncated).

This should almost never occur (in fact, this is the first time it does). Anyhow I added an extra check. Could you please try with the latest code?

Thank you.

@norristh
Copy link
Author

Now it fails with:

INFO:root:Adding extra attributes from $ATTRIBUTE_LIST
Traceback (most recent call last):
  File "main.py", line 374, in <module>
    main()
  File "main.py", line 357, in main
    parts.update(scanner.get_partitions())
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 837, in get_partitions
    self.finalize_reconstruction(part)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 671, in finalize_reconstruction
    for node in many_attributes_it:
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 666, in <genexpr>
    node for node in part.files.values()
RuntimeError: dictionary changed size during iteration

@Lazza
Copy link
Owner

Lazza commented Jan 13, 2021

Could you please try to change this line:

node for node in part.files.values()

To this one?

node for node in iter(part.files.values())

Please note that it occurs twice in ntfs.py.

Thank you.

@norristh
Copy link
Author

Same failure:

INFO:root:Finding partition geometry
INFO:root:Finalizing MFT reconstruction of partition at offset 0
INFO:root:Adding extra attributes from $ATTRIBUTE_LIST
Traceback (most recent call last):
  File "main.py", line 374, in <module>
    main()
  File "main.py", line 357, in main
    parts.update(scanner.get_partitions())
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 837, in get_partitions
    self.finalize_reconstruction(part)
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 671, in finalize_reconstruction
    for node in many_attributes_it:
  File "/root/RecuperaBit/recuperabit/fs/ntfs.py", line 666, in <genexpr>
    node for node in iter(part.files.values())
RuntimeError: dictionary changed size during iteration

@Lazza
Copy link
Owner

Lazza commented Jan 13, 2021

Can you try like this?

node for node in list(part.files.values())

@Lazza Lazza reopened this Jan 13, 2021
@norristh
Copy link
Author

norristh commented Jan 14, 2021

Progress! It completed indexing. Running "recoverable" printed almost 3300 entries, but almost all with no size given, and the number of files as 16 or 32 or other low multiples of 8. I don't know whether that's normal. Partition # 23 showed with nearly the full size of the hard drive, and more than 100,000 files.

Running "restore 23 5" recovered many files, yay! It worked through the \Users directories. I don't think it restored all the files which were originally on the hard drive. Again, I don't know whether that's normal. (Any tips to possibly recover more files from \Users ?)

The script did eventually fail again with:

INFO:root:Restoring #35925 Root/Windows/System32/config/COMPONENTS
INFO:root:Restoring #36618 Root/Windows/System32/config/DEFAULT
INFO:root:Restoring #47412 Root/Windows/System32/config/DRIVERS
WARNING:root:Missing part for File(#47412, ^^3113^^, DRIVERS, offset = 6386280 sectors), 2124 clusters skipped
Traceback (most recent call last):
  File "main.py", line 374, in <module>
    main()
  File "main.py", line 371, in main
    interpret(cmd, arguments, parts, shorthands, args.outputdir)
  File "main.py", line 181, in interpret
    logic.recursive_restore(myfile, part, partition_dir)
  File "/root/RecuperaBit/recuperabit/logic.py", line 259, in recursive_restore
    recursive_restore(child, part, outputdir, make_dirs=False)
  File "/root/RecuperaBit/recuperabit/logic.py", line 259, in recursive_restore
    recursive_restore(child, part, outputdir, make_dirs=False)
  File "/root/RecuperaBit/recuperabit/logic.py", line 259, in recursive_restore
    recursive_restore(child, part, outputdir, make_dirs=False)
  [Previous line repeated 1 more time]
  File "/root/RecuperaBit/recuperabit/logic.py", line 246, in recursive_restore
    outfile.write(piece)
TypeError: a bytes-like object is required, not str

I don't care about any files other than in \Users, but if you want me to test anything else to debug that crash, or send the list of >100 partitions if that's unusual behavior, I'm happy to do so. (Though I'm doing this recovery for a friend on a large external HD of hers, so will only have the image file to test with for a few more days.)

For background info: I used ddrescue to 99.99% image a hard drive which no longer booted or mounted due to read errors in early sectors. I'm running recuperabit on the image.

And thank you for such a useful tool, and for your quick responses here! I greatly appreciate it.

@Lazza
Copy link
Owner

Lazza commented Jan 14, 2021

@norristh thank you very much for your feedback, it is very helpful!

Running "recoverable" printed almost 3300 entries, but almost all with no size given, and the number of files as 16 or 32 or other low multiples of 8. I don't know whether that's normal.

This is due to heavy disk fragmentation. The more a drive is used, the more it happens. RecuperaBit does not attempt to blindly merge partitions, thus sometimes many different partitions are detected.

(Any tips to possibly recover more files from \Users ?)

Possibly they could be in the LostFiles tree (-1 instead of 5) or in a different one. You should mainly check those with the same starting offset.

TypeError: a bytes-like object is required, not str

Ouch. This is left from the migration to Python 3. It seems the smaller sample NTFS on which I tested it did not reach this part of the code. It should be fixed now.

but if you want me to test anything else to debug that crash [...] I'm happy to do so

Thank you. It would be great if you could try the latest commit.

Though I'm doing this recovery for a friend

Please be aware that if there are compressed files, those will not be recovered. I mean NTFS-compressed files, not archives. RecuperaBit does print a warning in this case though.

@norristh
Copy link
Author

Success all around! The restore completed with all seven partitions I tried, both Root and LostFiles for each. And by restoring from all partitions with more than 20,000 files, between Root and LostFiles I may have restored all the files my friend was worried about.

Thank you again for working on and sharing this tool!

@Lazza
Copy link
Owner

Lazza commented Jan 16, 2021

I am glad it worked for you. 😊 Yesterday I had a very bad day and this news is cheering me up a bit.

Per the testing you performed, I can now tag a new release on GitHub with all these fixes. Thanks!

@Lazza Lazza closed this as completed Jan 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants