Difference between revisions of "ECID"

From The iPhone Wiki
Jump to: navigation, search
(Added lots of ways to get ECID that are less intrusive than DFU/Recovery Mode; Added implementation example of AMDeviceCopyValue.)
Line 1: Line 1:
 
The '''ECID''' (possibly standing for '''E'''xclusive '''C'''hip '''ID''' or '''E'''lectronic '''C'''hip '''ID''') is an identifier unique to every unit.
 
The '''ECID''' (possibly standing for '''E'''xclusive '''C'''hip '''ID''' or '''E'''lectronic '''C'''hip '''ID''') is an identifier unique to every unit.
   
ECID looks like this: <tt>00000XXXXXXXXXXX</tt> (hex)
+
It is 64 bits wide, with the first ~20 bits usually set to zero (looks like <tt>00000XXXXXXXXXXX</tt> in hex).
   
  +
It holds a key position in the [[SHSH Protocol]], being the element that limits each [[APTicket]] to a single specific device.
Please be aware that some tools display the ECID in decimal format.
 
   
  +
'''Note''': Some tools show it in decimal format while others do it in hexadecimal.
The ECID is a very important element in the [[SHSH Protocol]]
 
  +
  +
== Getting the ECID ==
  +
  +
===Via third-party software===
  +
  +
====On-device====
  +
  +
The [http://cydia.saurik.com/package/com.malcolmhall.udidcalculator/ UDID Calculator] application from Cydia displays (among other things) the ECID of your device (shown in '''decimal''').
  +
  +
====Via USB====
  +
  +
* Install [https://github.com/libimobiledevice/libimobiledevice libimobiledevice].
  +
* Connect your device over USB.
  +
* Run <code>ideviceinfo | grep UniqueChipID</code> command.
  +
* There should be exactly one line, reading <code>UniqueChipID</code> followed by your ECID (in '''decimal''').
  +
  +
===Via [[Recovery Mode]] or [[DFU Mode]]===
  +
  +
====Mac Instructions====
   
== Get your ECID ==
 
===Mac Instructions===
 
 
*Put your device in [[Recovery Mode]] or [[DFU Mode]].
 
*Put your device in [[Recovery Mode]] or [[DFU Mode]].
*Open System Profiler. (in /Applications/Utilities/)
+
*Open System Profiler. (in /Applications/Utilities/).
*In the sidebar, go to "USB" (in the "Hardware" section)
+
*In the sidebar, go to "USB" (in the "Hardware" section).
 
*Under "Serial Number", there should be a part called "ECID". There you go.
 
*Under "Serial Number", there should be a part called "ECID". There you go.
   
===Windows Instructions===
+
====Windows Instructions====
  +
 
* Put your device in [[Recovery Mode]] or [[DFU Mode]].
 
* Put your device in [[Recovery Mode]] or [[DFU Mode]].
* Open Device Manager and right click on Apple Mobile Device (Recovery or DFU Mode) for properties
+
* Open Device Manager and right click on Apple Mobile Device (Recovery or DFU Mode) for properties.
* Click on the details tab
+
* Click on the details tab.
* Click on the dropdown box and select Device Instance Path
+
* Click on the dropdown box and select Device Instance Path.
* You should find it in the textbox
+
* You should find it in the textbox.
   
===Developer Instructions===
+
===Extracting from an SHSH===
Call the AMDeviceCopyValue function in the [[MobileDevice Library|MobileDevice Framework]] with the "UniqueChipID" value. It returns the ECID as a CFNumber(kCFNumberSInt64Type) object.
 
   
  +
====Img3====
=== Extract your ECID from an shsh ===
 
There are 19 blobs in an shsh,and the first line of every blob is the same as below:
 
   
  +
There are 19 blobs in an SHSH, and the first line of every blob is the same as below:
RElDRUAAAAAIAAAA********AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 
  +
  +
<code>RElDRUAAAAAIAAAA********AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</code>
   
 
The * part is the ECID(Dec) encrypted by a certain formula which is
 
The * part is the ECID(Dec) encrypted by a certain formula which is
Line 40: Line 58:
   
 
Use this formula backward (d. to a.) we can extract the * part into ECID(Dec).
 
Use this formula backward (d. to a.) we can extract the * part into ECID(Dec).
  +
  +
====Img4====
  +
  +
First, get your apticket.der. There are two options:
  +
* Copy it from your device in <code>/System/Library/Caches/apticket.der</code>.
  +
* Extract it from an SHSH file, e.g. using <code>plutil -extract ApImg4Ticket xml1 -o - *.shsh | xmllint -xpath '/plist/data/text()' - | base64 -D > apticket.der;</code>.
  +
  +
Now you can use any old ASN.1 parser to display the file, such as <code>openssl asn1parse -i -inform DER -in apticket.der</code>.
  +
To get only the ECID part, use <code>openssl asn1parse -inform DER -in apticket.der | grep -A1 ECID</code>. It should show on the second line after the colon (in '''hexadecimal''', possibly with a leading zero).
  +
  +
===Developer Instructions===
  +
  +
On OSX, call <code>AMDeviceCopyValue</code> in the [[MobileDevice Library|MobileDevice Framework]] with "UniqueChipID". It returns the ECID as a <code>CFNumberRef(kCFNumberSInt64Type)</code> object.
  +
  +
Example implementation (all safeties removed, will probably crash if connection fails), compile with <code>clang -F/System/Library/PrivateFrameworks -framework MobileDevice -framework CoreFoundation</code>:
  +
  +
<pre>
  +
#include <stdint.h>
  +
#include <stdio.h>
  +
#include <stdlib.h>
  +
#include <CoreFoundation/CoreFoundation.h>
  +
  +
// Cheap aliases to make things compile without headers
  +
typedef void am_device;
  +
typedef void am_device_notification;
  +
typedef void* am_device_notification_callback_info;
  +
extern void AMDeviceNotificationSubscribe(void(*callback)(am_device_notification_callback_info *info, void *arg), int unused1, int unused2, void *unknown, am_device_notification** notification);
  +
extern void AMDeviceConnect(am_device *device);
  +
extern void AMDeviceStartSession(am_device *device);
  +
extern void* AMDeviceCopyValue(am_device *device, int unknown, CFStringRef value);
  +
  +
void cb(am_device_notification_callback_info *info, void *arg)
  +
{
  +
uint64_t ecid;
  +
am_device *dev = *info; /* info->dev */
  +
CFRetain(dev);
  +
AMDeviceConnect(dev);
  +
AMDeviceStartSession(dev);
  +
  +
CFNumberRef ecidRef = AMDeviceCopyValue(dev, 0, CFSTR("UniqueChipID"));
  +
CFNumberGetValue(ecidRef, kCFNumberSInt64Type, &ecid);
  +
printf("ECID: %llX\n", ecid);
  +
  +
CFRelease(dev);
  +
exit(0);
  +
}
  +
  +
int main()
  +
{
  +
uint32_t buf[5];
  +
am_device_notification *notification = (am_device_notification*)buf;
  +
AMDeviceNotificationSubscribe(&cb, 0, 0, NULL, &notification);
  +
CFRunLoopRun();
  +
return 0;
  +
}
  +
</pre>

Revision as of 03:30, 4 August 2016

The ECID (possibly standing for Exclusive Chip ID or Electronic Chip ID) is an identifier unique to every unit.

It is 64 bits wide, with the first ~20 bits usually set to zero (looks like 00000XXXXXXXXXXX in hex).

It holds a key position in the SHSH Protocol, being the element that limits each APTicket to a single specific device.

Note: Some tools show it in decimal format while others do it in hexadecimal.

Getting the ECID

Via third-party software

On-device

The UDID Calculator application from Cydia displays (among other things) the ECID of your device (shown in decimal).

Via USB

  • Install libimobiledevice.
  • Connect your device over USB.
  • Run ideviceinfo | grep UniqueChipID command.
  • There should be exactly one line, reading UniqueChipID followed by your ECID (in decimal).

Via Recovery Mode or DFU Mode

Mac Instructions

  • Put your device in Recovery Mode or DFU Mode.
  • Open System Profiler. (in /Applications/Utilities/).
  • In the sidebar, go to "USB" (in the "Hardware" section).
  • Under "Serial Number", there should be a part called "ECID". There you go.

Windows Instructions

  • Put your device in Recovery Mode or DFU Mode.
  • Open Device Manager and right click on Apple Mobile Device (Recovery or DFU Mode) for properties.
  • Click on the details tab.
  • Click on the dropdown box and select Device Instance Path.
  • You should find it in the textbox.

Extracting from an SHSH

Img3

There are 19 blobs in an SHSH, and the first line of every blob is the same as below:

RElDRUAAAAAIAAAA********AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

The * part is the ECID(Dec) encrypted by a certain formula which is

a.Transform ECID(Dec) into ECID(Hex) such as 58608372174291 ---> 35 4D D3 34 4D D3

b.Reverse the ECID(Hex) string such as 35 4D D3 34 4D D3 ---> D3 4D 34 D3 4D 35

c.Transform the string we have got into binary such as D3 4D 34 D3 4D 35 ---> ÓM4ÓM5

d.Encode the binary with base64 such as ÓM4ÓM5 ---> 00000001

Use this formula backward (d. to a.) we can extract the * part into ECID(Dec).

Img4

First, get your apticket.der. There are two options:

  • Copy it from your device in /System/Library/Caches/apticket.der.
  • Extract it from an SHSH file, e.g. using plutil -extract ApImg4Ticket xml1 -o - *.shsh | xmllint -xpath '/plist/data/text()' - | base64 -D > apticket.der;.

Now you can use any old ASN.1 parser to display the file, such as openssl asn1parse -i -inform DER -in apticket.der. To get only the ECID part, use openssl asn1parse -inform DER -in apticket.der | grep -A1 ECID. It should show on the second line after the colon (in hexadecimal, possibly with a leading zero).

Developer Instructions

On OSX, call AMDeviceCopyValue in the MobileDevice Framework with "UniqueChipID". It returns the ECID as a CFNumberRef(kCFNumberSInt64Type) object.

Example implementation (all safeties removed, will probably crash if connection fails), compile with clang -F/System/Library/PrivateFrameworks -framework MobileDevice -framework CoreFoundation:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <CoreFoundation/CoreFoundation.h>

// Cheap aliases to make things compile without headers
typedef void am_device;
typedef void am_device_notification;
typedef void* am_device_notification_callback_info;
extern void AMDeviceNotificationSubscribe(void(*callback)(am_device_notification_callback_info *info, void *arg), int unused1, int unused2, void *unknown, am_device_notification** notification);
extern void AMDeviceConnect(am_device *device);
extern void AMDeviceStartSession(am_device *device);
extern void* AMDeviceCopyValue(am_device *device, int unknown, CFStringRef value);

void cb(am_device_notification_callback_info *info, void *arg)
{
    uint64_t ecid;
    am_device *dev = *info; /* info->dev */
    CFRetain(dev);
    AMDeviceConnect(dev);
    AMDeviceStartSession(dev);

    CFNumberRef ecidRef = AMDeviceCopyValue(dev, 0, CFSTR("UniqueChipID"));
    CFNumberGetValue(ecidRef, kCFNumberSInt64Type, &ecid);
    printf("ECID: %llX\n", ecid);

    CFRelease(dev);
    exit(0);
}

int main()
{
    uint32_t buf[5];
    am_device_notification *notification = (am_device_notification*)buf;
    AMDeviceNotificationSubscribe(&cb, 0, 0, NULL, &notification);
    CFRunLoopRun();
    return 0;
}