Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
binwalk
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-depend
binwalk
Commits
a7a10e24
Commit
a7a10e24
authored
9 years ago
by
Craig Heffner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added hilink plugin and added hilink signature.
parent
9170015f
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
96 additions
and
0 deletions
+96
-0
firmware
src/binwalk/magic/firmware
+4
-0
hilink.py
src/binwalk/plugins/hilink.py
+92
-0
No files found.
src/binwalk/magic/firmware
View file @
a7a10e24
...
...
@@ -67,6 +67,10 @@
>31 byte 3 compression type: lzma,
>32 string x image name: "%s"
# Hilink encrypts thier firmware with a fixed DES key, so the uImage magic
# bytes are encrypted to the same values every time.
0 ubelong 0xEC1C7558 Encrypted Hilink uImage firmware header
#IMG0 header, found in VxWorks-based Mercury router firmware
0 string IMG0 IMG0 (VxWorks) header,
>4 belong <1 {invalid}
...
...
This diff is collapsed.
Click to expand it.
src/binwalk/plugins/hilink.py
0 → 100644
View file @
a7a10e24
#!/usr/bin/env python
import
struct
import
string
import
binwalk.core.plugin
import
binwalk.core.compat
import
binwalk.core.common
try
:
# Requires the pycrypto library
from
Crypto.Cipher
import
DES
except
ImportError
as
e
:
DES
=
None
class
HilinkDecryptor
(
binwalk
.
core
.
plugin
.
Plugin
):
'''
Plugin to decrypt, validate, and extract Hilink encrypted firmware.
'''
MODULES
=
[
"Signature"
]
DES_KEY
=
"H@L9K*(3"
SIGNATURE_DESCRIPTION
=
"Encrypted Hilink uImage firmware"
.
lower
()
def
init
(
self
):
if
DES
is
None
:
self
.
enabled
=
False
else
:
self
.
enabled
=
True
if
self
.
enabled
is
True
and
self
.
module
.
extractor
.
enabled
is
True
:
# Add an extraction rule for encrypted Hilink firmware signature results
self
.
module
.
extractor
.
add_rule
(
regex
=
"^
%
s"
%
self
.
SIGNATURE_DESCRIPTION
,
extension
=
"enc"
,
cmd
=
self
.
_decrypt_and_extract
)
def
_decrypt_and_extract
(
self
,
fname
):
'''
This does the extraction (e.g., it decrypts the image and writes it to a new file on disk).
'''
with
open
(
fname
,
"r"
)
as
fp_in
:
encrypted_data
=
fp_in
.
read
()
decrypted_data
=
self
.
_hilink_decrypt
(
encrypted_data
)
with
open
(
binwalk
.
core
.
common
.
unique_file_name
(
fname
[:
-
4
],
"dec"
),
"w"
)
as
fp_out
:
fp_out
.
write
(
decrypted_data
)
def
_hilink_decrypt
(
self
,
encrypted_firmware
):
'''
This does the actual decryption.
'''
cipher
=
DES
.
new
(
self
.
DES_KEY
,
DES
.
MODE_ECB
)
p1
=
encrypted_firmware
[
0
:
3
]
p2
=
encrypted_firmware
[
3
:]
p2
+=
b
"
\x00
"
*
(
8
-
(
len
(
p2
)
%
8
))
d1
=
p1
+
cipher
.
decrypt
(
p2
)
d1
+=
b
"
\x00
"
*
(
8
-
(
len
(
d1
)
%
8
))
return
cipher
.
decrypt
(
d1
)
def
scan
(
self
,
result
):
'''
Validate signature results.
'''
if
self
.
enabled
is
True
:
if
result
.
valid
is
True
:
if
result
.
description
.
lower
()
.
startswith
(
self
.
SIGNATURE_DESCRIPTION
)
is
True
:
# Read in the first 64 bytes of the suspected encrypted uImage header
fd
=
self
.
module
.
config
.
open_file
(
result
.
file
.
name
,
offset
=
result
.
offset
)
encrypted_header_data
=
binwalk
.
core
.
compat
.
str2bytes
(
fd
.
read
(
64
))
fd
.
close
()
# Decrypt the header
decrypted_header_data
=
self
.
_hilink_decrypt
(
encrypted_header_data
)
# Pull out the image size and image name fields from the decrypted uImage header
# and add them to the printed description.
result
.
size
=
struct
.
unpack
(
b
">L"
,
decrypted_header_data
[
12
:
16
])[
0
]
result
.
description
+=
", size:
%
d"
%
(
result
.
size
)
# NOTE: The description field should be 32 bytes? Hilink seems to use only 24 bytes for this field,
# even though the header size is still 64 bytes?
result
.
description
+=
', image name: "
%
s"'
%
binwalk
.
core
.
compat
.
bytes2str
(
decrypted_header_data
[
32
:
56
])
.
strip
(
"
\x00
"
)
# Do some basic validation on the decrypted size and image name fields
if
result
.
size
>
(
result
.
file
.
size
-
result
.
offset
):
result
.
valid
=
False
if
not
all
(
c
in
string
.
printable
for
c
in
result
.
description
):
result
.
valid
=
False
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment