Entries:
Comments:
Posts:

Loading User Information from Channel 9

Something went wrong getting user information from Channel 9

Latest Achievement:

Loading User Information from MSDN

Something went wrong getting user information from MSDN

Visual Studio Achievements

Latest Achievement:

Loading Visual Studio Achievements

Something went wrong getting the Visual Studio Achievements

Suzanne Cook - Developing the CLR, Part II

Download

Right click “Save as…”

Suzanne talks about why she got into programming, what her favorite language is, and gives more insights into what it's like working on the CLR team.

If you missed it, here's part I.

Tag:

Follow the Discussion

  • Does the tour continue in a Part III ? Smiley

  • MinhMinh WOOH!  WOOH!
    Do you forsee a day where JIT'ed code runs as fast as unmanaged C++ code? I mean, that's theoretically possible, right? Just a matter of how efficient the JIT compiler compares the the C++ compiler? And you guys are working on a MSIL CPU, right?
  • I don't think that's an issue.  99% of managed code runs without any performance problems today.  And for the remaining few applications, you can always switch to faster hardware Smiley.  Which doesn't mean that the .NET developers at Microsoft don't have to care about performance while coding of course!!! Wink
  • LOL, is this an old homepage of Suzanne Cook?
    http://www.cs.utah.edu/~scook/

    Smiley

    Must be with all the geek stuff on it! Smiley

    It was funny to see that video clip on the front page! I've seen it on TV many times, it was made here in Belgium (where I live).
  • MinhMinh WOOH!  WOOH!
    dotnetjunkie wrote:
    I don't think that's an issue.  99% of managed code runs without any performance problems today.  And for the remaining few applications, you can always switch to faster hardware Smiley.  Which doesn't mean that the .NET developers at Microsoft don't have to care about performance while coding of course!!! Wink
    I think there's a real noticeable difference in GUI apps.
  • rhmrhm
    dotnetjunkie wrote:
    LOL, is this an old homepage of Suzanne Cook?
    http://www.cs.utah.edu/~scook/


    Web stalker alert!
  • MinhMinh WOOH!  WOOH!
    Beer28 wrote:

    Have you tried the gnu jcg compiler?

    http://gcc.gnu.org/java/


    .NET has the equivalence in NGEN -- the Native Image Generator -- that compiles the entire .NET assembly right away to x86 code. If they can stick an optimized .NET compiler into NGEN, then it'd be darn close. Maybe that new Unified Compiler that Research is working on can be it.

    Beer28 wrote:

    If they made a CPU that took managed instructions, it wouldn't be managed or portable code anymore. That and the CLR inside the CPU that did the virtual stack for objects larger than 32/64 bit ect... and recognized object references would be horribly complex for hardware embedded software, could never be updated. You could possibly make it flashable, but can you imagine grandma flashing her CPU? **


    OK, I'll let the Managed CPU idea go. How about a Managed Extension card. Maybe kind of like a Graphics Co-processor. Kinda like back in the days you'd buy Expanded Memory cards to run Lotus 1-2-3.

  • dotnetjunkie wrote:
    LOL, is this an old homepage of Suzanne Cook?
    http://www.cs.utah.edu/~scook/

    Smiley

    Must be with all the geek stuff on it! Smiley

    It was funny to see that video clip on the front page! I've seen it on TV many times, it was made here in Belgium (where I live).


    Hey! That kid is me! At least that is the way I was when I was small. (This what my mother alleges. Of course I have no recollection of it.) Smiley
  • MinhMinh WOOH!  WOOH!
    Beer28 wrote:

    You don't understand, gcj actually compiles to a native binary you can zip/tar and give to a friend and he can run it on his or her machine with the runtime "dll" just like you could with a visual basic 5-6 app by including msvbvm5-6.dll

    Hmm... it seems I've misunderstood the function of NGEN.

    Beer28 wrote:

    gcj actually makes something tangibly reusable that you can distribute as a standalone with the support "dll", which in unix speak is a shared object file, .so.
    Unfortunately, I don't have the time to commit to an entire new platform. For now, .NET is my koolaid.
  • rhmrhm
    It's actually not as big a deal as you think. See this.

    There's a good reason MS doesn't support this kind of deployment. Applications deployed in this way won't get any hotfixes to the runtime or base class libraries. In fact people redistributing parts of the .NET framework using that tool are actually breaking the EULA.
  • rhmrhm
    Now if I can mention something that's actually to do with the video.....

    It was interesting to hear Suzanne talk about how/why she got into programming. I've wondered if I have a girl whether there was any chance she would be as geeky as her dad or whether she would rebel and refuse to use computers for anything other than communications/art/lifestyle etc. Note that I'm assuming any sons would automatically be geeks Smiley  They're all going to get Leapfrog stuff as soon as they can see and make coordinated hand movements.

    Oh, and another thing from the video:  You mentioned Mono and it wasn't cut out by PR (do PR really review stuff posted by Microsofties?). That's as close to a public endorsement of the Mono project as I've seen yet Smiley
  • MinhMinh WOOH!  WOOH!
    rhm wrote:
    do PR really review stuff posted by Microsofties?
    At my last job, every job posting must be made public first before a hire can be made (to prevent the Project Manager's cousin being the only applicant, I guess).
  • rhmrhm
    Beer28 wrote:
    rhm wrote:It's actually not as big a deal as you think. See this.

    There's a good reason MS doesn't support this kind of deployment. Applications deployed in this way won't get any hotfixes to the runtime or base class libraries. In fact people redistributing parts of the .NET framework using that tool are actually breaking the EULA.


    You're actually mistaken, gcj isn't redistributing parts of the java runtime from Sun. Such as is with salamander.


    You're the one who's mistaken, who doesn't read other people's posts properly before spouting complete crap. I'd like to be nice about this but you are proving to be a complete arse. You're assuming that because people don't agree with you that they don't understand. Take your head out of your arse for a while and actually read this reply done in the finest Usenet line-by-line nit-pick fashion and then if you feel the need to continue your misinformation campaign, do it in the knowlege that I won't be reading any of it.

    Right, your first mistake is that I didn't say gcj was re-distributing anything from Sun. I said that Salamander users were likely re-distributing parts of the .NET framework which is something MS doesn't want them to do and not just for copyright reasons.

    Beer28 wrote:

    It's actually compiling java to asm, as you would compile C++ to asm, then doing asm to opcodes and making an elf file, which is the unix/linux version of .exe

    Salamander is a cheap trick next to gcj. To do the same on windows, somebody would have to make a C# compiler from scratch that compiles to real cpu ASM, not virtual asm codes, or a MSIL to asm compiler in the worst case scenario.


    What do you think ngen does? It compiles MSIL to actual platform dependant machine code and then puts it on disk just like gcj does. Now I know what you're thinking "but gcj really compiles it because it no longer needs a runtime present unlike ngen created executables". Well there's really nothing fundamentally different happening at all. Gcj's output requires a shared library to run. What do you think is in that library? All the same stuff as the ngen'd executables require from the .NET framework issthe answer. Code compiled by gcj still needs the use of a garbage collector as well other basic services mandated by the Java object model. It doesn't require a big framework to be present though because all the parts of the Java framework library that the program uses will have been compiled into the executable. Which is what salamander does for you. Between salamander and ngen you get exactly the same thing as you do with gcj.

    Beer28 wrote:

    There is a huge gaping difference in your comparisons. You may have deployment situations where you want a certain functionality which has been depreciated or removed by a later version.


    No huge gaping difference, as explained above. Functionality doesn't just disappear from the .NET runtime. New versions are installed in parallel with old versions. If you're program requires a particular version of the framework it can be shipped with it or otherwise insist on it's presence. The only time the framework gets changed is for hotfixes - changes that do not affect functionality, generally only issued for security reasons.

    Beer28 wrote:

    With the CLR, you never know which version a person will have on their machine. Say by the time the CLR 10 rolls around 25% of the CLR 1's functions have been depreciated or are gone. That's when your statically linked gcj shines. The OS at that time will come with the latest Virtual Machine, each additional will be a 20+ meg download. That's alot of versions by that time to load up for 1 program that has it as a dependancy.


    Lets say that in 10 CLR verions time you're still running an app that hasn't been updated for the latest framework or any version of the framework inbetween. You still only need that one version of the framework present to run that app. To get in a situation where you need 10 different frameworks installed at once you'd need to have obsolescent software written using every single one of those versions. I feel pretty confident that by the time MS have released  10 complete versions of the CLR that nobody will be that bothered by the disk space used. The nice thing is that the CLR is shared between apps (that target the same version), therefore you're not dealing with hulking great executables that have had everything statically linked into them. But if you want a hulking great exe with everything it needs either linked in or contained in the same folder, salamander does that for you.

    Beer28 wrote:

    Some functions in msvbvm5 were no longer present in msvbvm6, but if you included the msvbvm5.dll in your distribution, you could keep your code going for years in distro with no mods.


    .NET doesn't have this problem as already explained. The right version of the CLR will load based on metadata in the executable.

    Beer28 wrote:

    That is the power of binary images, loadable, usable binary images.
    If you distribute the source, then that's another story.


    A lecture on "The power of binary images" from an open source advocate. You've got to love the irony.

    Beer28 wrote:

    Oh, that reminds me, with Java compiled to native instructions, you can NO LONGER USE djdecompiler, or .NET reflector or anything else.

    Your code is now as hard to look at as C++ or C compiled code. Obfuscation won't fool good coders that use debuggers. When you get down to disassembled x86 or 64 code, that's a nighmare, unless you're looking for easily crackable progs, which have a bool type pass/fail which a cracker could no op through a check call or change a verification result.

    So native code is also good because it's an added layer of protection against reverse engineering.


    Don't kid yourself. The machine code generated by gcj is I'm willing to bet, very predictable. One thing that makes it much easier to decompile than C++ code is the presence of the class metadata needed to support garbage collection and late binding. Sure, it's an added layer of obscurity, but given that the sources of the compiler are available, I don't think it would take a decent programmer too long to write a decompiler for it. I was researching the decompilation of DOS binaries at university and there's plenty of stuff you can do even if you don't know the language the source was written in, never mind the compiler and the source for it. 
  • Beer, I have a quick tip for you. Whenever you want to trollpost a reply, press Alt+F4 to get to the "Reply" page faster. It's optimized for you.

    Everyone else, just use the regular UI.
  • Maybe we should take this offline, at least to let this thread go back on topic.

  • You have my weblog URL. Bring a few friends to carry you back home, man!

  • The Channel 9 TeamThe Channel 9 Team 5 guys from Redmond
    RHM: yeah, each video gets approved by three groups: me and the other people on Channel 9, our PR guy, and the person who is being interviewed (and he or she can get other people involved too).

    It's been suprising how few things they've asked me to remove. In fact, in this video we even joke around about it.
  • That's very good Smiley

  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    Minh wrote: Do you forsee a day where JIT'ed code runs as fast as unmanaged C++ code? I mean, that's theoretically possible, right? Just a matter of how efficient the JIT compiler compares the the C++ compiler? And you guys are working on a MSIL CPU, right?


    I don't think it's possible, unless you have a homeade C++2ASM generator. Then you made your own homebrew style ASM2Opcode generator to complement that as well.

    If your 2 instruction converters were really bad, then you could output more instructions net than managed easily.

    A C or to less extent C++ asm generator is supposed to code assembly language like a master assembly programmer though, and they've been fine tuning it for years, so fat chance is my opinion. Plus you have fine tuning keywords like fastcall for passing in args through regs instead of the stack, and inlining ect...

    Have you tried the gnu jcg compiler?

    http://gcc.gnu.org/java/

    If you compile managed code to native such as this compiler does, then through some optimizations you'd have a shot at writing in managed code and spitting out opcode as optimized as C. The whole "managing of the code" is going to make that impossible if you don't though.

    As far as a "managed" cpu, your opcodes are actually managed inside the cpu you have now. There are several tiers of steps inside the pentium that break down your code, and throw exceptions and faults ect....

    It is managed, but on a level that is too obscure for normal users.

    If they made a CPU that took managed instructions, it wouldn't be managed or portable code anymore. That and the CLR inside the CPU that did the virtual stack for objects larger than 32/64 bit ect... and recognized object references would be horribly complex for hardware embedded software, could never be updated. You could possibly make it flashable, but can you imagine grandma flashing her CPU? **


    The whole point behind managed code is that it's virtual. It's made for application level code, and coders who don't need the fine grain of tuning provided by direct instruction conversions to cpu readable code.

    EDIT: Even there, it would be unmanaged at some point inside the CPU. It's been years since the Altair 8800 was released, but ironically, inside the CPU, as I've been reading, instructions are broken down to microops, and in the end that big bad pentium is just a really complex altair doing masking of 8-32 bit codes.

    EDIT2: ...with branch prediction, out of order microop processing, and instruction caching.



    You might not think it's possible, but these guys have it for sale.
    http://www.dotnetcpu.com/

    I love people who claim it's not possible. You people make smart people prove you wrong.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    About platform proliferation. Just my opinion, but I spend alot of time watching this stuff. XBox2 will run on a CPU that is made by IBM and has an instruction set very similiar to the 64bit Mac CPU. I suspect that Microsoft will develop a PAL (Platform Adapter Layer) for XBox2 and will ultimatly extend Whidbey to the OS:X operating system.

    System.PlatformId in Whidbey also has a new enumeration for Unix; which is very telling. It didn't get added for sh!ts and giggles, iykwim.

    http://blogs.aspadvice.com/pmurphy/archive/2004/08/11/1493.aspx
  • WinInsiderWinInsider Mike, MCAD

    Beer28 wrote:

    So native code is also good because it's an added layer of protection against reverse engineering.


    Beer28 raises very important point. Many companies want to protect their intellectual property (resources and time) that they put into making a software product, and it is a big issue, knowing that someone can take .NET DLL or EXE and quite easily decompile. I know there are tools that "obfuscate" the MSIL, but do not come close to ASM native image.

    I am not with the latest buzz, but I would hope that next version of VS 2005 would have much better NGEN that not only could put .NET Native Image into GAC, but also produce standalone app, that could only be run on target platform that has compatible .NET libraries installed.

  • WinInsider wrote:
    Beer28 raises very important point. Many companies want to protect their intellectual property (resources and time) that they put into making a software product, and it is a big issue, knowing that someone can take .NET DLL or EXE and quite easily decompile. I know there are tools that "obfuscate" the MSIL, but do not come close to ASM native image.

    I am not with the latest buzz, but I would hope that next version of VS 2005 would have much better NGEN that not only could put .NET Native Image into GAC, but also produce standalone app, that could only be run on target platform that has compatible .NET libraries installed.


    I know several people that just look at assembly code (even optimized) and tell you what it does. If you play with a debugger long enough, comparing assembler with the original source, in a few weeks you'll end up reverse engineering x86 assembler as well. Trust me on this one, the assumption that x86 asm is "safer" than MSIL is wrong. You can hack your way into anything if you're really determined.

    While we're at it, the fears themselves are largely unfounded. On the one hand, a good developer can figure out how a feature works just by playing with it for a while and implement it on his own. On the other hand, I think that no company in the world would be willing to face the legal consequences, the PR losses and all other subsequent "blessings" associated with the uncovering of such practices.

    Don't count on NGEN for obscurity. In v2, NGEN saves all metadata in the output file, so you get an executable file that's really easy to "understand". And in order to run NGEN-ed executables, you still need the original IL image.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    With .NET, you can decompile, take the source, even obfuscated, and modify and recompile with your new additions. Even dll2lib and object code relocaters will not allow this in x86/64.



    Prove it. Download any of Dave's components, http://www.aspnetemail.com/ and modify please. Otherwise stop issueing blanket statements with no backing.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    additionally, with disassembled x86/64 code, it's not easy to recompile and have it work correctly. I've never gotten it to on my own apps that I was testing against breakage.

    If you modify the application directly as hex you can't add any instructions that will change the offsets of the relative addresses in the codes, so they do no ops to fill in gaps so it comes out to the missing call and verification lengths in the hex, and stuff. It's not very easy at all. That's not counting trying to reverse engineer.

    I think the asm can be recompiled from dasm, but I don't know how.


    Win32Dasm is a piece of crap. If you *really* want to learn how to decompile code get a real tool like IDA. IDA can deconstruct anything, on any CPU, with any compiler. And FWIW, it is easy; it's just very time consuming and generally easier to write yourself if the purpose is to get code.

    However, if you are trying to understand a virus or doing something blackhat like crack a piece of software it's relativly easy and something that can be done in an afternoon.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    Paul D. Murphy wrote:

    Win32Dasm is a piece of crap. If you *really* want to learn how to decompile code get a real tool like IDA.


    Worked fine for me.



    Once again you show you lack of skills dood. Anyone who has ever done anything other than crack a piece of shareware will tell you that Win32dasm is a piece of crap.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:

    Is there some sort of prize involved, because if not I'm not going to take my pay time and do that with it. My Free time goes to GPL and free code.



    How about the distinct satisfaction of knowing that something you said is correct and you can prove it to a skeptic who has been there and done that.
  • Beer28 wrote:

    If you modify the application directly as hex you can't add any instructions that will change the offsets of the relative addresses in the codes, so they do no ops to fill in gaps so it comes out to the missing call and verification lengths in the hex, and stuff.


    Actually you can, it's just a case of replacing an instruction with a jump, then inserting your code (plus the now missing instruction) at the end.

    Used to do that sort of thing all the time on the ZX Spectrum. Even modifying complex, self-modifying R register[1] decryptors became quite easy once you got into it.

    For as long as the processor's instruction set is documented, it's possible to read a disassembly and understand exactly what is going on. The more you deal with asm, the quicker and easier this becomes.

    Frankly I'm surprised that the resident open source guy is recommending security through obscurity.



    [1] The R register, for non-z80 coders, was incremented by 1 (or sometimes 2) for every instruction executed. Encryption/decryption routines often used this fact to prevent code modification.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    That's not going to do it, posting on a forum is one thing but if I have to invest time in breaking software obfuscation as a demonstration, I'm not going to do it for free. + I'm not even sure if that type of thing is legal. When I used WDASM it was on my own software, not other people's.


    Decompiling code is legal under US law for educational purposes. If you would like I'd be happy to talk to Dave and ask him to explicitly authorize you to do this. I'm sure the .net community would appreciate your efforts in helping us make .net more secure if you can show us how you were able to get around commercial obfuscation technology.

    However, I suspect the real reason is that your fingers overloaded your ability and you are now backing out.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    I don,t have time. I have to stop posting on this thread too.


    You are batting 0 for 2. Just so you know. I'm keeping a record.

    Don't take this the wrong way, but I am seriously fanatical about .net because after careful and thoughtful inspection I've concluded it's the best thing to hit the computer since BASIC; so once I started reading your drivel I actually became offended.

    I don't know how long you've been posting hyperbole here, but I'm putting you on notice that the days of you issueing blatant falacies without any credible arguement are over.

    Now to be fair, when you are right; I'll admit that you are right without any problem at all. But I must say you aren't getting off to a very good start.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    unless Dave or you are offering a prize for success, then I'll think about it, thx


    How much would it take? FWIW, I own a couple of successfull businesses that basically run themselves. So playing with computers, and .net specifically, is like my hobby. I've got all the time in the world and if the money is right I'll gladly pay you to see it through.

    So what's your number? How much would it take?
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    I'm not going to spend a day or 2 breaking obfuscation for your own amusement, sorry pal


    Translation, "I can't, but I don't have the balls to admit I'm just running my mouth with no real idea what I'm talking about".
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    This is too inappropriate for this forum, I'm not going to continue talking about this. If you want to hire me independantly to do whatever, you can private message me and I'll put you on the waiting list.

    I hope this will suffice.


    Translation, "I'm going to fake the high road to try and save my credibility".

    Sorry dude. I'm relentless and you are in the cross hairs. It's nothing personal, I just gotta call BS when I see BS especially with your history.

    I got no problem with your point of view, just make sure it's accurate; cause as you can see from today - I'll eat you alive is a real debate.

    <ORiellyStyle>I'll give you the final word.</OriellyStyle>
  • Beer28 wrote:


    Yeah, that's true, as long as the jmp + the address replace some useless instructions of the same hex length, but what instructions are going to be useless that you're going to do that to?

    And B can you really effectively modify somebody's code that way to make your own version?


    The instruction(s) don't have to be useless or even the same length, because you replicate them at the end of your code and then jmp back to after they would have executed.

    And yes, you can effectively modify someone's code this way. Sure, you aren't likely to be doing large scale changes (who in their right mind would be making a large scale change using asm?) but you can make significant changes.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    I'm not going to educationally crack an application for your personal satisfaction, that is work, you are not aligned with free software, and you have to pay, period.

    PS- That isn't even my field, so if you want bang for your buck I'd suggest getting a pro at doing that.


    Actually I'm getting plenty of personal satisfaction from pointing out your inaccurate statements and subsequently watching you back away from them.

    I, personally, have tried to turn obfuscated .net code into usable code and found it about as compelling as turning compiled x86 code back into usable code. Yes, it is technically possible; no, it's not worth the time or effort.

    You were the one who said it was possible to turn obfuscation .net code into usable code. I've done everything I can do to assist you in backing up what I consider to be a rediculous remark, however you have done nothing but backpeddle from it.

    Maybe you should go back and delete those comments so no one who wasn't watching this unfold will realize just who stupid you made yourself look today.

    Just remember from now on, think twice about what you post cause I'm watching and am ready to make sure if you are wrong everyone knows it. If you are just shooting off your mouth be prepared to find your foot there.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:


    I'm not going to do it no matter what you say because it's a waste. I think other posters that code know it's a waste to do something like that on a dare. Reverse engineering code is only useful if it has an end, this has no end, it has no use, it's not worth the time.



    Fair enough. I totally understand the value of time and I also understand if your schedule doesn't permit it right now. I'm a little confused as to where you get the time to read and respond to almost every post on these forums considering how busy you claim to be, but I suppose it's fair to let that pass.

    Considering your vast knowledge of working with .net and obfuscated .net libraries, can you at least point me to one resource on the internet that shows how utilize code extracted from an obfuscated .net assembly? Surely you came to the statement

    Beer28 wrote:
    With .NET, you can decompile, take the source, even obfuscated, and modify and recompile with your new additions.

    through either personal experience or through a good strong white paper that outlined the processes involved. In Either case, we certainly would not want to waste your time; however since you are making a staggering claim about the security of intellectual property in managed code, on a forum dedicated to managed code, you could at least justify a few minutes to either post a sample of your past work or a link to the resource where you gleaned this incredible information.

    ------

    You are out of your league beer, either admit you made it up or produce a result.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    Paul D. Murphy wrote:
    ------

    You are out of your league beer, either admit you made it up or produce a result.


    do you know ILASM? use ILDASM then edit it. There


    lol. wow you really just shot yourself in the foot with that one. I'm done with this thread, you really just showed your ignorace.
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    how's that?

    if you want to see something that's nearly uncrackable or un reversable for C++ code, or very hard, try aspack, or pe crypt or one of the russian derivatives. The more obscure the harder it will be to get by.


    That's not what we are talking about beer. We are talking about your statement stating that you can 'take' the source to an obfuscated .net assembly and recompile it as you see fit with your own enhancement. Everyone agrees C++ code is hard to reverse engineer.

    For those who don't know, let me translate, "I just stuck my foot in my mouth big time, so I'm going to try and change the subject so no one notices".
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    I never said I was going to reverse engineer a .NET module, you wrote that.

    I don't even use .NET, I use Java TM (all rights reserved) virtual machine



    Just to be clear, you didn't say this?

    Beer28 wrote:
    With .NET, you can decompile, take the source, even obfuscated, and modify and recompile with your new additions.
    Cause if you didn't mayhaps you should find the miscreant who is using you account to post lies about the integrity of commercial obfuscators.

    Do the peddles on your go-ped even go forward?
  • Paul D. MurphyPaul D. Murphy The Anti-Beer
    Beer28 wrote:
    got my wickedy windows operating system on my left deskside wing tower all fired up here waiting...

    It can't be too hard to write a hello world box and hit the obfuscate button....

    Please get on with it.


    Sure. I'll send you something later today. I don't have a commercial obfuscator, as I'm not trying to hide any of my code from myself. Like I said before, this is a hobby for me. I don't actually sell anything. As soon as one of these component developers I know pop up on line, I'll get them to run a project of mine through thier tools.
  • Beer28, Paul D. Murphy!

    I'm eager to know the end of the story!!!
  • Well with minimal effort here is the source to one of the functions in the email control aside from changing all the non-ascii chars.

    How much would you be willing to pay to see it fully decompiled?

    public bool Send(bool openMailServerConnection, bool closeMailServerConnection)
    {
        bool flag = true;
        this.();
        try
        {
            if (openMailServerConnection && ((this. == null) || (this..Length < 1)))
            {
                throw new EmailException(.);
            }
            if ((this. == null) || (this..Length < 1))
            {
                throw new EmailException(.("ᒶᓊᓒᓕᒉᒶᓎᓜᓜᓊᓐᓎᒉᓖᓞᓜᓝᒉᓌᓘᓗᓝᓊᓒᓗᒉᓊᒉᒯᒻᒸᒶᒉᓎᓖᓊᓒᓕᒉᓊᓍᓍᓛᓎᓜᓜ"));
            }
            this.(this., this., this.);
            this. = this.();
            if (this. != null)
            {
                BeforeEmailSendEventArgs e = new BeforeEmailSendEventArgs(this.);
                this.OnBeforeEmailSend(e);
                if (!e.Send)
                {
                    return false;
                }
                this. = e.EmailContents;
            }
            if (openMailServerConnection)
            {
                this.();
            }
            string text = this.;
            if ((this. != null) && (this..Length > 0))
            {
                text = this.;
                this.(.("ᒶᒪᒲᒵᒉᒯᒻᒸᒶᒣᒥ") + this. + .("ᒧ"), true, true, SmtpState.MailFrom);
            }
            else
            {
                this.(.("ᒶᒪᒲᒵᒉᒯᒻᒸᒶᒣᒥ") + this. + .("ᒧ"), true, true, SmtpState.MailFrom);
            }
            this.(., .("ᒻᓎᓙᓕᓢᒉᒯᓛᓘᓖᒉᒯᒻᒸᒶᒉ"), SmtpState.MailFrom);
            if ((this. != null) && (this..Count > 0))
            {
                foreach (string text2 in this.)
                {
                    try
                    {
                        this.(.("ᒻᒬᒹᒽᒉᒽᒸᒣᒥ") + text2 + .("ᒧ"), true, true, SmtpState.RcptTo);
                        this.(., string.Empty, SmtpState.RcptTo);
                        continue;
                    }
                    catch (SmtpProtocolException exception)
                    {
                        if (!this.)
                        {
                            string text3 = (exception.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + text + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒉᓝᓘᒉᒐ") + text2 + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text3 = text3 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new SmtpProtocolException((text3 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"), exception.ExpectedReplyCode, exception.ActualReplyCode);
                        }
                        continue;
                    }
                    catch (Exception exception2)
                    {
                        if (!this.)
                        {
                            string text4 = (exception2.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + text + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒉᓝᓘᒉᒐ") + text2 + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text4 = text4 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new EmailException((text4 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"), exception2);
                        }
                        continue;
                    }
                }
            }
            if ((this. != null) && (this..Count > 0))
            {
                foreach (string text5 in this.)
                {
                    try
                    {
                        this.(.("ᒻᒬᒹᒽᒉᒽᒸᒣᒥ") + text5 + .("ᒧ"), true, true, SmtpState.RcptTo);
                        this.(., .("ᓒᓗᓟᓊᓕᓒᓍᒉᒬᓌᒉᓝᓘᒣᒉ") + text5, SmtpState.RcptTo);
                        continue;
                    }
                    catch (SmtpProtocolException exception3)
                    {
                        if (!this.)
                        {
                            string text6 = (exception3.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + text + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒉᓝᓘᒉᒐ") + text5 + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text6 = text6 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new SmtpProtocolException((text6 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"), exception3.ExpectedReplyCode, exception3.ActualReplyCode);
                        }
                        continue;
                    }
                    catch (Exception exception4)
                    {
                        if (!this.)
                        {
                            string text7 = (exception4.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + this. + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒉᓝᓘᒉᒐ") + text5 + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text7 = text7 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new EmailException((text7 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"));
                        }
                        continue;
                    }
                }
            }
            if ((this. != null) && (this..Count > 0))
            {
                foreach (string text8 in this.)
                {
                    try
                    {
                        this.(.("ᒻᒬᒹᒽᒉᒽᒸᒣᒥ") + text8 + .("ᒧ"), true, true, SmtpState.RcptTo);
                        this.(., .("ᓒᓗᓟᓊᓕᓒᓍᒉᒫᓌᓌᒣ") + text8, SmtpState.RcptTo);
                        continue;
                    }
                    catch (SmtpProtocolException exception5)
                    {
                        if (!this.)
                        {
                            string text9 = (exception5.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + text + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒉᓝᓘᒉᒐ") + text8 + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text9 = text9 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new SmtpProtocolException((text9 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"), exception5.ExpectedReplyCode, exception5.ActualReplyCode);
                        }
                        continue;
                    }
                    catch (Exception exception6)
                    {
                        if (!this.)
                        {
                            string text10 = (exception6.Message + .("ᒉᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + this. + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᓊᒉᒞᒙᒙᒉᓘᓛᒉᓕᓊᓛᓐᓎᓛᒉᓎᓛᓛᓘᓛᒗ");
                            if (this. == null)
                            {
                                text10 = text10 + .("ᓂᓘᓞᓛᒉᓜᓎᓛᓟᓎᓛᒉᓖᓊᓢᒉᓊᓕᓜᓘᒉᓛᓎᓚᓞᓒᓛᓎᒉᓊᒉᓞᓜᓎᓛᓗᓊᓖᓎᒉᓊᓗᓍᒉᓙᓊᓜᓜᓠᓘᓛᓍᒉᓏᓘᓛᒉᓊᓞᓝᓑᓎᓗᓝᓒᓌᓊᓝᓒᓘᓗᒕᒉᓌᓑᓎᓌᓔᒉᓠᓒᓝᓑᒉᓢᓘᓞᓛᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᓊᓍᓖᓒᓗᓒᓜᓝᓛᓊᓝᓘᓛᒗ");
                            }
                            throw new EmailException((text10 + .("ᒉᒯᓘᓛᒉᓊᓍᓍᓒᓝᓒᓘᓗᓊᓕᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ")) + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ") + .("ᒉᒽᓘᒉᓒᓐᓗᓘᓛᓎᒉᓝᓑᓒᓜᒉᓎᓛᓛᓘᓛᒤᒉᓜᓎᓝᒉᒲᓐᓗᓘᓛᓎᒻᓎᓌᓒᓙᓒᓎᓗᓝᒮᓛᓛᓘᓛᓜᒉᒦᒉᓝᓛᓞᓎ"));
                        }
                        continue;
                    }
                }
            }
            this.(.("ᒭᒪᒽᒪ"), true, true, SmtpState.DataInit);
            string text11 = ((.("ᒿᓎᓛᓒᓏᓢᒉᓢᓘᓞᒉᓌᓊᓗᒉᓜᓎᓗᓍᒉᓎᓖᓊᓒᓕᒉᓘᓗᒉᓋᓎᓑᓊᓕᓏᒉᓘᓏᒉᒐ") + text + .("ᒐᒉᓝᓑᓛᓘᓞᓐᓑᒉᓝᓑᓎᒉᓖᓊᓒᓕᒉᓜᓎᓛᓟᓎᓛᒉᒐ") + this. + .("ᒐᒗᒉᒐ") + this. + .("ᒐᒉᓖᓊᓢᒉᓗᓘᓝᒉᓊᓕᓕᓘᓠᒉᓛᓎᓕᓊᓢᓒᓗᓐᒉᓏᓘᓛᒉᓝᓑᓊᓝᒉᓜᓙᓎᓌᓒᓏᓒᓌᒉᓊᓍᓍᓛᓎᓜᓜᒉᓘᓛᒉᓍᓘᓖᓊᓒᓗᒕᒉ")) + .("ᒉᓝᓑᓎᓛᓎᓋᓢᒉᓊᓝᓝᓎᓖᓙᓝᓒᓗᓐᒉᓝᓘᒉᓜᓎᓗᓍᒉᓊᓗᒉᓎᓖᓊᓒᓕᒉᓛᓎᓜᓞᓕᓝᓒᓗᓐᒉᓠᓒᓝᓑᒉᒐᒷᓘᒉᒿᓊᓕᓒᓍᒉᒻᓎᓌᓒᓙᓒᓎᓗᓝᓜᒐᒉᓘᓛᒉᒐᒷᓘᒉᒿᓊᓕᓒᓍᒉᒼᓎᓗᓍᓎᓛᒐᒉᓘᓛᒉᒐᒶᓞᓜᓝᒉᒱᓊᓟᓎᒉᒼᓎᓗᓍᓎᓛᒉᓊᓗᓍᒉᒻᓎᓌᓒᓙᓒᓎᓗᓝᒉᒯᓒᓛᓜᓝᒐᒉᓘᓛᒉᓘᓗᓎᒉᓘᓏᒉᓖᓊᓗᓢᒉᓘᓝᓑᓎᓛᒉᒼᒶᒽᒹᒉᓎᓛᓛᓘᓛᓜᒗ")) + .("ᒉᒯᓘᓛᒉᓖᓘᓛᓎᒉᓒᓗᓏᓘᓛᓖᓊᓝᓒᓘᓗᒕᒉᓎᓗᓊᓋᓕᓎᒉᓕᓘᓐᓐᓒᓗᓐᒉᓋᓢᒉᓜᓎᓝᓝᓒᓗᓐᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᓐᓒᓗᓐᒉᒦᒉᓝᓛᓞᓎᒉᓊᓗᓍᒉᓒᓏᒉᓢᓘᓞᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓙᓎᓛᓖᓒᓜᓜᓒᓘᓗᒉᓜᓎᓝᒉᓊᒉᓙᓊᓝᓑᒉᓏᓘᓛᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒵᓘᓐᒹᓊᓝᓑᒕᒉᓝᓑᓎᓗᒉᓌᓑᓎᓌᓔᒉᓝᓑᓎᒉᓕᓘᓐᒗ") + .("ᒉᒲᓏᒉᓢᓘᓞᒉᓊᓛᓎᒉᓜᓎᓗᓍᓒᓗᓐᒉᓏᓛᓘᓖᒉᓊᓗᒉᒪᒼᒹᒗᒷᒮᒽᒉᓊᓙᓙᓕᓒᓌᓊᓝᓒᓘᓗᒉᓊᓗᓍᒉᓍᓘᒉᓗᓘᓝᒉᓑᓊᓟᓎᒉᓏᓒᓕᓎᒉᓠᓛᓒᓝᓎᒉᓊᓌᓌᓎᓜᓜᒕᒉᓠᓛᓊᓙᒉᓝᓑᓎᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒼᓎᓗᓍᒑᒒᒉᓒᓗᒉᓊᒉᒽᓛᓢᒗᒗᒬᓊᓝᓌᓑᒑᒒᒉᓋᓕᓘᓌᓔᒉᓊᓗᓍᒉᓌᓊᓕᓕᒉᒻᓎᓜᓙᓘᓗᓜᓎᒗᓀᓛᓒᓝᓎᒑᒉᒮᓖᓊᓒᓕᒶᓎᓜᓜᓊᓐᓎᒗᒰᓎᓝᒵᓘᓐᒑᒒᒉᒒᒉᓏᓛᓘᓖᒉᓒᓗᓜᓒᓍᓎᒉᓘᓛᒉᓊᓏᓝᓎᓛᒉᓝᓑᓎᒉᒬᓊᓝᓌᓑᒑᒒᒗ");
            this.(., text11, SmtpState.DataInit);
            this.(this. + this. + .("ᒗ"), true, this., SmtpState.DataEnd);
            this.(., .("ᓎᓛᓛᓘᓛᒉᓒᓗᒉᓋᓘᓍᓢᒣᒉ"), SmtpState.DataEnd);
            if (closeMailServerConnection)
            {
                this.();
            }
            else
            {
                this.(.("ᒻᒼᒮᒽ"), true, true, SmtpState.Rset);
                this.(., .("ᒻᓎᓙᓕᓢᒉᒯᓛᓘᓖᒉᒻᒼᒮᒽ"), SmtpState.Rset);
            }
        }
        catch (SmtpProtocolException exception7)
        {
            flag = false;
            this.(string.Empty, exception7);
        }
        catch (SmtpConnectionException exception8)
        {
            flag = false;
            this.(string.Empty, exception8);
        }
        catch (EmailException exception9)
        {
            flag = false;
            this.(string.Empty, exception9);
        }
        catch (Exception exception10)
        {
            flag = false;
            this.(.("ᓊᓗᒉᓞᓗᓑᓊᓗᓍᓕᓎᓍᒉᓎᓡᓌᓎᓙᓝᓒᓘᓗᒉᓘᓌᓌᓞᓛᓛᓎᓍᒉᓍᓞᓛᓒᓗᓐᒉᓝᓑᓎᒉᒼᓎᓗᓍᒑᒒᒉᓖᓎᓝᓑᓘᓍᒗ"), exception10);
        }
        finally
        {
            if (closeMailServerConnection)
            {
                this.();
            }
        }
        this.(.("ᓎᓡᓒᓝᓒᓗᓐᒉᓝᓑᓎᒉᒼᓎᓗᓍᒑᒒᒉᓖᓎᓝᓑᓘᓍᑶᑳ"));
        return flag;
    }
    
    
    
  • Paul D. Murphy wrote:
    Beer28 wrote: I'm not going to spend a day or 2 breaking obfuscation for your own amusement, sorry pal
    Big Smile

    Translation, "I can't, but I don't have the balls to admit I'm just running my mouth with no real idea what I'm talking about".


    Translation - Paul is the one that does not really know what he is talking about. : )  No Offense.  Just funny and kind of ironic.

    There really is nothing that cannot be decompiled to a degree.  Of course you are not going to get all the exact names of functions and variables, but if you know how to read the machine code, no reason you cannot figure out what the code is doing.

    It's like all the stupid copy protection schemes and the companies that use them think they are actually working.  Just harrassing their legal paying customers IMHO.

Remove this comment

Remove this thread

close

Comments Closed

Comments have been closed since this content was published more than 30 days ago, but if you'd like to continue the conversation, please create a new thread in our Forums,
or Contact Us and let us know.