Anakrino Download

The newer "Anakrino" builds.

Jay's E-Mail Address

saurik@saurik.com
(this keeps getting shifted down lower... and lower... on the page... figured I'd put it near the top)
AIM: saurik , MSN IM: saurik@saurik.com ; both of which are probably better even than e-mail
[December 12, 2004 @ 16:20pm SST]
I just realized that this existed (giving my AIM and MSN ids). I only thought I had this on my main website. To clear up some confusion I am copying the following note from there to here: (note that I _do not reply_ to "mind if I ask a question", "hello", or any other vague commentary... just ask your damned question and get to your point... and note that asking _anyone_ if they have time to answer a question online is useless: either they do, and they answer your question, or they don't, and they ignore the question, possibly answering it later)


[December 12, 2004 @ 16:25pm SST]
Note that I almost felt bad that I have expected people to have known this who probably got my information from this site instead, but then I realized that's stupid. It's almost against my philosophy on this matter to even have this note here in the first place. Interesting people not only should but _do_ already understand that this is how things work and get to their point.

Point About the Fix for .NET 1.1

(as of May 6th, 12:45PM CST)
Do not overwrite that xml file if you are using .NET 1.0 :). Also, you may have to open it and change your windows directory in case you installed to somewhere other than C:\Windows.

Really Late Point about .NET 1.1

(as of May 3rd, 4:40AM CST)
Like a week after that I figured out the problem and came up with a fix for it, but then I never updated this web page so only people who have found out about it are the people who have complained. Just replace the Anakrino.xml configuration file with this one.

Small Point about .NET 1.1

(as of January 21st, 6:15AM CST)
Note that, as far as I'm concerned, Anakrino Interim #9 supports .NET 1.1. For those of you who claim it doesn't, I only somewhat believe you :). I _accept_ that it might be crashing for you, but I don't think .NET 1.1 is to blame. (I have .NET 1.1, and it works fine for me.) God, I want a better web page...

Anakrino Interim #10 Delay

(as of January 21st, 5:45AM CST)
OK, it's taken me like two days, but I managed to get Anakrino to compile (for those of you who have been asking me about how to compile it and getting rather wishy washy answers, it's because it's _really_, _really_ damned hard). However, it still doesn't work, because I'm trying to get it running in VS 7.1 and the copy of WTL 3.1 that I hacked together using shoestrings and double-sided sticky tape isn't quite working yet. This screenshot is probably the coolest one yet :). None of the useful functionality wanted to work (finally noticed I forgot to feed it a configuration file...). Then it crashed because it internally didn't have a menu. Now it's stuck in message handler hell. But I _will_ get this thing fixed and running with .NET 1.1 without having to do weird config file hacks. (And, if I actually manage to get it compiling, I can probably fix stuff too.) Considering I'm just getting over the flu or something, it's almost 4 in the morning, and I have to get up early tomorrow, I'm going to go to bed and work on this in class (ahhh... the beauty of laptops...).

Anakrino Interim #9 Release (Download)

(as of March 12th, 7:00AM CST)
Lot's of little bug fixes. Special thanks for this release goes to:
The command line tool has been ressurected due to popular demand (well, two or three people). Seeing as I now have the source code to Anakrino online _and_ the command line tool again, I no longer feel compelled to keep the Exemplar links at the top of the page, so I'm going to move them down near the bottom somewhere. *Really needs to spend time working on that new website.*

There is also a new viewer for getting a call flow graph (to see what functions this function calls, and what functions those call, etc.). Search still doesn't work. The reason isn't because the search tool is hard to write, but because I can't figure out a good way to have the search tool make the tree view go to a specific token. I lazily load the tree view, so I can't even use the naive approach of keeping a map from token values to tree view entries. I'm likely to get fed up soon and just special case all of the possibilities I run into...

Anakrino Source Code

OK, I got all of my source code online in a Subversion repository. If you are brave (and trust me, you need to be to get this compiling on your computer), go to my complex instruction page to find out how to get the code. If you have any problems getting the code initially compiling, I can try to help you get the code downloaded. However, unless you are using Visual C++ 6.0 and either 2000 or NT, I probably can't actually help you getting it compiled and run.
Oh yeah, if you want to just browse through some of it online, you can at: http://svn.saurik.com/repos/ninetjer/trunk/.
Oh, and did I mention that I broke it? Yeah, it's 7/12/2002, 9:47AM CST, I'm about to fall asleep on my keyboard, I'm starving to death, and I finally realized that the reason the development work I'm doing on Subversion (which, btw, while being designed to perfection was engineered stupid...) is causing the debugger to go insane is because other people are trying to use my repository while I'm rewriting the code for the repository access-thingee :). Regardless, I should note things: the code there doesn't compile, you will need to check out an old version. I am working on a new vuild environment, but I was working on it last week, too, so the fact that I'm "working on it" might not mean much. If I can get anything working I have a really cool idea I want to try out :). Also, I should note that if you are wondering why your downloads of my source code will just time out... that's me :) I'm probably debugging it going "I didn't request this...". :)

What is Jay doing?!? (as of July 19th, 2:15PM CST)

Jay accidentally killed his GUI, but he himself, managed to step back before his explosive charge went off (thereby not being dead). I'm porting to GTK. I have been hanging out on the DoitGNU IRC channel, and I'm porting my decompiler to support Unix. I also have a few other features that are going in (such as an initial version of native, non-.NET code generation, even if I have to code it in as a seperate application and shell execute it from Anakrino). The new versiona: "- runs literaly a hundred times slower - takes up 4 times the hard drive space - no longer has the spiffy call graph feature - lost the second, spare browsing pane - no longer shows inline documentation - in general, looks nothing like a Windows app, or even anything you'd want to run - PLUS the same bugs the last version had". So, when I realease it, excepting for a few extra features (which is mainly this native code idea I've been thinking about for the last year and am finally going to implement; and that's likely to be a separate application...) I have a feeling you will be using #9 most of the time.

What is Jay doing?!? (as of May 21st, 10:00PM CST)

Jay is wishing he were dead, but the shear fact that he can still wish for such things indicates that he is not dead. Right now I am in a mad, mad rush to get our demo working for E3 (which is this Wednesday through Friday). The 3D game company a few of my friends and I started, Gnostic Labs, have a booth there to show off the initial technical work behind our game, Eschaton. Things have been rather hectic for the last month, and very, very hectic for the last week. I haven't had any free time to work on the decompiler...am finding time to update this website while I wait for some shader to get applied to some new models that I need to generate level of detail files for (which takes quite a long time...).
Before this all happened, I pretty much finished the new backend I wanted, and have an idea for how to make it really powerful. I got the stack collapser working, as well as coing up with some new ideas for my vision of a graph styling language. After E3 I am forcefully taking a break from the 3D engine, during which time I'm going to go back and spend time working on Anakrino.

What is Jay doing?!? (as of Feb 26th, 5:00AM CST)

Jay is realizing that he likely just wasted a few ours of his life on a what is likely a useless effort, which puts him just a smidge closer to when he won't still not be dead. I went back and got the source code to my "qsc" (the Questionably Superior Compiler), dusted it off, and started adding GCC support. The idea was to allow you to use the VC++ IDE to write code, and have it compile with GCC. This was actually a surprising success if you take that goal in isolation. I have VC++.Net thinking it is running cl.exe, but is instead running g++.exe through my qsc wrapper compiler (you just need to add a single extra command line argument in VC++ to switch to gcc from cl: /qsc:gcc). The thing I forgot to check is whether or not the debug information formats were at all the same, and they aren't, which quite readily defeats the purpose of integrating them in the first place (I'd likely be better off learning how to use Emacs). I haven't given up quite yet, however. It might be possible that I'm missing something (as the debug format VS wants _is_ quite common...).

What is Jay doing?!? (as of Feb 26th, 1:30AM CST)

Jay is on the verge of becoming very depressed and is thinking of doing something drastic: buying CodeWarrior (don't worry, Jay has no intentions of becoming dead). Apparently Whisper won't compile in VC++. Whisper came with no project files for VC++, and all I could find on the mailing list was one question from a few days ago to which the main developer replied, explaining that Whisper has chosen to use partial template specialization (a feature that Microsoft doesn't have slated until the next point release of Visual C++). He made it sound like it was in a single, isolated instance, so I decided to try to get it compiling in VC++.NET. I built myself project files, spent about a half hour dealing with #include file path finding issues, and finally ran into the weirdest looking issue.
This is where things started to become depressing. I was staring at the code that was causing the problem, and I was having a hard time believing I was even looking at C++. This is how much my choice of compiler has dictated my understanding of this programming language. After gawking at it for a while, totally dumbfounded, I finally started to understand what it was accomplishing. I'm totally in awe of this class library, and I wish I could use it. Unfortunately, I can't. Now I don't know what I am going to do. I've found the God of cross-platform GUI, and that doesn't work. The idea of using wxWindows sickens me. WTL is becoming more and more of a dead-end: there seems indication that a new version is forthcoming; but even if, it just isn't that great of a class library.
I'm seriously thinking of switching compilers. Actually, wait, I've got an idea. *Goes and pulls out his old qsc code.* If this works, it's going to be insane :). *Does a quick Google search.* Hehe, someone actually mentined it.

What is Jay doing?!? (as of Feb 25th, 5:00AM CST)

Jay is deleting every copy of wxWindows he has on his hard drive before it has an opportunity to finally make him dead. I've decided I'm not allowed to use wxWindows. The thing is terrible. It is about as anti-C++ as it gets, trying to use it makes me feel like I'm in some weird hybrid of Java and C that entirely skips the point of my chosen programming language. I get this feeling that they are going to decide that my compiler isn't compliant with their vision and recode it a few times within their amazingly, incomprehensibly, large framework of reimplementations of common work. Getting rid of this should drastically cut down the high requirements (both in hard drive space and patience) to compiling Anakrino from my source repository.
It's going to take a day or so to rip out all of the wxWindows garbage from the current code (I started implementing the file format header viewer using it a while back), but it shouldn't be that big of a deal... it has yet to eat my soul. I've been doing a lot of research, and it looks like I'm going to want to go with Whisper for my cross-platform happiness. The developer is still active, and there has been work since the last release on the CVS server. If need be I'll take it upon myself to port it to work on Unix if it means I don't need to ever look at wxWindows again. The biggest problem I forsee would be trying to integrate it with my Diapexis framework, but I can't imagine it will be that difficult (Diapexis is quite C++ friendly for an implementaton of COM).
Meanwhile, I've fixed a bunch of bugs that have been passed my way related to my misunderstanding of the pervasiveness of TypeSpecs. Did you know you could have a MemberRef who's containing type was a TypeSpec?!? I know I sure didn't. This is actually going to cause another problem as that means that my References tree doesn't actually contain all of the references. I need to deal with that. Regardless, Metallurgy is now abstracted enough to not care about the issue, and the neccessary changes were made to Dialect and ILEngineer. The latest Anakrino from my source repository should not have these problems. I also finally broke down and added better operator overloading support, so now operators won't get decompiled as "lhs.op_Addition(rhs)", but instead become "(a + b)".
I should be cutting a new release soon (but I always say that, hehe). I've had a request to include Anakrino on a book CD, and I want to get #9 out before that CD needs to get compiled. It's been too long since I've released Anakrino, so I'm putting off some of the insane graph theoretic decompiler work I've been doing in lew of doing some extensive work on Anakrino.
I'm going to be setting up a mailing list at some point soon (and newsgroups, the mailing list manager I've written has really good news<->mail support). The question I have is, what kind of mailing lists are needed? The only one I know I need is an announcement list for new releases. I'd assume one of those "send the new patches to this mailing list" would be nice. I'd say a development list, but I'm not sure if there is enough interest (or maybe the mailing list creates the interest); especially considering how painful it is to get my codebase compiling, hehe. If anyone has any suggestions, by all means send them to me :).

What is Jay doing?!? (as of Feb 15th, 10:15PM CST)

Jay has this weird evil grin on his face, and while he might seem un-dead, he went through a ritual sacrifice of a computer monitor last month to ward away that very situation, so he likely isn't even close to dead. Brent E. Rector finally gave some information on how his obfuscator works in his most recent newsletter. His "metadata" obfuscation seems to be a temporarily effective marketing gimmick (the generic idea seems to just be more flavors of name mangling...). He also announced a month's delay on his "Enterprise Edition" that does control flow obfuscation. This should give me enough time to get my graph theoretic decompiler complete (the main thing it still needs is an expression collapser, something to find operations that need stack variables and collapse earlier nodes that provide stack into sub-expressions). I had other things I might have worked on tonight (that homework assignment due last Monday is feeling more pressing... yet more distant), but I'm going to spend this evening working on finishing the process of making my code easily compilable and online in a source repository. Hopefull I'll finish that with a lot of time to start attacking that expression collapser.

What is Jay doing?!? (as of Feb 14th, 6:30AM CST)

Jay is currently doing the happy administrators dance, which is a pretty sure indicator that he isn't dead. Subversion started working :). I had to do a lot of the recent work to get it working on Win32 myself, but I finally have revision control that I don't feel stifles the kind of dramatic changes I'm currently making. Subversion, unlike CVS, supports the versioning of directory structures, allowing copy and move operations. It's a little late here; although not really 6:30... I date everything I do CST (where my servers are), but I actually live in PST. Even so, I doubt I will have my code in Subversion tonight. I don't want to upload any of the weird binaries I use (much rather have my batch files send you off to download the source code for them with CVS and have you compile them yourself). I'll be working on this during my classes tomorrow :-P.
On a very different front, I got my graph loader working (it's starting to get scary the way I'm mixing XSL/T and C++... talk about meta-programming the hard way). My excuse is that Chris Sells stole my demo copy of Gen/X to do a demonstration at Conference.NET and didn't give it back, so I was forced to go to extreme measures, hehe. I have part of the meta-(de)optimizer working with the new back-end, but the critical step (converting the graph into a graph-tree hybrid so I can do higher level (de)optimizations on it) isn't done yet. That is the step that my older version kind of skimped on (and the reason it sucks at ?: operators). The old version attempted to run the program (without any real values, of course) as it parsed it, pushing and popping the actual byte code instructions onto a program stack and building an expression tree out of that. The main problem that caused was when you hit branches that blocked the actual tree construction (as you might get with a ?: operator). It pretty much would just take one path and memory leak the other (although I did fix that memory leak).

What is Jay doing?!? (as of Feb 10th, 1AM CST)

Jay is currently writhing in agony, but still he is not dead. I now have a Java version _and_ a C++ version working at the same time, there is #define in Anakrino that rips out all of the JVM initialization code and instead uses a C++ DLL I wrote. The Java version is faster. I don't just mean that the translation time is faster, even all of the JNI work is faster. I think I'm going insane... my world is falling apart. I have no idea what I'm going to do at this point. I can't believe I'm actually thinking of this in terms of "C++ is easier to develop in, but Java is faster". It's like I've gotten thrust into some weird, backwards reality. Meanwhile, I have decided I need to support doing transforms from the profiler APIs, so no managed code for me even if I wanted to have it. Which is quite intersting, as I _would_ be allowed to take code from the profiler and pass it off to Java and have Java convert it there (and even be faster)... *sigh*.
However, there is something else to consider. It's just a _tad_ slower than I would want it to be for interactive work _at all_, even when implemented in Java. What's taking so long is parsing over my generic byte code parsers (there is no way in hell Java's ByteBuffer is faster than type casted pointer incrementation...). A few options cross my mind. First, I could come up with some in-memory representation of the file format, parse the XML in one swoop into that, and use that for subsequent code run throughs. Second, I could generate C++ from my XML files using XSL/T to get an optimized instruction decoder and then compile that. The second option limits runtime expandability, but considering a decoded instruction stream isn't _all_ that useful without writing the metadata libraries for it (especially if you want to decompile it) that might not be a practical limitation. I figure the code from the latter option will be almost identical to the old code in my "Reverse Macro" (the best description I can come up with for the stupid algorithm I use) decompiler which is blazing fast. Oooo... stupid... I can just keep the XML parser I already have, and then allow the compiled version to be used as an optimization! That way you can load new engines at runtime (incurring a speed hit for parsing), or use an optimized pre-compiled version loaded with Diapexis. *Runs off... well, swivles cha.. no... task swiches (!!) to action!"

What is Jay doing?!? (as of Feb 8th, 1AM CST)

For one, Jay is not dead. Jay is just having a hard time making some overarching design decisions. An example: what programming language. I finally got that runtime agnostic protocol parsing working (using XML descriptions of the byte code formats). I have a byte code format now for Java and MSIL (which I mainly wrote half a year ago while being bored out of my mind at a Chicago .NET User Group meeting...). My initial implementation? Java. I figure that between JUMP and my own decompiler I can port that to C# (Microsoft inadvertantly made Java the most universal language...). However, then I started getting mad that Java doesn't have unsigned data types, and the graph abstraction I used kind of sucked. So, I rewrote it in C++ using the boost graph library. I then spent almost a week trying to get a graph drawing algorithm I read about working to do IL visualization in Anakrino (and told one or two people to be expecting it in a few days, which was almost two weeks ago). Then, I got mad at boost (both because it was working _worse_ in VS.NET... silly Microsoft), decided that I didn't even want to store the graphs the way they did, and started back porting features into the Java version. Having found that Java 1.4 supports memory mapped files (!!!!! .NET doesn't do this, which is one of the reasons why an implementation of file format parsing in it would suck), I started getting pumped about Java. There is even this new ByteBuffer class (all of this is in java.nio, which really kicks .NET's ass). All of the Java solutions are being bootstrapped with JNI loading, so they were easily integrated into my C++ app (ok, not quite easily, but less difficultly than many would have you believe). Then I started thinking about how to get Metallurgy (my metadata abstraction) working in Java, got a little worried, learned more about JNI, and then started feeling better again.
Well, while working on that, I was also doing rapid modifications to an MFC app in-between compiles (bounced back and forth, while one compiled thought about the other), and I remembered that I wanted to share the graph reduction with our 3D engine (we compile .NET code down to the GPU, we're working on the GeForce3 backend currently, only have GeForce1/2 support for now). Well, the Java version won't cut it for that. However, maybe it will, not sure how much of it will be offline. Then there's my whole thing that "C is the most portable language on earth", but I love interop, and C++ will be harder to interop with Java and .NET than Java would be, and DAMN IT.
Oh, in case someone's going "Why not .NET?!?", .NET is immediatly disqualified on the short-term portability front. It's only advantage over Java is unsigned data types, and I'm actually not having nearly as much difficulty with that as I am with the idea that the code is being executed on a runtime.
This entire thing started because I wanted Garbage Collection. I was sitting (bored as hell) in Machine Learning (a class here at UCSB), and was working out graph reduction algorithms, and kept deciding I wanted garbage collection. But I don't really _need_ garbage collection, I figured I could write a little library called Derek (lab administrator who throught out my Daily Nexus archive along with some of my class readers from the CS lab filing cabinet... subsequently recovered from the trash) that would operate over my graphs and perform the neccessary collection, it just felt non-optimal somehow.
So, where am I know... that's a weird question. I think I'm about to go and back-port the nifty architecture modifications I worked on in Java last night back to C++. See, I figured out last night that this entire Lisp/TCL scripting language for IL Engineering was a red herring. What I really needed to do was not to find the perfect programming language, or create the perfect programming language, but to mark up an existing programming language. I got the idea while explaining to Seth (of soon-to-be Group Network fame) how Cocoon (my favorite web technology) works. It has a scripting feature called XSP (eXtensible Server Pages) that actually applies XSL/T to an XML file that contains marked up Java code. It turns out everything I wanted in the IL Engineering scripting feature can be supported doing this kind of deal. Originally I was thinking Java, but in the car ride home from Jake's I realized that "DUDE! I can do that to C++!!". It may sound insane, but yes, I intend to generate C++ using XSL/T in order to decompile binaries into graphs (which may very well get turned into some XML format and then XSL/T'd back into code... I still have a prototype of that technology, and it didn't work atrociously bad...).
Now, that leaves some problems. For one, I haven't released a new Anakrino in a while. I might very well sit around and work hard on stamping out some of the outstanding bugs, and even implement crummy (really crummy) overloaded operator support over the next days, but it is nowhere near the main deal people are going to want. OH, to MC++ people: open Anakrino.xml, and comment out the search browser; that will make MC++ decompilation work. The reason I've been concentrating on the decompiler backend recently is mainly because I've been inspired, but also because the obfuscator people (mainly Brent E. Rector of Wise Owl Software) is rapidly catching up, and if I don't have a graph reduction back end I'm out of the game. I also need the ability to more directly address my name pool in order to allow a combination heuristic / user guided approach to assigning names to metadata that gets lost (right now I'm just kind of looking at a treeview filled with funny little squares...).
The brighter side of all of this is that you won't need to install a JDK to get Theoretic (the name of the new engine) working, but it is going to take a little longer (I figure I can wave the magic fudge wand long enough to put Derek off until I need it for .NET native compilation, but that's another deal entirely). I _am_ working here, and I'm working pretty fast, I'm just working in circles.
If anyone has any specific requirements for some pet project they have that needs IL engineering (but really would rather avoid writing that part themselves), I'd love to hear about them: saurik@saurik.com. When I get the Ninetjer web page working, I'm going to setup a little area for the "IL Engineering Library" that I intend to write based on Metallurgy and Theoretic.

Current Newer New News

Anakrino #8 is now available. Something to point out: Anakrino is a GUI, so if you go to a command prompt and wait for it to produce output, it won't :). I'm really close to getting the Subversion repository ready where I will be releasing the source code (a few more practical issues to work out in what needs to actually be in it).
Lutz has been working with me on getting a Decompiler plug-in working in Reflector (which I was reluctant to bother with at first). As the worlds of Reflector and Anakrino are so far apart, it has gotten thrust into my lap to parse what one of Lutz's friends calls "XML Member Keys" that are used for the XML documentation. In working on that, I've added XML Documentation support to Anakrino. The problem is that it is butt slow. If you want to play with it, go into the Anakrino.xml file, and uncomment the "DocumentViewer" viewer. There are a lot of things it doesn't support yet, and I realize this... VERY new, mainly built today, so unless it crashes, bug reports will likely not be that useful. However, I _would_ like to know what <see langword=""/> means (langword isn't documented, but then again I'm back to my Beta 2 machine, so maybe I'm just out of date... will be reinstalling this computer this weekend).
Notable in this release is the drawing issues with the DecompilerViewer have been dealt with and a new spiffy tab control is in place. I'm not sure what to do when there is nothing available to show in the viewer area... maybe a cute graphic? :-P The sorting of namespaces is broken, and they will appear in an order that I can't even really describe the basis behind.
One thing I'm very interested in is whether people can see the toolbar. A while back, someone said that it wasn't working on their Windows 2000 machine, but I put off researching it. There is supposed to be a toolbar with Back/Forward buttons (built over a broken ring buffer that accidentally wraps over itself occasionally... will be fixing soon).
Well, that's all I can remember right now... OH!, yeah, and this release (when XML Document support is off) should be much faster than previous releases :-).

Newer New News

OK, I put Anakrino Interim Release #7 up. This release is a little kludged, but should still be better than #6. My copy of Visual Studio RC1 came in the mail yesterday, so I upgraded to be RC1 compatible. Note that this does not make it Beta 2 INcompatible: if you are still running the .NET Beta 2 Framework Anakrino _should_ run fine. If it doesn't yell at me. For those interested in what was up: it turns out that the older builds of Anakrino actually run fine on RC1, but are trying to open files that don't exist. Right now Fission works simply by taking on the Microsoft.NET/Framework/v1.0.???? from the Windows directory onto the DLL name, but was hardcoded to the Beta 2 version number. It now uses the registry entry for mscoree.dll to autodetect the location. This also points out a bug that I am checking for file not found issues at too high a level, it catches them sometimes, but bypasses the check at others (such as when Fission is used to resolve assemblies listed in the XML file). If for some strange reason I _DID_ break something, and you need to use an older version of Anakrino with RC1 of .NET, go into the Anakrino.xml file and remove the default assemblies (or replace them with the full path using <assembly path="C:\...."> *sigh*... I just realized that after I added name= I forgot to leave some documentation blurb for the path= variant....).
OK, one thing I just thought of: #7 will likely go insane if you give it code that has a calli instruction in it....

Newer News

This is silly: I'm working on an entirely different code base, and I've got this small group of people I've been telling about this unannounced location to download new "interim releases" from. This is stupid :). Suffice it to say that I've gone GUI, am attempting to compete directly with Reflector in the long term, and have all of my new releases (temporarily, they will move to a nicer, new home) at http://test.saurik.net/anakrino/. I should release a new version on the 7th of November (i.e., a day and a half after I write this) that supports MC++ better (read as: "something even remotely like it should"), but if history serves as any kind of guide, that is unlikely to happen.

News

OK, I still think I can get my newer codebase working in the next few days, but I decided that I should go ahead and update the original codebase to work with Beta 2 until I finish it. This operates identically, and only has one extra feature: when a class is extended it no longer throws it out if the token is 0x01000001. When I wrote the original decompiler I didn't understand how tokens worked, and assumed 0x01000001 would always be System.Object.

If need-be, I might add VB.NET support to the older codebase as well. I feel very confident about the newer system, however, and am very close to getting it to generate code again, so I don't think this will be neccessary.

I gave a talk on my work today. Ended up spending time talking with people about my patch for the Nmap Security Scanner rather than making this website look better :(. My Presentation Slides

I have re-licensed my decompiler under the modified BSD license, and have modified the banners in my source code to reflect the change.


Small note: I recently noticed a post on usenet a while back that referenced the "Exemplar sample". I would like to point out that Exemplar is not a "sample", it is an "application". I admit it is a pretty shoddily constructed one, but I am working on that. I _have_ refactored the code into nice modules, and have cleaned it up considerably from the release that is available here. I have yet to decide to release this version, however: there are no new features yet or anything fundamentally different other than "it is organized". I am currently working on porting it to MC++, and will release when I finish that even if there still aren't any new features. This mentality that "software that comes with source code is a 'sample'" is one I have run into quite a bit over my years of working with Visual Basic programmers and bugs me to no end.

Yes, you can learn stuff from my source code to work on your application; hell, I encourage you to do it. One of the coolest moments of writing this came when someone told me that they were finally able to see how to decode COR type signatures after reading my MetaSignature class code. However, this is also an application. It would bother me if you forked the code off without at least trying to contact me before hand. Also, I would appreciate it if questions regarding bugs and upgrades on it were at least addressed in my general direction if not addressed directly to me (the aforementioned usenet post was directed at a Microsoft newsgroup that I have never once posted to and have only looked at for all of 5 minutes). My e-mail address is saurik@saurik.com . I hadn't realized I didn't have that anywhere on my website after I cut out all of the non-decompiler bits, but I know it is printed out by my program when you run it with no arguments.

Exemplar 0.2 Interim Release (Obsolete)

MSIL -> C# Decompiler

Download:

OLD Binary
OLD Source

Discussions and Articles

Security of dotnet applications