<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pumpkin</id>
	<title>The iPhone Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pumpkin"/>
	<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/wiki/Special:Contributions/Pumpkin"/>
	<updated>2026-05-19T23:27:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=IPhone_Dev_Team&amp;diff=9777</id>
		<title>IPhone Dev Team</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=IPhone_Dev_Team&amp;diff=9777"/>
		<updated>2010-09-30T23:27:29Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: update member list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:iPhone Dev Team}}&lt;br /&gt;
==Blog==&lt;br /&gt;
[http://blog.iphone-dev.org Dev Team blog]&lt;br /&gt;
&lt;br /&gt;
==Current members== &lt;br /&gt;
* [[bgm]]&lt;br /&gt;
* [[bugout]]&lt;br /&gt;
* [[User:Bushing|bushing]]&lt;br /&gt;
* [[c1de0x]]&lt;br /&gt;
* [[chris]]&lt;br /&gt;
* [[User:Comex|comex]]&lt;br /&gt;
* [[CPICH]]&lt;br /&gt;
* [[ghost_000]]&lt;br /&gt;
* [[gray]]&lt;br /&gt;
* [[iZsh]]&lt;br /&gt;
* [[marcan]]&lt;br /&gt;
* [[User:MuscleNerd|MuscleNerd]]&lt;br /&gt;
* [[User:Planetbeing|planetbeing]]&lt;br /&gt;
* [[pumpkin]]&lt;br /&gt;
* [[pytey]]&lt;br /&gt;
* [[roxfan]]&lt;br /&gt;
* [[saurik]]&lt;br /&gt;
* [[Turbo]]&lt;br /&gt;
* [[w___]]&lt;br /&gt;
* [[wizdaz]]&lt;br /&gt;
* [[Zf]]&lt;br /&gt;
&lt;br /&gt;
==Previous Members==&lt;br /&gt;
* [[asap18]]&lt;br /&gt;
* [[dinopio]]&lt;br /&gt;
* [[Fred_]]&lt;br /&gt;
* [[jim–]]&lt;br /&gt;
* [[netkas]]&lt;br /&gt;
* [[pr3d4t0r]]&lt;br /&gt;
* [[drudge]]&lt;br /&gt;
* [[User:Geohot|geohot]]&lt;br /&gt;
* [[gj]]&lt;br /&gt;
* [[kroo]]&lt;br /&gt;
* [[Nate True]]&lt;br /&gt;
* [[User:NerveGas|NerveGas]]&lt;br /&gt;
* [[sam]]&lt;br /&gt;
* [[Whiterat]]&lt;br /&gt;
* [[User:Zibri|Zibri]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[25C3 presentation Hacking the iPhone#Introduction (by pytey)|Self introduction at the 25C3 event]]&lt;br /&gt;
* [[PwnageTool]]&lt;br /&gt;
* [[pwnage]]&lt;br /&gt;
* [[pwnage 2.0]]&lt;br /&gt;
* [[yellowsn0w]]&lt;br /&gt;
* [[redsn0w]]&lt;br /&gt;
* [[ultrasn0w]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Hackers]]&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Device_Nodes&amp;diff=1938</id>
		<title>Talk:Device Nodes</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Device_Nodes&amp;diff=1938"/>
		<updated>2008-08-28T17:22:47Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: New page: Um, on any Mac OS block device diskXsY has a character device counterpart called rdiskXsY, so rdisk0* is just a character device for accessing the flash.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um, on any Mac OS block device diskXsY has a character device counterpart called rdiskXsY, so rdisk0* is just a character device for accessing the flash.&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:GID_Key&amp;diff=1498</id>
		<title>Talk:GID Key</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:GID_Key&amp;diff=1498"/>
		<updated>2008-08-05T12:39:35Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: /* Vaumnou */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== drg ==&lt;br /&gt;
&lt;br /&gt;
Would this be vulnerable to a [http://en.wikipedia.org/wiki/Cold_boot_attack cold boot attack]?&lt;br /&gt;
&lt;br /&gt;
== geohot ==&lt;br /&gt;
&lt;br /&gt;
I really doubt the AES key is ever in memory. This is an attack against drive encryption, not hardware coprocessors. Fault analysis or timing would be our best bet.&lt;br /&gt;
&lt;br /&gt;
== Vaumnou ==&lt;br /&gt;
&lt;br /&gt;
Unless you can cause read faults by browning out the chip or the ROM is external, you can't use fault analysis.  And if the ROM is external, it would probably be easier to unsolder it and read it directly.&lt;br /&gt;
&lt;br /&gt;
== pumpkin ==&lt;br /&gt;
&lt;br /&gt;
it isn't external&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1323</id>
		<title>Talk:Research: Pwnage Patches</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1323"/>
		<updated>2008-08-03T11:11:36Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: /* seriously? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is more important, is the code before 1800587C.&lt;br /&gt;
&lt;br /&gt;
Compilers translate actions like&lt;br /&gt;
&lt;br /&gt;
:if (condition is good) &lt;br /&gt;
::then&lt;br /&gt;
&lt;br /&gt;
into conditional jumps. What you can see with the MOV and NEG is most probably the result of a failed condition (-1) (or failed function result). Afterwards it depends on the compiler, how it further treats the result.&lt;br /&gt;
&lt;br /&gt;
Maybe the original pseudo code is as follows:&lt;br /&gt;
&lt;br /&gt;
 sig_check_result = do_check(important args);&lt;br /&gt;
 ...&lt;br /&gt;
 if (sig_check_result == 0)&lt;br /&gt;
     everything goes fine ...&lt;br /&gt;
 ...&lt;br /&gt;
 a.s.o&lt;br /&gt;
&lt;br /&gt;
So the question is, why it goes to the branch where R0 is set to -1 (patch 0) and what conditional branches lead to this code position? And the even more important question is, what is the underlying pseudo code?&lt;br /&gt;
&lt;br /&gt;
And the even more important question is, why is it really necessary to do reverse engineering of reverse engineering?? Could be much more simple the questions are answered by some people that tend to mystify some things... &amp;lt;/sarcasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
said people would like to document, but most of the they're too busy using the little free time they have actually getting stuff done that people need done rather than documentation that 1% wants&lt;br /&gt;
&lt;br /&gt;
If it's really like this, then I retract my statement. But then I hope 'said people' catch up on everything... Missing documentation and rare information (policies) were the main causes of the foundation of this wiki.&lt;br /&gt;
&lt;br /&gt;
== seriously? ==&lt;br /&gt;
&lt;br /&gt;
so wait, if you don't have the time to document it, why are you getting mad that others are? some people are interested in it...is something wrong with that? if you aren't interested, you don't have to look at this page if you don't want to. Pwnage, especially Pwnage 2.0, is especially mystifying to some people. Pumpkin, I have personally asked you if I may take a look at the individual patches to understand ARM better and to see how Pwnage works, but you politely declined my offer. I mean...if I am curious about something, and I cannot find out about it via the official creators, is it a sin for me to want to find out anyway? I really don't see what the big deal is...Apple can just as easily extract and diff the files. They would especially want to do this, come to think of it. It is only the developers that might want to find out how Pwnage really works that are in the dark.&lt;br /&gt;
&lt;br /&gt;
I must say, I really like what you have done. The concept of your &amp;quot;Simple Unlock&amp;quot;, it seems, you have applied to activation, and Pwnage itself. I'm not even being sarcastic. I really think it is pretty awesome.&lt;br /&gt;
&lt;br /&gt;
Peace,&lt;br /&gt;
[[User:ChronicDev|ChronicDev]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is not about me wanting to keep this stuff secret, it's about what's efficient. I've already said that we don't have time to document them, but that we'll probably eventually get around to it. It just seems like a waste of resources to have anyone who is capable of reversing what we've done actually doing so, when there are so many other things that need looking at that the devteam could never even think of having the time to do. Why reverse something that will eventually be documented when Apple's stuff is sitting there and we all know it will never be documented? &lt;br /&gt;
--pumpkin&lt;br /&gt;
&lt;br /&gt;
I strongly disagree. Let's take the example of zero-g, this little application, which unlocks at least 2G capabilities for a couple of people. Several people asked for the source code. Including me. With the effect of not even getting an answer. Oh, no, there is an answer, which IMHO is extremely arrogant, something like ''if you know what's going on, it's not much different from lamesaft''. Oh, yeah, funny, funny. Lamesaft with size of ~400 bytes not much different to zero-g having ~1000 bytes. To go further, I would have to reverse the code of zero-g. Not that this is difficult, but I don't have the time and I am not amused about being forced doing so. To sum it up: A lot of people are pissed off of the dev team. And it is not, that there are no reasons for. And it's not, that the dev teams work would not be really cool. It's just behavior and communication, which is inappropiate and partially premature.&lt;br /&gt;
-caique2001-&lt;br /&gt;
&lt;br /&gt;
Bladox asked specifically to keep that code private. They (and we) do not wish to see more chinese crap coming out, thinking they have the ultimate solution because it worked for 2 minutes on their phone, resulting in more scams and legal risks. That network attack will be throughly documented, in due time (i.e. when it's not worth making a scam out of it any longer). And no, the previous comment wasn't really funny, it's actually very true. So rather than trying to understand how that thing works (as we stated previously, it doesn't), you should focus on other more interesting issues, such as issues that can be solved.&lt;br /&gt;
-Zf&lt;br /&gt;
&lt;br /&gt;
to caique2001:&lt;br /&gt;
we realize that from the outside it must look like we're secrecy-loving clock-and-dagger assholes basking in our own knowledge, but there really are good reasons not to release stuff. when you're working against apple, whose only goal with respect to us is to patch up any vulnerabilities that are found, documenting those vulnerabilities is just making it easier for them to fix them. we don't really care if it makes us unpopular, but it means that more people can reap the benefits of the vulnerabilities for longer. a few legitimately curious people such as yourself will not have the source code, but honestly, is it that important?&lt;br /&gt;
&lt;br /&gt;
== throwing it out there ==&lt;br /&gt;
&lt;br /&gt;
I like what Zf said. I would like to branch off one of his last statements by saying, if I am ibterested in looking into this, then why criticize me for doing so...I don't understand, no offense, but why do you criticize people and not actually correct them? for example, on URC, I was laughed at for thinking that there was a hardware method for dumping the 3G booteom. I asked them to correct me? and they &amp;quot;didn't want to contribute to geohots ego boost&amp;quot;....I mean...that is like saying that someone is stupid because they don't know where the holy grail is but you won't say where it is, except in that case you would be being arrogant&lt;br /&gt;
&lt;br /&gt;
No, that's just saying that my contributions here will be limited to drama &amp;amp; troll, because that place was biaised against the dev team from day one (see initial blog post, Constitution and subsequent revisions), so I don't see why I should feel welcome here, nor be useful. &lt;br /&gt;
- Zf&lt;br /&gt;
&lt;br /&gt;
to whomever came before this last Zf comment: we criticize because it feels like a waste of time. sure, you're welcome to do whatever you like with your time, but we're criticizing your choice of what to do with your time, as we feel it's useless to have you reverse what we reversed when we eventually plan on just writing it up. the most we can do to &amp;quot;correct&amp;quot; with that form of criticism is try to justify why we think you're wasting your time, when you could very well be doing things that are more helpful to the community. For example, everyone and their mother has been asking me for a Safari file:// url patch, but I simply haven't had the time recently. Why must it be me? Surely someone else who is spending their time reversing our hacks has the skills to patch a couple of bytes here and there to make life easier for many people? note that if you were reversing some secret hack that someone had leaked from the devteam I would feel differently, but pwnage is out and available at no cost to everyone, so the only product of your work is going to be improved understanding of our technique (a noble goal). We tend to be pragmatists, though, and as much as I'd love to be able to poke around at inane frameworks on the phone, for example, I prefer to use the little free time I have to do something generally useful to the public.&lt;br /&gt;
- pumpkin&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1319</id>
		<title>Talk:Research: Pwnage Patches</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1319"/>
		<updated>2008-08-03T11:00:33Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: /* throwing it out there */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is more important, is the code before 1800587C.&lt;br /&gt;
&lt;br /&gt;
Compilers translate actions like&lt;br /&gt;
&lt;br /&gt;
:if (condition is good) &lt;br /&gt;
::then&lt;br /&gt;
&lt;br /&gt;
into conditional jumps. What you can see with the MOV and NEG is most probably the result of a failed condition (-1) (or failed function result). Afterwards it depends on the compiler, how it further treats the result.&lt;br /&gt;
&lt;br /&gt;
Maybe the original pseudo code is as follows:&lt;br /&gt;
&lt;br /&gt;
 sig_check_result = do_check(important args);&lt;br /&gt;
 ...&lt;br /&gt;
 if (sig_check_result == 0)&lt;br /&gt;
     everything goes fine ...&lt;br /&gt;
 ...&lt;br /&gt;
 a.s.o&lt;br /&gt;
&lt;br /&gt;
So the question is, why it goes to the branch where R0 is set to -1 (patch 0) and what conditional branches lead to this code position? And the even more important question is, what is the underlying pseudo code?&lt;br /&gt;
&lt;br /&gt;
And the even more important question is, why is it really necessary to do reverse engineering of reverse engineering?? Could be much more simple the questions are answered by some people that tend to mystify some things... &amp;lt;/sarcasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
said people would like to document, but most of the they're too busy using the little free time they have actually getting stuff done that people need done rather than documentation that 1% wants&lt;br /&gt;
&lt;br /&gt;
If it's really like this, then I retract my statement. But then I hope 'said people' catch up on everything... Missing documentation and rare information (policies) were the main causes of the foundation of this wiki.&lt;br /&gt;
&lt;br /&gt;
== seriously? ==&lt;br /&gt;
&lt;br /&gt;
so wait, if you don't have the time to document it, why are you getting mad that others are? some people are interested in it...is something wrong with that? if you aren't interested, you don't have to look at this page if you don't want to. Pwnage, especially Pwnage 2.0, is especially mystifying to some people. Pumpkin, I have personally asked you if I may take a look at the individual patches to understand ARM better and to see how Pwnage works, but you politely declined my offer. I mean...if I am curious about something, and I cannot find out about it via the official creators, is it a sin for me to want to find out anyway? I really don't see what the big deal is...Apple can just as easily extract and diff the files. They would especially want to do this, come to think of it. It is only the developers that might want to find out how Pwnage really works that are in the dark.&lt;br /&gt;
&lt;br /&gt;
I must say, I really like what you have done. The concept of your &amp;quot;Simple Unlock&amp;quot;, it seems, you have applied to activation, and Pwnage itself. I'm not even being sarcastic. I really think it is pretty awesome.&lt;br /&gt;
&lt;br /&gt;
Peace,&lt;br /&gt;
[[User:ChronicDev|ChronicDev]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is not about me wanting to keep this stuff secret, it's about what's efficient. I've already said that we don't have time to document them, but that we'll probably eventually get around to it. It just seems like a waste of resources to have anyone who is capable of reversing what we've done actually doing so, when there are so many other things that need looking at that the devteam could never even think of having the time to do. Why reverse something that will eventually be documented when Apple's stuff is sitting there and we all know it will never be documented? &lt;br /&gt;
--pumpkin&lt;br /&gt;
&lt;br /&gt;
I strongly disagree. Let's take the example of zero-g, this little application, which unlocks at least 2G capabilities for a couple of people. Several people asked for the source code. Including me. With the effect of not even getting an answer. Oh, no, there is an answer, which IMHO is extremely arrogant, something like ''if you know what's going on, it's not much different from lamesaft''. Oh, yeah, funny, funny. Lamesaft with size of ~400 bytes not much different to zero-g having ~1000 bytes. To go further, I would have to reverse the code of zero-g. Not that this is difficult, but I don't have the time and I am not amused about being forced doing so. To sum it up: A lot of people are pissed off of the dev team. And it is not, that there are no reasons for. And it's not, that the dev teams work would not be really cool. It's just behavior and communication, which is inappropiate and partially premature.&lt;br /&gt;
-caique2001-&lt;br /&gt;
&lt;br /&gt;
Bladox asked specifically to keep that code private. They (and we) do not wish to see more chinese crap coming out, thinking they have the ultimate solution because it worked for 2 minutes on their phone, resulting in more scams and legal risks. That network attack will be throughly documented, in due time (i.e. when it's not worth making a scam out of it any longer). And no, the previous comment wasn't really funny, it's actually very true. So rather than trying to understand how that thing works (as we stated previously, it doesn't), you should focus on other more interesting issues, such as issues that can be solved.&lt;br /&gt;
-Zf&lt;br /&gt;
&lt;br /&gt;
== throwing it out there ==&lt;br /&gt;
&lt;br /&gt;
I like what Zf said. I would like to branch off one of his last statements by saying, if I am ibterested in looking into this, then why criticize me for doing so...I don't understand, no offense, but why do you criticize people and not actually correct them? for example, on URC, I was laughed at for thinking that there was a hardware method for dumping the 3G booteom. I asked them to correct me? and they &amp;quot;didn't want to contribute to geohots ego boost&amp;quot;....I mean...that is like saying that someone is stupid because they don't know where the holy grail is but you won't say where it is, except in that case you would be being arrogant&lt;br /&gt;
&lt;br /&gt;
No, that's just saying that my contributions here will be limited to drama &amp;amp; troll, because that place was biaised against the dev team from day one (see initial blog post, Constitution and subsequent revisions), so I don't see why I should feel welcome here, nor be useful. &lt;br /&gt;
- Zf&lt;br /&gt;
&lt;br /&gt;
to whomever came before this last Zf comment: we criticize because it feels like a waste of time. sure, you're welcome to do whatever you like with your time, but we're criticizing your choice of what to do with your time, as we feel it's useless to have you reverse what we reversed when we eventually plan on just writing it up. the most we can do to &amp;quot;correct&amp;quot; with that form of criticism is try to justify why we think you're wasting your time, when you could very well be doing things that are more helpful to the community. For example, everyone and their mother has been asking me for a Safari file:// url patch, but I simply haven't had the time recently. Why must it be me? Surely someone else who is spending their time reversing our hacks has the skills to patch a couple of bytes here and there to make life easier for many people? note that if you were reversing some secret hack that someone had leaked from the devteam I would feel differently, but pwnage is out and available at no cost to everyone, so the only product of your work is going to be improved understanding of our technique (a noble goal). We tend to be pragmatists, though, and as much as I'd love to be able to poke around at inane frameworks on the phone, for example, I prefer to use the little free time I have to do something generally useful to the public.&lt;br /&gt;
- pumpkin&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1304</id>
		<title>Talk:Research: Pwnage Patches</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1304"/>
		<updated>2008-08-03T09:46:29Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: /* seriously? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is more important, is the code before 1800587C.&lt;br /&gt;
&lt;br /&gt;
Compilers translate actions like&lt;br /&gt;
&lt;br /&gt;
:if (condition is good) &lt;br /&gt;
::then&lt;br /&gt;
&lt;br /&gt;
into conditional jumps. What you can see with the MOV and NEG is most probably the result of a failed condition (-1) (or failed function result). Afterwards it depends on the compiler, how it further treats the result.&lt;br /&gt;
&lt;br /&gt;
Maybe the original pseudo code is as follows:&lt;br /&gt;
&lt;br /&gt;
 sig_check_result = do_check(important args);&lt;br /&gt;
 ...&lt;br /&gt;
 if (sig_check_result == 0)&lt;br /&gt;
     everything goes fine ...&lt;br /&gt;
 ...&lt;br /&gt;
 a.s.o&lt;br /&gt;
&lt;br /&gt;
So the question is, why it goes to the branch where R0 is set to -1 (patch 0) and what conditional branches lead to this code position? And the even more important question is, what is the underlying pseudo code?&lt;br /&gt;
&lt;br /&gt;
And the even more important question is, why is it really necessary to do reverse engineering of reverse engineering?? Could be much more simple the questions are answered by some people that tend to mystify some things... &amp;lt;/sarcasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
said people would like to document, but most of the they're too busy using the little free time they have actually getting stuff done that people need done rather than documentation that 1% wants&lt;br /&gt;
&lt;br /&gt;
If it's really like this, then I retract my statement. But then I hope 'said people' catch up on everything... Missing documentation and rare information (policies) were the main causes of the foundation of this wiki.&lt;br /&gt;
&lt;br /&gt;
== seriously? ==&lt;br /&gt;
&lt;br /&gt;
so wait, if you don't have the time to document it, why are you getting mad that others are? some people are interested in it...is something wrong with that? if you aren't interested, you don't have to look at this page if you don't want to. Pwnage, especially Pwnage 2.0, is especially mystifying to some people. Pumpkin, I have personally asked you if I may take a look at the individual patches to understand ARM better and to see how Pwnage works, but you politely declined my offer. I mean...if I am curious about something, and I cannot find out about it via the official creators, is it a sin for me to want to find out anyway? I really don't see what the big deal is...Apple can just as easily extract and diff the files. They would especially want to do this, come to think of it. It is only the developers that might want to find out how Pwnage really works that are in the dark.&lt;br /&gt;
&lt;br /&gt;
I must say, I really like what you have done. The concept of your &amp;quot;Simple Unlock&amp;quot;, it seems, you have applied to activation, and Pwnage itself. I'm not even being sarcastic. I really think it is pretty awesome.&lt;br /&gt;
&lt;br /&gt;
Peace,&lt;br /&gt;
[[User:ChronicDev|ChronicDev]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is not about me wanting to keep this stuff secret, it's about what's efficient. I've already said that we don't have time to document them, but that we'll probably eventually get around to it. It just seems like a waste of resources to have anyone who is capable of reversing what we've done actually doing so, when there are so many other things that need looking at that the devteam could never even think of having the time to do. Why reverse something that will eventually be documented when Apple's stuff is sitting there and we all know it will never be documented? &lt;br /&gt;
--pumpkin&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1281</id>
		<title>Talk:Research: Pwnage Patches</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Research:_Pwnage_Patches&amp;diff=1281"/>
		<updated>2008-08-02T21:37:18Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What is more important, is the code before 1800587C.&lt;br /&gt;
&lt;br /&gt;
Compilers translate actions like&lt;br /&gt;
&lt;br /&gt;
:if (condition is good) &lt;br /&gt;
::then&lt;br /&gt;
&lt;br /&gt;
into conditional jumps. What you can see with the MOV and NEG is most probably the result of a failed condition (-1) (or failed function result). Afterwards it depends on the compiler, how it further treats the result.&lt;br /&gt;
&lt;br /&gt;
Maybe the original pseudo code is as follows:&lt;br /&gt;
&lt;br /&gt;
 sig_check_result = do_check(important args);&lt;br /&gt;
 ...&lt;br /&gt;
 if (sig_check_result == 0)&lt;br /&gt;
     everything goes fine ...&lt;br /&gt;
 ...&lt;br /&gt;
 a.s.o&lt;br /&gt;
&lt;br /&gt;
So the question is, why it goes to the branch where R0 is set to -1 (patch 0) and what conditional branches lead to this code position? And the even more important question is, what is the underlying pseudo code?&lt;br /&gt;
&lt;br /&gt;
'''And the even more important question is, why is it really necessary to do reverse engineering of reverse engineering?? Could be much more simple the questions are answered by some people that tend to mystify some things... &amp;lt;/sarcasm&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
said people would like to document, but most of the they're too busy using the little free time they have actually getting stuff done that people need done rather than documentation that 1% wants&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:01.43.00&amp;diff=1245</id>
		<title>Talk:01.43.00</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:01.43.00&amp;diff=1245"/>
		<updated>2008-08-02T10:37:46Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== drg ==&lt;br /&gt;
&lt;br /&gt;
This information was published by the dev team on the blog. I think it's fair game for the wiki :)&lt;br /&gt;
&lt;br /&gt;
== geohot ==&lt;br /&gt;
&lt;br /&gt;
Talk of beta versions is fair game. Just no download links :)&lt;br /&gt;
&lt;br /&gt;
== pumpkin ==&lt;br /&gt;
&lt;br /&gt;
the iphone baseband firmware was found on an ipod touch ramdisk? o.O&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=User_talk:Shad0w&amp;diff=1243</id>
		<title>User talk:Shad0w</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=User_talk:Shad0w&amp;diff=1243"/>
		<updated>2008-08-02T10:30:43Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: New page: please stop signing every page you write... it's not appropriate for a documentation wiki. the &amp;quot;credits&amp;quot; appear on the history page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;please stop signing every page you write... it's not appropriate for a documentation wiki. the &amp;quot;credits&amp;quot; appear on the history page&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=The_iPhone_Wiki_talk:Ground_rules&amp;diff=979</id>
		<title>The iPhone Wiki talk:Ground rules</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=The_iPhone_Wiki_talk:Ground_rules&amp;diff=979"/>
		<updated>2008-07-31T09:04:21Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''clean up, clean up, everybody everywhere'' :-) I like the ground rules -caique2001-&lt;br /&gt;
&lt;br /&gt;
Perhaps an idea to have a help redirect message to IRC on the main page, like the original wiki had?&lt;br /&gt;
&lt;br /&gt;
Nice, I agree with most of them. Although I think tutorials are a good thing.&lt;br /&gt;
&lt;br /&gt;
== added section ==&lt;br /&gt;
&lt;br /&gt;
i added a small note about tutorials. just so we don't get overridden by these, we have already had 5 seperate pages for very exact topics with just a youtube link, god only knows what might have happened after our first month :P&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== attribution ==&lt;br /&gt;
&lt;br /&gt;
wouldn't it be good to mark pages taken verbatim from the old wiki as imported, maybe in the edit comment? otherwise one might expect to be able to ask the contributor to this wiki about contributions he simply copied and pasted from the old one.&lt;br /&gt;
&lt;br /&gt;
A page like [[Activation token]] is identical, for example.&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=IPhone_Dev_Team&amp;diff=876</id>
		<title>IPhone Dev Team</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=IPhone_Dev_Team&amp;diff=876"/>
		<updated>2008-07-30T23:59:30Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: very funny, Chronic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Homepage==&lt;br /&gt;
[http://iphone-dev.org Dev Team Homepage]&lt;br /&gt;
&lt;br /&gt;
==Current members== &lt;br /&gt;
asap18, bgm, Bugout, bushing, c1de0x, chris, dinopio, drudge, Fred_, ghost_000, gray, iZsh, jim–, kroo, MuscleNerd, netkas, np101137, penisbird, planetbeing, pr3d4t0r, pumpkin, pytey, roxfan, sam, saurik, Turbo, w___, wizdaz, Zf&lt;br /&gt;
&lt;br /&gt;
==Previous Members==&lt;br /&gt;
[[geohot]], [[Zibri]]&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Software_Update_Service&amp;diff=742</id>
		<title>Talk:Software Update Service</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Software_Update_Service&amp;diff=742"/>
		<updated>2008-07-30T16:17:37Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: New page: This is from the old iPhone Dev Wiki, but is not cached or saved anywhere else. I saw how in-depth it got and at the time I was thinking that it would get removed. I was right. Luckily, I ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is from the old iPhone Dev Wiki, but is not cached or saved anywhere else. I saw how in-depth it got and at the time I was thinking that it would get removed. I was right. Luckily, I saved it, and I have been holding on to it for when the time was right. Now that we have this open wiki, the time is right. This article details the old software updates, usually less than 10mb in size, that Apple used to update firmwares. They worked much better, and were based on good old .patch files. &amp;lt;b&amp;gt;Please do not delete this preamble&amp;lt;/b&amp;gt;. And without further ado, here is the article.&lt;br /&gt;
&lt;br /&gt;
PS: I have slightly editted it because of formatting reasons, as well as made it look neater.&lt;br /&gt;
&lt;br /&gt;
--ChronicProductions&lt;br /&gt;
&lt;br /&gt;
I'm not sure why people treat knowledge written by devteam members as the lost ark. The people who wrote this stuff are all still alive and most are still active in the community. If you wanted to know about this, you could've just asked Zf :P&lt;br /&gt;
Also, this service has been gone from the phone for ages now, so maybe we want to mention that on the main article?&lt;br /&gt;
--pumpkin&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Software_Update_Service&amp;diff=741</id>
		<title>Software Update Service</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Software_Update_Service&amp;diff=741"/>
		<updated>2008-07-30T16:15:51Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: Not relevant to article itself. &amp;quot;Do not delete&amp;quot; doesn't make sense, as this wiki keeps all histories, etc. The preamble is more suited to the talk page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks: Applying updates on a jailbreaked system ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Describing the update process&amp;lt;/b&amp;gt;: DONE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Understanding the BOM file format on the iPhone&amp;lt;/b&amp;gt;: IN PROGRESS (see the BOM framework)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Patch the pre/post BOM to only check the files that are patched&amp;lt;/b&amp;gt;: IN PROGRESS (compare BOM list with cpio'ed archive content)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Regenerating/signing the update files&amp;lt;/b&amp;gt;: IN PROGRESS (iZsh has some stuff)&lt;br /&gt;
&lt;br /&gt;
== Update archive content ==&lt;br /&gt;
&lt;br /&gt;
The update archive is a zip contains the following files.&lt;br /&gt;
&lt;br /&gt;
=== archive.cpio.gz ===&lt;br /&gt;
The actual cpio patch archive (encrypted). Contains a list of BSDiff patches (*) and baseband firmware updates, if available, with the associated flashing tools (bbupdater/imeisv).&lt;br /&gt;
&lt;br /&gt;
=== Info.plist ===&lt;br /&gt;
Description of the update and hashes of the update components (cleartext)&lt;br /&gt;
&lt;br /&gt;
=== Info.plist.signature ===&lt;br /&gt;
Asymmetric signature of Info.plist validated against /System/Library/Lockdown/iPhoneSoftwareUpdate.pem&lt;br /&gt;
&lt;br /&gt;
=== libupdate_brain.dylib ===&lt;br /&gt;
Stage 2 update process library (encrypted)&lt;br /&gt;
&lt;br /&gt;
=== pre.bom ===&lt;br /&gt;
Bill Of Material stating the filesystem state before the update process (encrypted)&lt;br /&gt;
&lt;br /&gt;
=== post.bom ===&lt;br /&gt;
Bill Of Material stating the filesystem state after the update process (encrypted)&lt;br /&gt;
&lt;br /&gt;
(*) there is a different update file to go from 1.0 to 1.0.2 and from 1.0.1 to 1.0.2 since bsdiff does not apply partial patches.&lt;br /&gt;
&lt;br /&gt;
The BOM files can be used to validate the CRC 32 checksums of the modified files. They can be browsed with lsbom on OS X.&lt;br /&gt;
&lt;br /&gt;
== Update process ==&lt;br /&gt;
&lt;br /&gt;
# Software_Update is invoked&lt;br /&gt;
&lt;br /&gt;
# The files signatures are checked&lt;br /&gt;
&lt;br /&gt;
# libupdate_brain.dylib, pre.bost and post.bom are decrypted&lt;br /&gt;
&lt;br /&gt;
# gogo_software_update in libupdate_brain.dylib is called to perform the actual update process&lt;br /&gt;
Blocking automatic updates&lt;br /&gt;
&lt;br /&gt;
=== A quick reversible way to disable automatic updates ===&lt;br /&gt;
Remove the executable permission on software_update&lt;br /&gt;
&lt;br /&gt;
 chmod a-x /usr/libexec/software_update&lt;br /&gt;
&lt;br /&gt;
Since bbupdater is included in the updates, you must block all automatic updates to prevent baseband updates&lt;br /&gt;
&lt;br /&gt;
== Debugging software_update ==&lt;br /&gt;
&lt;br /&gt;
software_update fails when launched from SSH because it cannot connect to lockdownd (validated with weasel, the minimal debugger included in the toolchain)&lt;br /&gt;
&lt;br /&gt;
Further investigation is needed to know why this happen. Probably because it must be spawned from a specific process. In this case weasel could probably be modified to accept remote commands in order to debug that kind of processes with minimal side effects.&lt;br /&gt;
&lt;br /&gt;
== Decrypting the update files ==&lt;br /&gt;
&lt;br /&gt;
The update files are AES-128 CBC encrypted with a key dependant of the software version.&lt;br /&gt;
&lt;br /&gt;
To retrieve the key, compute a SHA-1 hash of /System/Library/Caches/com.apple.kernelcaches/kernelcache.s5l8900xrb from offset (size / 2 - 0x2000) for 0x4000 bytes (or used the utility described below)&lt;br /&gt;
&lt;br /&gt;
To decrypt the update files from a desktop computer - funny facts: the IV is TheIphoneLovesU&lt;br /&gt;
&lt;br /&gt;
openssl enc -d -aes-128-cbc -K hex_key_obtained_in_the_previous_step -iv 5468656950686F6E654C6F7665735500 -in encrypted_file -out decrypted_file&lt;br /&gt;
&lt;br /&gt;
=== Another quick &amp;amp; dirty way to recover the decrypted files ===&lt;br /&gt;
Have software_update crash before running stage 2 and scavenge the files, for example by modifying the name of the function called in stage 2 (gogo_software_update) - the decrypted files are in /private/var/software_update/foo.pkg&lt;br /&gt;
Reversing BOM&lt;br /&gt;
&lt;br /&gt;
=== BOM Framework ===&lt;br /&gt;
The BOM framework (located in /System/Library/PrivateFrameworks/Bom.framework/Bom) is not documented, but very easy to reverse.&lt;br /&gt;
&lt;br /&gt;
Here is the .h used to implment the prototype checker&lt;br /&gt;
&lt;br /&gt;
 // BOM framework header - v0.1&lt;br /&gt;
 // Zf for iPhone Developers Wiki&lt;br /&gt;
 // Licensed under GPLv2&lt;br /&gt;
 typedef void* BOM;&lt;br /&gt;
 typedef void* BOMEnumerator;&lt;br /&gt;
 typedef void* BOMFSObject;&lt;br /&gt;
 typedef enum BOMObjectType {&lt;br /&gt;
	BOMFile = 1,&lt;br /&gt;
	BOMDirectory,&lt;br /&gt;
	BOMLink&lt;br /&gt;
 } BOMObjectType;&lt;br /&gt;
 typedef struct BOMSize {&lt;br /&gt;
	int low;&lt;br /&gt;
	int high;&lt;br /&gt;
 } BOMSize;&lt;br /&gt;
 int BOMCRC32ForFile(char *path, unsigned int *crc, BOMSize *size);&lt;br /&gt;
 BOM BOMBomOpen(char *path, int unk1); // 0 == error&lt;br /&gt;
 // unk1 = 0&lt;br /&gt;
 int BOMBomFree(BOM bom);&lt;br /&gt;
 BOM BOMBomNew(char *path);&lt;br /&gt;
 int BOMBomCommit(BOM bom);&lt;br /&gt;
 int BOMBomInsertFSObject(BOM bom, BOMFSObject object, int  unk1);&lt;br /&gt;
 // unk1=0&lt;br /&gt;
&lt;br /&gt;
 BOMEnumerator BOMBomEnumeratorNewWithOptions(BOM bom, int unk1, int unk2);&lt;br /&gt;
 // unk1=0 unk2=1&lt;br /&gt;
 BOMFSObject BOMBomEnumeratorNext(BOMEnumerator enumerator); // 0 == last&lt;br /&gt;
 int BOMEnumeratorFree(BOMEnumerator enumerator);&lt;br /&gt;
 BOMObjectType BOMFSObjectType(BOMFSObject object);&lt;br /&gt;
 char* BOMFSObjectPathName(BOMFSObject object);&lt;br /&gt;
 unsigned int BOMFSObjectChecksum(BOMFSObject object);&lt;br /&gt;
 unsigned int BOMFSObjectSize(BOMFSObject object);&lt;br /&gt;
 int BOMFSObjectFree(BOMFSObject object);&lt;br /&gt;
&lt;br /&gt;
== Sample patch checker ==&lt;br /&gt;
&lt;br /&gt;
The following code (running on the iPhone to validate the checksums or on OS-X to modify the BOM), partially tested, creates a simplified BOM containing only references to the patched files. This does not work fully as expected because during the update process an error is generated if the file system contains more files than what is provided in the BOM. But the idea is still sound :)&lt;br /&gt;
&lt;br /&gt;
Program arguments : pre.bom, directory containing the extract patches (cpio -i &amp;lt;archive.cpio), target.bom to be created and / if running on the iPhone&lt;br /&gt;
&lt;br /&gt;
// Checkpatch - Sample update BOM cleaner - v0.1&lt;br /&gt;
// Zf for iPhone Developers Wiki&lt;br /&gt;
// Licensed under GPLv2&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;quot;bom.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
	BOM src, dst;&lt;br /&gt;
	BOMEnumerator bomEnumerator;&lt;br /&gt;
	BOMFSObject bomObject;&lt;br /&gt;
	char *root_dir = NULL;&lt;br /&gt;
	int count=0, errors=0;&lt;br /&gt;
&lt;br /&gt;
	if (argc &amp;lt; 4) {&lt;br /&gt;
		printf(&amp;quot;Usage: %s src_BOM patches_dir target_BOM [root_dir]\n&amp;quot;,&lt;br /&gt;
				argv[0]);&lt;br /&gt;
		printf(&amp;quot;\nCreate target_BOM a reduced version of src_BOM &amp;quot; &lt;br /&gt;
		       &amp;quot;containing only the references to patches_dir patches.&amp;quot;&lt;br /&gt;
		       &amp;quot;\nChecksums are validated against root_dir if given\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	src = BOMBomOpen(argv[1], 0);&lt;br /&gt;
	dst = BOMBomNew(argv[3]);&lt;br /&gt;
	if (argc &amp;gt;= 4) {&lt;br /&gt;
		root_dir = argv[4];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!src) {&lt;br /&gt;
		printf(&amp;quot;Couldn't open %s&amp;quot;, argv[1]);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	bomEnumerator = BOMBomEnumeratorNewWithOptions(src, 0, 1);&lt;br /&gt;
	if (!bomEnumerator) {&lt;br /&gt;
		printf(&amp;quot;Open enumerator failed\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	while ((bomObject = BOMBomEnumeratorNext(bomEnumerator))) {&lt;br /&gt;
		BOMObjectType fsObjectType;&lt;br /&gt;
		unsigned int expectedCRC;&lt;br /&gt;
		char found = 0;&lt;br /&gt;
&lt;br /&gt;
		fsObjectType = BOMFSObjectType(bomObject);	&lt;br /&gt;
		if (fsObjectType == BOMFile) {&lt;br /&gt;
			char patchPath[400];&lt;br /&gt;
			sprintf(patchPath, &amp;quot;%s/%s.patch&amp;quot;, &lt;br /&gt;
				argv[2], &lt;br /&gt;
				BOMFSObjectPathName(bomObject));&lt;br /&gt;
			found = (access(patchPath, F_OK) == 0);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		if (fsObjectType == BOMDirectory) {&lt;br /&gt;
			char patchPath[400];&lt;br /&gt;
			sprintf(patchPath, &amp;quot;%s/%s&amp;quot;, argv[2],&lt;br /&gt;
				BOMFSObjectPathName(bomObject));&lt;br /&gt;
			found = (access(patchPath, F_OK) == 0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		expectedCRC = BOMFSObjectChecksum(bomObject);&lt;br /&gt;
		if (found &amp;amp;&amp;amp; root_dir != NULL &amp;amp;&amp;amp; expectedCRC != 0) {&lt;br /&gt;
			char rootPath[400];&lt;br /&gt;
			unsigned int computedCRC;&lt;br /&gt;
			sprintf(rootPath, &amp;quot;%s/%s&amp;quot;, root_dir,&lt;br /&gt;
				BOMFSObjectPathName(bomObject));&lt;br /&gt;
			if (access(rootPath, R_OK) != 0) {&lt;br /&gt;
				errors++;&lt;br /&gt;
				fprintf(stderr, &amp;quot;%s not found\n&amp;quot;,&lt;br /&gt;
						rootPath);&lt;br /&gt;
				found = 0;&lt;br /&gt;
			}&lt;br /&gt;
			BOMCRC32ForFile(rootPath, &amp;amp;computedCRC, NULL);&lt;br /&gt;
			if (computedCRC != expectedCRC) {&lt;br /&gt;
				errors++;&lt;br /&gt;
				fprintf(stderr, &amp;quot;CRC mismatched for %s &amp;quot;&lt;br /&gt;
					&amp;quot;expected %u got %u\n&amp;quot;,&lt;br /&gt;
					rootPath, expectedCRC, computedCRC);&lt;br /&gt;
				found = 0; &lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if (found) {&lt;br /&gt;
			count++;&lt;br /&gt;
			BOMBomInsertFSObject(dst, bomObject, 0);&lt;br /&gt;
		}&lt;br /&gt;
		BOMFSObjectFree(bomObject);&lt;br /&gt;
	}&lt;br /&gt;
	BOMBomEnumeratorFree(bomEnumerator);&lt;br /&gt;
	BOMBomFree(src);&lt;br /&gt;
&lt;br /&gt;
	BOMBomCommit(dst);&lt;br /&gt;
&lt;br /&gt;
	if (root_dir == NULL) {&lt;br /&gt;
		printf(&amp;quot;%d entries added. No consistency check done\n&amp;quot;,&lt;br /&gt;
				count);&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if (errors) {&lt;br /&gt;
			printf(&amp;quot;%d entries added, %d errors.\n&amp;quot;&lt;br /&gt;
			       &amp;quot;VALIDATE BEFORE PATCHING !\n&amp;quot;,&lt;br /&gt;
				count, errors);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			printf(&amp;quot;%d entries added, good to go :)\n&amp;quot;,&lt;br /&gt;
					count);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update utilities ==&lt;br /&gt;
&lt;br /&gt;
A set of utilities to manipulate update files on the iPhone is provided - current version 0.1 available here http://dl.free.fr/aqIyfnGZU/iPhone-update-utilities-0.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
These utilities should be trivial to port to OS X.&lt;br /&gt;
&lt;br /&gt;
=== Utilities currently provided ===&lt;br /&gt;
&lt;br /&gt;
 bspatch	Port of bspatch used to apply specific update patches&lt;br /&gt;
		extracted from the cpio archive&lt;br /&gt;
		bspatch [original file] [patch file] [target file]&lt;br /&gt;
		The original file and target file can be the same&lt;br /&gt;
&lt;br /&gt;
 getUpdateKey	Retrieve the update key used to decrypt libupdate_brain.dylib&lt;br /&gt;
		(and subsequent data files : boms and the main archive)&lt;br /&gt;
		Run without parameters or with the path to a specific &lt;br /&gt;
		kernelcache&lt;br /&gt;
&lt;br /&gt;
 listBOM	Very simple lsbom - list the contents of a BOM file&lt;br /&gt;
&lt;br /&gt;
 checkBOM	Validates BOM checksums against a list of files&lt;br /&gt;
		checkBOM [BOM file] [path to root]&lt;br /&gt;
		On the iPhone path to root will be /&lt;br /&gt;
&lt;br /&gt;
 reduceBOMPatch	Create a reduced BOM limited to files matching a patch set&lt;br /&gt;
		reduceBOMpatch [source BOM] [patch dir.] [target BOM] [path&lt;br /&gt;
				to root (optional)]&lt;br /&gt;
		If a root path is provided the BOM files checksum will be&lt;br /&gt;
		checked against the local filesystem&lt;br /&gt;
&lt;br /&gt;
== Early alpha: applying an update without wiping modified content ==&lt;br /&gt;
&lt;br /&gt;
The following steps were used to update from 1.0.1 to 1.0.2 without wiping everything. It's still not user friendly, and buggy, but you can try to follow them and report your ideas to improve it&lt;br /&gt;
&lt;br /&gt;
=== Pre-steps (to be performed once or once per update) ===&lt;br /&gt;
&lt;br /&gt;
# Install your own Software Update certificate. This will block Apple automatic updates (interesting side effect :p) but more importantly allow you to install your own.&lt;br /&gt;
&lt;br /&gt;
  The file to replace is /System/Library/Lockdown/iPhoneSoftwareUpdate.pem&lt;br /&gt;
&lt;br /&gt;
# Obtain your current update key according to your kernel cache version&lt;br /&gt;
&lt;br /&gt;
  Run getUpdateKey on the iPhone and copy the result&lt;br /&gt;
&lt;br /&gt;
=== Preparing the update files ===&lt;br /&gt;
&lt;br /&gt;
# Obtain your update file from iTunes, do not install it. The file name should be iPhone1,updateVersion_initialBuild_to_updateBuild_Update.ipsw&lt;br /&gt;
&lt;br /&gt;
# Unzip it&lt;br /&gt;
&lt;br /&gt;
# Decrypt archive.cpio.gz, libupdate_brain.dylib, pre.bom, post.bom with&lt;br /&gt;
&lt;br /&gt;
 openssl enc -d -aes-128-cbc -K update_key -iv 5468656950686F6E654C6F7665735500 -in encrypted_file -out decrypted_file&lt;br /&gt;
&lt;br /&gt;
# Extract archive.cpio.gz with gzip -d archive.cpio.gz ; cpio -i &amp;lt; archive.cpio&lt;br /&gt;
&lt;br /&gt;
(here you could choose specific patches to install, remove the baseband update, and so on ... but this first version is complicated enough :P)&lt;br /&gt;
&lt;br /&gt;
=== Generating the modified BOMs ===&lt;br /&gt;
&lt;br /&gt;
# Copy the obtaines patches/ directory, pre.bom, post.bom to the iPhone, for example in /tmp/upd&lt;br /&gt;
&lt;br /&gt;
# Prepare the reduced pre BOM: from /tmp/upd run&lt;br /&gt;
&lt;br /&gt;
 reduceBOMPatch pre.bom patches/ pre.bom.reduced /&lt;br /&gt;
&lt;br /&gt;
If you get a checksum warning - fix it (for example reinstall the original lockdownd if it was modified)&lt;br /&gt;
&lt;br /&gt;
# Prepare the reduced post BOM : from /tmp/upd run&lt;br /&gt;
&lt;br /&gt;
 reduceBOMPatch post.bom patches/ post.bom.reduced&lt;br /&gt;
&lt;br /&gt;
# Upload back pre.bom.reduced and post.bom.reduced to your computer&lt;br /&gt;
&lt;br /&gt;
=== Patching libupdate_brain.dylib (temporary step, ugly hack, and so on) ===&lt;br /&gt;
&lt;br /&gt;
Several controls are made on the BOM file that are not patched correctly - local supplementary files should be merged with the BOM in the visited directories.&lt;br /&gt;
&lt;br /&gt;
For the moment patching libupdate_brain.dylib to remove the control (call to verify_uberbom) is faster :)&lt;br /&gt;
&lt;br /&gt;
The following patch is valid for the for the 1.0.2 update and probably below&lt;br /&gt;
&lt;br /&gt;
Comparing files libupdate_brain.dylib and LIBUPDATE_BRAIN.DYLIB.MODIF&lt;br /&gt;
000059CC: BE 00&lt;br /&gt;
000059CD: F2 00&lt;br /&gt;
000059CE: FF A0&lt;br /&gt;
000059CF: EB E3&lt;br /&gt;
00006670: 95 00&lt;br /&gt;
00006671: EF 00&lt;br /&gt;
00006672: FF A0&lt;br /&gt;
00006673: EB E3&lt;br /&gt;
&lt;br /&gt;
=== Preparing the new update archive ===&lt;br /&gt;
&lt;br /&gt;
# Rename pre.bom.reduced pre.bom and post.bom.reduced post.bom.&lt;br /&gt;
&lt;br /&gt;
If you did some modifications to the patches, put them back in the gzipped cpio archive. Have the original Info.plist ready as well &lt;br /&gt;
&lt;br /&gt;
# Edit Info.plist, set the Encrypted key to &amp;lt;false/&amp;gt; OR process to 2b)&lt;br /&gt;
&lt;br /&gt;
# Encrypt pre.bom, post.bom, libupdate_brain.dylib and archive.cpio.gz with the following command&lt;br /&gt;
&lt;br /&gt;
 openssl enc -e -aes-128-cbc -K update_key -iv 5468656950686F6E654C6F7665735500 -in cleartext_file -out encrypted_file&lt;br /&gt;
&lt;br /&gt;
# Edit Info.plist and update the base64 digests for each modified component. You'll obtain the new digest with&lt;br /&gt;
&lt;br /&gt;
 openssl sha1 -binary file_to_check | openssl base64 -e&lt;br /&gt;
&lt;br /&gt;
# Generate Info.plist.signature with your own private key associated to the update certificate you replaced with&lt;br /&gt;
&lt;br /&gt;
 cat Info.plist | openssl dgst -sha1 -key /path/to/your/private/key &amp;gt; Info.plist.signature&lt;br /&gt;
&lt;br /&gt;
# Zip back all files and replace iTunes ipsw&lt;br /&gt;
&lt;br /&gt;
=== Running the update and checking all is fine ===&lt;br /&gt;
&lt;br /&gt;
# Connect to iTunes and install the update. If you're prompted to restore, you lose :p&lt;br /&gt;
&lt;br /&gt;
# Upload post.bom.reduced to /tmp/upd on the Iphone and run from /tmp/upd&lt;br /&gt;
&lt;br /&gt;
 checkBOM post.bom.reduced / &lt;br /&gt;
&lt;br /&gt;
You should not see any checksum error. If you see some, report the problem, it means that some patches have not been applied.&lt;br /&gt;
&lt;br /&gt;
# If some patches are missing, upload them on the iPhone in /tmp/upd and run&lt;br /&gt;
&lt;br /&gt;
 bspatch /file/to/patch /tmp/upd/patch_content /file/to/patch&lt;br /&gt;
&lt;br /&gt;
# Revalidate with step 2)&lt;br /&gt;
&lt;br /&gt;
  If you still see checksum errors, go buy a Nokia :)&lt;br /&gt;
&lt;br /&gt;
== Sample pre BOM list between 1.0 and 1.0.2 ==&lt;br /&gt;
&lt;br /&gt;
See http://www.pastebin.ca/668944&lt;br /&gt;
&lt;br /&gt;
The checksum is the last big number before the date. It's a typical CRC 32 checksum than can be checked with GNU cksum&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Talk:Tutorial:Mounting_the_Ramdisk_of_IPSW_in_Betas_4-7&amp;diff=618</id>
		<title>Talk:Tutorial:Mounting the Ramdisk of IPSW in Betas 4-7</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Talk:Tutorial:Mounting_the_Ramdisk_of_IPSW_in_Betas_4-7&amp;diff=618"/>
		<updated>2008-07-29T14:47:04Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: New page: How is this decrypting when there's no crypto involved? See satire at pumpkinpat.ch kthx&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How is this decrypting when there's no crypto involved? See satire at pumpkinpat.ch kthx&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Main_Page&amp;diff=316</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Main_Page&amp;diff=316"/>
		<updated>2008-07-28T09:10:01Z</updated>

		<summary type="html">&lt;p&gt;Pumpkin: /* Boot Chain */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table border=1 width=100%&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=#64ff64 width=50%&amp;gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;[[PwnageTool|Jailbreak]]&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=#ff6464 width=50%&amp;gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;[[Unlock 2.0|Unlock]]&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td colspan=2&amp;gt;&lt;br /&gt;
  [[Disclaimer]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Welcome to the iPhone wiki. This is a conglomerate work of everything done by everyone on the iPhone. Anyone can post here, just create an account. This is needed to avoid spam.&lt;br /&gt;
&lt;br /&gt;
Read the [[constitution]] to understand why this wiki was created. &lt;br /&gt;
&lt;br /&gt;
Note: There are inaccuracies in the constitution, but that page is not editable ;(.  Every page is editable in a &amp;quot;true&amp;quot; wiki.&lt;br /&gt;
&lt;br /&gt;
Read [[Up to speed|this]] to get up to speed in the iPhone community. Read the [[timeline]] to see where we are.&lt;br /&gt;
&lt;br /&gt;
If you have notes on something you did, post them here. Even if it isn't pretty.&lt;br /&gt;
&lt;br /&gt;
If you have a fix for a problem people are having, post it here.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
* [[m68ap|iPhone(m68ap)]]&lt;br /&gt;
* [[n82ap|iPhone 3G(n82ap)]]&lt;br /&gt;
* [[n45ap|iPod touch(n45ap)]]&lt;br /&gt;
&lt;br /&gt;
==App Processor(Jailbreak)==&lt;br /&gt;
* [[S5L8900]]&lt;br /&gt;
&lt;br /&gt;
===Exploits===&lt;br /&gt;
* [[Restore Mode]]&lt;br /&gt;
* [[jailbreakme]]&lt;br /&gt;
* [[symlinks]]&lt;br /&gt;
* [[Ramdisk Hack]]&lt;br /&gt;
* [[pwnage]]&lt;br /&gt;
* [[diags]]&lt;br /&gt;
* [[pwnage 2.0]]&lt;br /&gt;
&lt;br /&gt;
===Boot Chain===&lt;br /&gt;
[[VROM]]-&amp;gt;[[LLB]]-&amp;gt;[[iBoot]]-&amp;gt;[[Kernel]]-&amp;gt;[[System|System Software]]&lt;br /&gt;
&lt;br /&gt;
===Upgrade Process===&lt;br /&gt;
[[VROM]]-&amp;gt;[[DFU]]-&amp;gt;[[WTF]]-&amp;gt;[[iBoot]]-&amp;gt;[[Kernel]]-&amp;gt;[[Ramdisk]]-&amp;gt;[[Restore Mode|Restore]]&lt;br /&gt;
&lt;br /&gt;
==Baseband(Unlock)==&lt;br /&gt;
* [[S-Gold 2]]&lt;br /&gt;
* [[X-Gold 608]]&lt;br /&gt;
&lt;br /&gt;
===Exploits===&lt;br /&gt;
* [[SIM hacks]]&lt;br /&gt;
* [[Fakeblank|Hardware Fakeblank]]&lt;br /&gt;
* [[IPSF]]&lt;br /&gt;
* [[Minus 0x400]]&lt;br /&gt;
* [[Jerrysim]]&lt;br /&gt;
* [[Minus 0x20000 with Back Extend Erase]]&lt;br /&gt;
&lt;br /&gt;
===Theoretical Attacks===&lt;br /&gt;
* [[NCK Brute Force]]&lt;br /&gt;
* [[Baseband JTAG]]&lt;br /&gt;
&lt;br /&gt;
===Boot Chain===&lt;br /&gt;
[[Baseband Bootrom|bootrom]]-&amp;gt;[[Baseband Bootloader|bootloader]]-&amp;gt;[[Baseband Firmware|firmware]]&lt;br /&gt;
&lt;br /&gt;
==File formats==&lt;br /&gt;
* [[8900 File Format]]&lt;br /&gt;
* [[IMG2 File Format]]&lt;br /&gt;
* [[IMG3 File Format]]&lt;br /&gt;
* [[secpack]]&lt;br /&gt;
* [[secpack 2.0]]&lt;br /&gt;
* [[seczone]]&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
* [[Recovery Mode 0x1280]]&lt;br /&gt;
* [[Recovery Mode 0x1281]]&lt;br /&gt;
* [[DFU 0x1222]]&lt;br /&gt;
* [[WTF 0x1227]]&lt;br /&gt;
* [[Normal Mode 0x1290]]&lt;br /&gt;
* [[Restore Mode]]&lt;br /&gt;
* [[Baseband Bootrom Protocol]]&lt;br /&gt;
* [[Interactive Mode|Baseband Bootloader Protocol]]&lt;br /&gt;
&lt;br /&gt;
==Keys==&lt;br /&gt;
* [[AES Keys]]&lt;br /&gt;
* [[Apple Certificate]]&lt;br /&gt;
* [[Baseband RSA Keys]]&lt;br /&gt;
* [[Baseband TEA Keys]]&lt;br /&gt;
* [[VFDecrypt Keys|Root Filesystem DMG Keys]]&lt;br /&gt;
&lt;br /&gt;
==Application Development==&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
* [[Frameworks]]&lt;br /&gt;
* [[Apple Certification Process]]&lt;br /&gt;
* [[Distribution Methods]]&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
* [[Toolchain Tutorial]]&lt;br /&gt;
&lt;br /&gt;
==Definitions==&lt;br /&gt;
* [[jailbreak]]&lt;br /&gt;
* [[activation]]&lt;br /&gt;
* [[unlock]]&lt;br /&gt;
* [[baseband]]&lt;br /&gt;
* [[bootloader]]&lt;/div&gt;</summary>
		<author><name>Pumpkin</name></author>
		
	</entry>
</feed>