4 ms·
You are wrong. Changing names from a decompilation is a derivative work, and falls under copyright; clean room reimplementations such as IBM's bootloader from t
by chc4 3y ago
You are wrong. Changing names from a decompilation is a derivative work, and falls under copyright; clean room reimplementations such as IBM's bootloader from the 80s or ReactOS very specifically do not look at the disassembly for this exact reason. In your analogy, renaming a disassembly is copying an entire article and then changing words with synonyms, which is not legal either.
- derefr 3y ago> clean room reimplementations such as IBM's bootloader from the 80s or ReactOS very specifically do not look at the disassembly for this exact reason That reason being "paranoid lawyers who were operating on a lack of case law to interpret." We since have had many real code-IP court cases, and now have the actual established case law to refer to — and that case-law points to code copyright working akin to prose copyright (where obvious plagiarism is still not copyright infringement), not akin to e.g. musical-arrangement copyright (which is almost patent-like in its "plays the same? same arrangement" semantics, the chilling effects of which are the reason there's no such thing as an open database of classical-music scores.) The key thing you've got to realize is that publishing a decompilation to an HLL of a work, is not the same as publishing a disassembly of that work. Assembly languages are bijective mappings to object code for the ISA the assembler targets; so of course a disassembly of object code is a derivative work of that code. But decompilation, to a sufficiently abstract HLL (which even C qualifies as), is doing literally all the work needed to create a legal paraphrase. It's replacing the structure of the code with structures available in the HLL; it's replacing the bald memory addresses of globals and stack slots with named and typed identifiers; etc. The result is "a" decompilation, not "the" decompilation. It's not a bijective mapping. In fact, by default, it's not even a surjective mapping — we do not so far have any entirely-automated decompiler (for large projects containing binary assets, like games) where the result of the first-step automated decompilation is a project that can immediately be compiled to produce the original object code. A lot more manual work is needed to reach that step. Maybe it would be clearer if I describe it this way: you can take a program that was written in C and compiled to x86-64 object code, and then decompile it into Rust or into Haskell or any other language. You don't have to decompile it into C. And, perhaps surprisingly, this alternate decompilation will still be just as likely as the C decompilation, to produce the original object code when compiled! (Which is to say: not very likely by default, but possibly after a good few weeks of tweaking.) Or, I can put it this way: you can take a program that was originally written in raw assembly, and decompile it into C. Decompilers apply heuristics; those heuristics don't depend on the original object code having been generated by an HLL compiler. If you employed structured-programming techniques in your assembly, then you'll get if statements and functions out in the decompilation. If you can tell me with a straight face that you believe that a Rust decompilation of a program originally written in C infringes that C program's copyright; or that a C decompilation of a program originally written in assembly, violates the assembly program's copyright — in a world where a news article that is a plagiarizing paraphrase of another has no copyright issues whatsoever — then I'd really like to hear your reasoning. --- A bonus analogy, just for laughs: take a modern copyrighted prose fiction work, let's say Lord of the Rings. Rename all the characters and places and such (to avoid trademarks.) Now feed the text into ChatGPT and ask it, for each paragraph, to spit out a paragraph that communicates the same information in different words. Publish the result on Kindle Unlimited. Do you think https://en.wikipedia.org/wiki/Middle-earth_Enterprises https://en.wikipedia.org/wiki/Middle-earth_Enterprises has any standing to sue you? What would their legal argument be? What would their evidence be? (And be careful here of providing an "argument that proves too much" — any argument that would also apply to "every work of Tolkienesque fantasy published since LotR" isn't going to work. You can't sue just because there is clearly a race with equivalent properties to those of Tolkien's elves, or a sword with powers equivalent to those of one of the swords in the books — there are thousands of published books that cribbed both, not to mention the entire base setting of Dungeons & Dragons. Assuming that those cases "don't cross the line", what do you use to legally prove that this work does "cross the line"?) And while yes, you might point out that a translation of a work of fiction into another language, is explicitly noted as constituting a derivative work. But, again, how would the copyright-holder here prove that this published work is legally equivalent to a translation? Usually such a legal argument would cite something that must remain the same between translations, e.g. uses of words that are foreign loan-words to begin with. But we can tell ChatGPT to avoid those. My point being: when you look at the very fine boundaries of a law, they're not about what the text of the law says, so much as in what situations it can be proven that the law applies. The obvious example is an "unenforceable law" where there is no possible mechanism to detect people breaking that law. Here, we have a law that can be enforced for central cases — but becomes unenforceable "at the edges." In practice, evaluated as case-law in a Bayesian "absense of evidence is evidence of absence" sense, this means that those edges can be said to fall outside the scope of the law. If you very clearly ask a lawyer, not the question "is this in violation of copyright", but rather the question "would anyone ever bother to sue me for this, knowing they'll win?" the lawyer will answer "no."
- AshamedCaptain 3y ago> Assembler is a bijective mapping to object code, so of course a disassembly of object code is a derivative work of that code This is already wrong. Assembly is not a bijective mapping. Different dissassemblers will generate different representations and even for the same assembler there is usually more than one way to generate exactly the same machine code. Therefore your completely artificial distinction of dissassembly and decompilation breaks down. > You can take a program that was written in C and compiled to x86-64 object code, and then decompile it into Rust or into Haskell or any other language. You don't have to decompile it into C. And, perhaps surprisingly, this alternate decompilation will still be just as likely as the C decompilation, to produce the original object code when compiled! This is exactly the same Your "Rust" program would still be a copy (or at best, a derivative work) of the copyrighted program and therefore a violation to distribute it without permission. It is ridiculous to think that because I have machine translated a GPL C program into Zig/C++/Rust/whatever I can now freely distribute the translation under the terms of the "Do What The Fuck You Want To Public License". With such a ridiculous interpretation of copyright law, why even bother with the GPL? Quick, someone tell rms! And obviously courts agree it is ridiculous, see e.g. Atari vs Nintendo 1992: "Even though the [10NES] program was written for a different chip and in a different programming language, these similarities suggested that the Atari program was not an independent creation, but an unauthorized copy."
- derefr 3y ago> Different dissassemblers will generate different representations and even for the same assembler there is usually more than one way to generate exactly the same machine code. Apologies, I don't know much about (disassemblers for) modern ISAs; I'm mostly aware of "dumb" assembly languages used in the 70s and 80s, before macro assemblers, instruction modifier prefixes, instructions with opcodes that change based on argument types, etc. In those early assembly languages, the instructions themselves (ignoring labels) are literally just symbolic representations of the opcodes and arguments the machine uses, in a 1:1 mapping. There is precisely one canonical assembly syntax that can be assembled by the system assembler, and it's the same assembly you see in the "system monitor" when you jump to a text section in memory and LIST it. (And, in fact, in these old systems, the "system monitor" and assembler are usually related/sharing code, such that you can modify code in memory from the "system monitor" by specifying a patch in either object-code-bytes or canonical-assembly form.) My argument about bijectivity might not apply to modern assemblers, but it definitely did to whatever assembly language the IBM bootloader was written in. Re: ReactOS, and Re: 10NES... well, just read the Wikipedia abstract for the case you're citing: https://en.wikipedia.org/wiki/Atari_Games_Corp._v._Nintendo_of_America_Inc https://en.wikipedia.org/wiki/Atari_Games_Corp._v._Nintendo_.... > However, the United States Court of Appeals for the Federal Circuit differed from the district court on whether reverse engineering could hypothetically be allowed, declaring that "reverse engineering, untainted by the purloined copy of the 10NES program and necessary to understand 10NES, is a fair use." Thus, Atari was denied the fair use exception to copyright infringement, due to the illicit way they obtained Nintendo's source code. > One month after the decision, a similar ruling in Sega v. Accolade determined that reverse engineering was fair use. Several legal scholars have concluded that the main difference between the cases was that Atari had lied to obtain an unauthorized copy of Nintendo's code. What happened in the 10NES case, and the thing the ReactOS team are trying to avoid, is the team gaining access to a copy of the original IP-holder's source code (to which they have no legitimate right of access.) Doing that would "pollute" the project's legal status, because if such access can be proven, then any work created by the ReactOS team could be claimed to have been created with knowledge of that original Microsoft source code, and would therefore have a presumption of being a derivative work — unless it could be proven in rebuttal that clean-room reimplementation principles were followed. From https://www.lumendatabase.org/topics/15#QID195 https://www.lumendatabase.org/topics/15#QID195: > Courts determine whether or not copying occurred, rather that the independent creation of a program, by comparing the two programs for evidence of copyright infringement. The determination of copyright infringement is done through an analysis of whether there exists a "substantial similarity" between the initial work and the product of the reverse engineering effort. Making such a determination can be quite complicated in the software context since different parts of the computer code may be similar due to the industry standards of the overall structure and user interface of programs as well as their compatibility requirements. In order to prove a claim of copyright infringement, the burden is on the initial work's owner to show that the defendant had access to the original code. The Wiki page goes on to say: > Legal scholars have argued that reverse engineering has since been curtailed by the Digital Millennium Copyright Act of 2000, upsetting the balance established in the Atari and Accolade cases. But to be specific, https://www.lumendatabase.org/topics/15#QID195 https://www.lumendatabase.org/topics/15#QID195: > Circumvention, according to Section 1201(a)(3)(A), means "to descramble a scrambled work, to decrypt an encrypted work, or otherwise to avoid, bypass, remove, deactivate, or impair a technological measure, without the authority of the copyright owner." Reverse engineering, on the other hand, is the scientific method of taking something apart in order to figure out how it works. While not all acts of circumvention require the use of reverse engineering, the reverse engineering of works protected by technological mechanisms requires circumvention. The placement of digital protection systems on copyrighted works essentially fences in the information a reverse engineer seeks to discover about the way the product works. There are no "technological measures" used to protect IP rights (i.e. DRM) in these older works; so no argument about circumvention of such mechanisms pertains to them. The object-code in the ROM is the program, in a readable form, clear as day, sold to the end-user. Only the older arguments about reverse-engineering pertain. Further, guess what "reverse engineering" refers to in the above judgement? Very likely, it didn't refer to "black-box reverse engineering" (which was intentionally impossible in the 10NES case, so the judge here wouldn't have bothered to mention it); but rather something like "decapping the 10NES lockout chip, pulling the 10NES ROM from it, and disassembling that ROM." In other words, the implication here is that not just black-box reverse engineering, but even white-box reverse engineering provides an effective "Chinese wall" to derivative-work status, as long as the original copyrighted work (which is the source code, not the object code) is not accessed by the reverse-engineering team. This case-law has been widely misinterpreted ever since as requiring a higher standard to be met ("clean-room reverse engineering": using knowledge of the original only to implement a specification) — but this higher standard actually only pertains when the reimplementation was informed by knowledge of the original copyrighted work (which is, again, the source code, not the object code — unless the object code "is" the source code, as in the case of the old 1:1-bijective 'canonical assembly' code I mentioned above.) --- Of course, these arguments are all about reverse engineering with a specific pretence: namely, to ensure compatibility for some later-produced novel work that does not itself directly incorporate the reverse-engineered material. These game decompilation projects seemingly cannot be said to be targeting this purpose. Or can they? These projects are clearly informational in nature. On their own, they produce no useful consumable product — they require the original game ROM image in order to output... the original game ROM image. In other words, these projects function as nothing more than a documentation of the original work. Which is an expected and allowed byproduct of the reverse-engineering process. Again, from https://www.lumendatabase.org/topics/15#QID195 https://www.lumendatabase.org/topics/15#QID195 > There have been many attempts by companies over the past two decades to bring claims against software developers for their reverse engineering efforts. Since reverse engineers must make intermediate copies of the original work through the disassembly or decompilation process, the copyright owners of the initial software program have claimed that such a procedure is not covered by Section 117. They have argued that reverse engineering should be considered copyright infringement since some of the retrieved technical data used in the development process includes copyrightable expression. > In Sega v. Accolade, the case most often referred to discussing reverse engineering of computer software, the appellate court determined that reverse engineering is a fair use when "no alternative means of gaining an understanding of those ideas and functional concepts exists." The court considered Accolade's intermediate copying of parts of Sega's video game console during the reverse engineering process in order to make compatible games of minimal significance to the rights in Sega's copyrighted computer code. The court held that forbidding reverse engineering in this context would defeat "the fundamental purpose of the Copyright Act--to encourage the production of original works by protecting the expressive elements of those works while leaving the ideas, facts, and functional concepts in the public domain for others to build on." Which I'll sum up as: you can't take e.g. the Mario 64 decompilation, put your own assets in it, and publish that as a work — that's a derivative work. But you can freely work with the Mario 64 decompilation as an "intermediate copy" to understand Mario 64 while implementing your own clean-room work. The only real question, in my mind, is the legal gray area around how widely one can share/reproduce/distribute such an "intermediate copy for aiding in understanding during a reverse engineering process." If the reversing project is an open community effort, then the "intermediate copy" cannot be kept secret. As far as I'm aware, no case law specific to this subject exists. All we can go on, for now, is the fact that some very litigious companies (e.g. Nintendo) have not yet sued the people doing this. (If you think the problem comes down entirely to distribution of the decompilation, there's a neat solution to that: rather than a repo containing the decompilation per se, one could instead produce and evolve a tool which, on consuming the original ROM image, produces said decompilation, using growingly-complex set of heuristics and edge-case overrides of those heuristics. It'd be a generic decompiler program, just specialized to faithfully decompile and symbolicate a single particular program.)