├── .gitattributes
├── .gitignore
├── Assets
└── Screenshots
│ ├── code_example_main.png
│ ├── cpp11.png
│ ├── dependencies.png
│ ├── dependencies2.png
│ ├── example_app.png
│ ├── fileextension.png
│ ├── headerincludes.png
│ ├── outputformat.png
│ ├── preview_asm_code.png
│ ├── preview_string_code.png
│ ├── right_click_gui_project.png
│ ├── set_as_startup_project.png
│ └── symbolstripping.png
├── LICENSE
├── PowerObfuscator.sln
├── PowerObfuscatorGUI
└── src
│ ├── PowerObfuscator.cpp
│ ├── PowerObfuscator.h
│ ├── PowerObfuscator.qrc
│ ├── PowerObfuscator.ui
│ ├── PowerObfuscatorGUI.vcxproj
│ ├── PowerObfuscatorGUI.vcxproj.user
│ └── main.cpp
├── PowerObfuscatorSPRX
└── src
│ ├── Main.cpp
│ ├── PowerObfuscatorSPRX.vcxproj
│ └── PowerObfuscatorSPRX.vcxproj.user
├── README.md
├── bin
├── Debug-PS3
│ ├── PowerObfuscatorSPRX.prx
│ └── libPowerObfuscator.a
├── Debug-x64
│ ├── PowerObfuscatorGUI.exe
│ ├── PowerObfuscatorGUI.ilk
│ ├── PowerObfuscatorGUI.pdb
│ ├── SecureTool.exe
│ ├── data
│ │ ├── keys
│ │ ├── ldr_curves
│ │ └── vsh_curves
│ ├── ps3bin.exe
│ ├── scetool.exe
│ └── zlib1.dll
├── Release-PS3
│ ├── PowerObfuscatorSPRX.prx
│ └── libPowerObfuscator.a
└── Release-x64
│ ├── PowerObfuscatorGUI.exe
│ ├── SecureTool.exe
│ ├── data
│ ├── keys
│ ├── ldr_curves
│ └── vsh_curves
│ ├── ps3bin.exe
│ ├── scetool.exe
│ └── zlib1.dll
├── libPowerObfuscator
└── src
│ ├── DumpObfuscation
│ ├── DumpObfuscation.cpp
│ └── DumpObfuscation.h
│ ├── PowerObfuscator.cpp
│ ├── PowerObfuscator.h
│ ├── libPowerObfuscator.vcxproj
│ └── libPowerObfuscator.vcxproj.user
└── vendor
└── libPowerObfuscator
├── include
└── PowerObfuscator.h
└── lib
└── libPowerObfuscator.a
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode/*
2 | build/*
3 | **/.vs
4 | **/Debug/*
5 | **/x64/*
6 | **/*.pid
7 | **/*.log
8 | **/*.o
9 | **/*.elf
10 | **/*.vcxproj.filters
11 | **/archives/*
12 | *.sdf
13 | *.suo
14 | **/PS3_Debug/*
15 | **/PS3_Release/*
16 | PS3_Debug/*
17 | PS3_Release/*
18 | bin-int/*
19 | *.opensdf
20 | .vs/*
21 |
--------------------------------------------------------------------------------
/Assets/Screenshots/code_example_main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/code_example_main.png
--------------------------------------------------------------------------------
/Assets/Screenshots/cpp11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/cpp11.png
--------------------------------------------------------------------------------
/Assets/Screenshots/dependencies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/dependencies.png
--------------------------------------------------------------------------------
/Assets/Screenshots/dependencies2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/dependencies2.png
--------------------------------------------------------------------------------
/Assets/Screenshots/example_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/example_app.png
--------------------------------------------------------------------------------
/Assets/Screenshots/fileextension.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/fileextension.png
--------------------------------------------------------------------------------
/Assets/Screenshots/headerincludes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/headerincludes.png
--------------------------------------------------------------------------------
/Assets/Screenshots/outputformat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/outputformat.png
--------------------------------------------------------------------------------
/Assets/Screenshots/preview_asm_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/preview_asm_code.png
--------------------------------------------------------------------------------
/Assets/Screenshots/preview_string_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/preview_string_code.png
--------------------------------------------------------------------------------
/Assets/Screenshots/right_click_gui_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/right_click_gui_project.png
--------------------------------------------------------------------------------
/Assets/Screenshots/set_as_startup_project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/set_as_startup_project.png
--------------------------------------------------------------------------------
/Assets/Screenshots/symbolstripping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/Assets/Screenshots/symbolstripping.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/PowerObfuscator.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.3.32901.215
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerObfuscatorGUI", "PowerObfuscatorGUI\src\PowerObfuscatorGUI.vcxproj", "{C59C4CDE-CF36-4453-903F-3657B83D95B4}"
7 | ProjectSection(ProjectDependencies) = postProject
8 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC} = {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}
9 | EndProjectSection
10 | EndProject
11 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libPowerObfuscator", "libPowerObfuscator\src\libPowerObfuscator.vcxproj", "{71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}"
12 | EndProject
13 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerObfuscatorSPRX", "PowerObfuscatorSPRX\src\PowerObfuscatorSPRX.vcxproj", "{52D64FD4-79E9-4466-8D01-3B7D6C5383BC}"
14 | ProjectSection(ProjectDependencies) = postProject
15 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C} = {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}
16 | EndProjectSection
17 | EndProject
18 | Global
19 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
20 | Debug|PS3 = Debug|PS3
21 | Debug|x64 = Debug|x64
22 | Release|PS3 = Release|PS3
23 | Release|x64 = Release|x64
24 | EndGlobalSection
25 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
26 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Debug|PS3.ActiveCfg = Debug|x64
27 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Debug|PS3.Build.0 = Debug|x64
28 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Debug|x64.ActiveCfg = Debug|x64
29 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Debug|x64.Build.0 = Debug|x64
30 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Release|PS3.ActiveCfg = Release|x64
31 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Release|PS3.Build.0 = Release|x64
32 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Release|x64.ActiveCfg = Release|x64
33 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}.Release|x64.Build.0 = Release|x64
34 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Debug|PS3.ActiveCfg = Debug|PS3
35 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Debug|PS3.Build.0 = Debug|PS3
36 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Debug|x64.ActiveCfg = Debug|PS3
37 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Debug|x64.Build.0 = Debug|PS3
38 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Release|PS3.ActiveCfg = Release|PS3
39 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Release|PS3.Build.0 = Release|PS3
40 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Release|x64.ActiveCfg = Release|PS3
41 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}.Release|x64.Build.0 = Release|PS3
42 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Debug|PS3.ActiveCfg = Debug|PS3
43 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Debug|PS3.Build.0 = Debug|PS3
44 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Debug|x64.ActiveCfg = Debug|PS3
45 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Debug|x64.Build.0 = Debug|PS3
46 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Release|PS3.ActiveCfg = Release|PS3
47 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Release|PS3.Build.0 = Release|PS3
48 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Release|x64.ActiveCfg = Release|PS3
49 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}.Release|x64.Build.0 = Release|PS3
50 | EndGlobalSection
51 | GlobalSection(SolutionProperties) = preSolution
52 | HideSolutionNode = FALSE
53 | EndGlobalSection
54 | GlobalSection(ExtensibilityGlobals) = postSolution
55 | SolutionGuid = {C801C32B-CA2A-4320-B4AC-684B9C9B10EA}
56 | EndGlobalSection
57 | EndGlobal
58 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscator.cpp:
--------------------------------------------------------------------------------
1 | #include "PowerObfuscator.h"
2 |
3 | PowerObfuscator::PowerObfuscator(QWidget *parent)
4 | : QMainWindow(parent)
5 | {
6 | ui.setupUi(this);
7 | }
8 |
9 | PowerObfuscator::~PowerObfuscator()
10 | {}
11 |
12 | void PowerObfuscator::on_loadPrxButton_clicked()
13 | {
14 | const QString fileName = QFileDialog::getOpenFileName(this, "Open PRX File", m_currentDir.absolutePath(), "PRX File (*.prx *.bin)");
15 |
16 | if (fileName.isEmpty())
17 | return;
18 |
19 | openFile(fileName);
20 | }
21 |
22 | void PowerObfuscator::openFile(const QString& fileName)
23 | {
24 | m_qFile.setFileName(fileName);
25 |
26 | m_doesfileExist = m_qFile.exists();
27 | if (!m_doesfileExist)
28 | return;
29 |
30 | m_qFileInfo.setFile(m_qFile);
31 | m_currentDir = m_qFileInfo.dir();
32 | m_fileSize = m_qFileInfo.size();
33 | ui.filePathComboBox->addItem(fileName);
34 |
35 | m_sections.clear();
36 | m_symbolsInfo.clear();
37 | m_qBytesArray.clear();
38 | m_segmentsToDeobfuscate.clear();
39 |
40 | std::string fileNameStdString = fileName.toStdString();
41 | getElfInfo(fileNameStdString);
42 | getSizeStatistics(fileNameStdString);
43 | getSectionHeaders(fileNameStdString);
44 | getSegmentInfo(fileNameStdString, ".lib.ent", m_libEntSegmentInfo); // .rodata.sceResident OR .lib.ent
45 | getSymbolInfo(fileNameStdString);
46 |
47 | if (!m_qFile.open(QIODevice::ReadWrite))
48 | {
49 | qDebug() << "Could not open file for reading";
50 | return;
51 | }
52 |
53 | // Read file to data stream
54 | m_qDataStream.setDevice(&m_qFile);
55 | }
56 |
57 | void PowerObfuscator::on_generateRandomEncryptionKeyButton_clicked()
58 | {
59 | ui.outputTextEdit->append("\n----- Use this key in app -----");
60 | const std::string encryptionKeyString = generateRandomEncryptionKey();
61 | ui.outputTextEdit->append(QString::fromStdString(encryptionKeyString));
62 |
63 | ui.outputTextEdit->append("----- Use this key in your sprx code -----");
64 | const std::vector encryptionKeyBytes = hexStringToBytes(encryptionKeyString);
65 | printEncryptionKeyForPrx(encryptionKeyBytes);
66 | }
67 |
68 | void PowerObfuscator::on_obfuscateButton_clicked()
69 | {
70 | if (!m_doesfileExist)
71 | return;
72 |
73 | QString encryptionKeyString = ui.encryptionKeyTextEdit->toPlainText();
74 | if (encryptionKeyString.isEmpty())
75 | {
76 | QMessageBox::critical(this, windowTitle(), "Encryption key can not be empty.");
77 | return;
78 | }
79 |
80 | if (encryptionKeyString.size() != 128)
81 | {
82 | QMessageBox::critical(this, windowTitle(), "Encryption Key must be 128 characters which is the equivalent to 64 bytes.");
83 | return;
84 | }
85 |
86 | if (!IsHexString(encryptionKeyString.toStdString()))
87 | {
88 | QMessageBox::critical(this, windowTitle(), "Key must be in hex format with no '0x' and no spaces.");
89 | return;
90 | }
91 |
92 | std::vector encryptionKey = hexStringToBytes(encryptionKeyString.toStdString());
93 |
94 | ui.outputTextEdit->append("----- Starting prx obfuscation -----");
95 |
96 | if (m_sections.size() <= 1)
97 | {
98 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, No segments found.");
99 | m_qFile.close();
100 | return;
101 | }
102 |
103 | if (m_symbolsInfo.empty())
104 | {
105 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, No symbol table found.");
106 | m_qFile.close();
107 | return;
108 | }
109 |
110 | ui.outputTextEdit->append("Reading file buffer");
111 |
112 | // Read file buffer
113 | std::unique_ptr buffer = std::make_unique(m_fileSize);
114 | uint8_t* byteArray = buffer.get();
115 | int readBytes = m_qDataStream.readRawData(reinterpret_cast(byteArray), m_fileSize);
116 |
117 | qDebug() << "Read from buffer bytes";
118 | qDebug() << readBytes;
119 |
120 | qDebug() << "File size";
121 | qDebug() << m_fileSize;
122 |
123 | // Over write real pobfHeader values
124 | bool wasSymbolfound = fixHeader(byteArray, ".data", "pobf::pobf_header");
125 | if (!wasSymbolfound)
126 | {
127 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, Symbol pobf::pobf_header not found");
128 | m_qFile.close();
129 | return;
130 | }
131 |
132 | // Obfuscate [.data] segment
133 | bool statusDataSegment = obfuscateSegment(".data", byteArray, encryptionKey);
134 | if (!statusDataSegment)
135 | {
136 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, Failed to obfuscate .data segment");
137 | m_qFile.close();
138 | return;
139 | }
140 |
141 | // Obfuscate [.rodata] segment
142 | bool statusRodataSegment = obfuscateSegment(".rodata", byteArray, encryptionKey);
143 | if (!statusRodataSegment)
144 | {
145 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, Failed to obfuscate .rodata segment");
146 | m_qFile.close();
147 | return;
148 | }
149 |
150 | // Obfuscate [.text] segment
151 | bool statusTextSegment = obfuscateSegment(".text", byteArray, encryptionKey);
152 | if (!statusTextSegment)
153 | {
154 | ui.outputTextEdit->append("ERROR: Unable to encrypt prx, Failed to obfuscate .text segment");
155 | m_qFile.close();
156 | return;
157 | }
158 |
159 | // Save obfuscated prx file
160 | saveFileWithPrefix("obf_", byteArray, true);
161 | }
162 |
163 | bool PowerObfuscator::obfuscateSegment(const QString& segmentName, uint8_t* byteArray, const std::vector& encryptionKey)
164 | {
165 | ui.outputTextEdit->append("Searching for [" + segmentName + "] segment address and size");
166 |
167 | const uint32_t elfHeaderSize = 0xF0;
168 |
169 | uint32_t segmentAddress{};
170 | uint32_t segmentSize{};
171 |
172 | // Get segment address and size
173 | for (const auto& section : m_sections)
174 | {
175 | if (section.name == segmentName.toStdString())
176 | {
177 | segmentAddress = section.address;
178 | segmentSize = section.size;
179 | }
180 | }
181 |
182 | //uint32_t segmentLocation = geBinaryOffsetFromSegment(segmentName);
183 |
184 | ui.outputTextEdit->append("Found [" + segmentName + "] segment address and size");
185 |
186 | qDebug() << "----- " << segmentName << " segment -----";
187 | qDebug() << "Segment Address: " << Qt::hex << Qt::showbase << segmentAddress;
188 | qDebug() << "Segment Size: " << Qt::hex << Qt::showbase << segmentSize;
189 |
190 | segmentAddress += elfHeaderSize;
191 | qDebug() << "Segment Address Start with ELF header: " << Qt::hex << Qt::showbase << segmentAddress;
192 |
193 | uint32_t segmentAddressEnd = segmentAddress + segmentSize;
194 | qDebug() << "Segment Address End with ELF header: " << Qt::hex << Qt::showbase << segmentAddressEnd;
195 |
196 | MainInfo mainInfo = findMain(byteArray, elfHeaderSize, segmentAddressEnd);
197 | if (mainInfo.end == 0)
198 | return false;
199 |
200 | bool wasPobfHeaderSymbolFound = false;
201 | SymbolInfo pobfHeaderSymbol = findGlobalVariableBySymbolName(".data", "pobf::pobf_header", &wasPobfHeaderSymbolFound);
202 | if (!wasPobfHeaderSymbolFound)
203 | return false;
204 |
205 | uint32_t pobfHeaderStart = segmentAddress + pobfHeaderSymbol.value;
206 | uint32_t pobfHeaderEnd = segmentAddress + pobfHeaderSymbol.value + sizeof(pobfHeader) + 3;
207 |
208 | ui.outputTextEdit->append("Encrypting [" + segmentName + "] segment");
209 |
210 | for (uint32_t i = segmentAddress; i < segmentAddressEnd; i++)
211 | {
212 |
213 | #if 0
214 | // Skip undefined data
215 | if (byteArray[i] == 0)
216 | continue;
217 | #endif
218 |
219 | if (segmentName == ".text")
220 | {
221 | // Skip the main() function
222 | if (i >= mainInfo.startWithElfHeader && i <= mainInfo.endWithElfHeader)
223 | continue;
224 |
225 | #if 0
226 | // Skip instructions with string references
227 | if (skipInstructionsWithStringOrPointerReference(byteArray, segmentAddress, segmentAddressEnd, mainInfo, i))
228 | continue;
229 | #else
230 |
231 | if (skipLast2Bytes(i))
232 | continue;
233 | #endif
234 | }
235 |
236 | // Skip pobf_header structure
237 | if (segmentName == ".data" && wasPobfHeaderSymbolFound)
238 | {
239 | if (i >= pobfHeaderStart && i <= pobfHeaderEnd)
240 | continue;
241 | }
242 |
243 | #if 0
244 | byteArray[i] = (byteArray[i] ^ 0x69); // debug encryption key
245 | #else
246 | byteArray[i] = (byteArray[i] ^ encryptionKey[(i - segmentAddress) % encryptionKey.size()]);
247 | #endif
248 | }
249 |
250 |
251 | return true;
252 | }
253 |
254 | void PowerObfuscator::on_deobfuscateButton_clicked()
255 | {
256 | if (!m_doesfileExist)
257 | return;
258 |
259 | if (m_segmentsToDeobfuscate.empty())
260 | {
261 | QMessageBox::critical(this, windowTitle(), "Please Add Segment Information.");
262 | return;
263 | }
264 |
265 | ui.outputTextEdit->append("----- Starting prx deobfuscation -----");
266 |
267 | ui.outputTextEdit->append("Reading file buffer");
268 |
269 | // Read file buffer
270 | std::unique_ptr buffer = std::make_unique(m_fileSize);
271 | uint8_t* byteArray = buffer.get();
272 | int readBytes = m_qDataStream.readRawData(reinterpret_cast(byteArray), m_fileSize);
273 |
274 | // Deobfuscate segments
275 | for (const auto& segment : m_segmentsToDeobfuscate)
276 | deobfuscateSegment(segment.segmentName, byteArray, segment.segmentEncryptionKey, segment.segmentAddressStart, segment.segmentAddressEnd);
277 |
278 | // Save deobfuscated prx file
279 | saveFileWithPrefix("deobf_", byteArray, false);
280 | }
281 |
282 | void PowerObfuscator::on_addSegmentsToListButton_clicked()
283 | {
284 | if (!m_doesfileExist)
285 | return;
286 |
287 | QString segmentKeyString = ui.deobfuscateSegmentEncryptionKeyTextEdit->toPlainText();
288 | if (segmentKeyString.isEmpty())
289 | {
290 | QMessageBox::critical(this, windowTitle(), "Encryption Key can not be empty.");
291 | return;
292 | }
293 |
294 | if (segmentKeyString.size() != 128)
295 | {
296 | QMessageBox::critical(this, windowTitle(), "Encryption Key must be 128 characters which is the equivalent to 64 bytes.");
297 | return;
298 | }
299 |
300 | if (!IsHexString(segmentKeyString.toStdString()))
301 | {
302 | QMessageBox::critical(this, windowTitle(), "Encryption Key must be in hex format with no '0x' and no spaces.");
303 | return;
304 | }
305 |
306 | QString segmentName = ui.deobfuscateSegmentNameTextEdit->toPlainText();
307 | if (segmentName.isEmpty())
308 | {
309 | QMessageBox::critical(this, windowTitle(), "Segment Name can not be empty.");
310 | return;
311 | }
312 |
313 | QString segmentAddressStartString = ui.deobfuscateSegmentAddressStartTextEdit->toPlainText().trimmed();
314 | if (segmentAddressStartString.isEmpty())
315 | {
316 | QMessageBox::critical(this, windowTitle(), "Segment Address Start can not be empty.");
317 | return;
318 | }
319 |
320 | QString segmentAddressEndString = ui.deobfuscateSegmentAddressEndTextEdit->toPlainText().trimmed();
321 | if (segmentAddressEndString.isEmpty())
322 | {
323 | QMessageBox::critical(this, windowTitle(), "Segment Address End can not be empty.");
324 | return;
325 | }
326 |
327 | ui.outputTextEdit->append("----- Adding [" + segmentName + "] to deobfuscation list -----");
328 |
329 | bool isOk{};
330 | uint segmentAddressStart = segmentAddressStartString.toUInt(&isOk, 16);
331 | if (!isOk)
332 | {
333 | QMessageBox::critical(this, windowTitle(), "Invalid Segment Address Start.");
334 | return;
335 | }
336 |
337 | if (segmentAddressStart > m_fileSize)
338 | {
339 | QMessageBox::critical(this, windowTitle(), "Segment Address Start too large.");
340 | return;
341 | }
342 |
343 | uint segmentAddressEnd = segmentAddressEndString.toUInt(&isOk, 16);
344 | if (!isOk)
345 | {
346 | QMessageBox::critical(this, windowTitle(), "Invalid Segment Address End.");
347 | return;
348 | }
349 |
350 | if (segmentAddressEnd > m_fileSize)
351 | {
352 | QMessageBox::critical(this, windowTitle(), "Segment Address End too large.");
353 | return;
354 | }
355 |
356 | std::vector encryptionKey = hexStringToBytes(segmentKeyString.toStdString());
357 |
358 | ui.outputTextEdit->append("Start Address " + segmentAddressStartString);
359 | ui.outputTextEdit->append("End Address " + segmentAddressEndString);
360 | ui.outputTextEdit->append("Segment Key " + segmentKeyString);
361 |
362 | m_segmentsToDeobfuscate.emplace_back(segmentName, segmentAddressStart, segmentAddressEnd, encryptionKey);
363 |
364 | ui.deobfuscateSegmentNameTextEdit->clear();
365 | ui.deobfuscateSegmentAddressStartTextEdit->clear();
366 | ui.deobfuscateSegmentAddressEndTextEdit->clear();
367 | }
368 |
369 | bool PowerObfuscator::deobfuscateSegment(const QString& segmentName, uint8_t* byteArray, const std::vector& encryptionKey, uint32_t segmentAddressStart, uint32_t segmentAddressEnd)
370 | {
371 | const uint32_t elfHeaderSize = 0xF0;
372 |
373 | ui.outputTextEdit->append("Decrypting [" + segmentName + "] segment from 0x" + QString::number(segmentAddressStart, 16) + " to 0x" + QString::number(segmentAddressEnd, 16));
374 |
375 | qDebug() << "----- " << segmentName << " segment -----";
376 | qDebug() << "Segment Address: " << Qt::hex << Qt::showbase << segmentAddressStart;
377 | qDebug() << "Segment Size: " << Qt::hex << Qt::showbase << segmentAddressEnd;
378 |
379 | segmentAddressStart += elfHeaderSize;
380 | segmentAddressEnd += elfHeaderSize;
381 |
382 | qDebug() << "Segment Address With ELF Header: " << Qt::hex << Qt::showbase << segmentAddressStart;
383 | qDebug() << "Segment Size With ELF Header: " << Qt::hex << Qt::showbase << segmentAddressEnd;
384 |
385 | for (uint32_t i = segmentAddressStart; i < segmentAddressEnd; i++)
386 | {
387 |
388 | #if 0
389 | // Skip undefined data
390 | if (byteArray[i] == 0)
391 | continue;
392 | #endif
393 |
394 | if (segmentName == ".text")
395 | {
396 | // Skip the main() function
397 | // TODO(Roulette): need a way to get main() without symbols
398 |
399 | #if 0
400 | // Skip instructions with string references
401 | if (skipInstructionsWithStringOrPointerReference(byteArray, segmentAddressStart, segmentAddressEnd, mainInfo, i))
402 | continue;
403 | #else
404 |
405 | if (skipLast2Bytes(i))
406 | continue;
407 | #endif
408 | }
409 |
410 | // Skip pobf_header structure
411 | // TODO(Roulette): need a way to find pobf_header without symbols. Try to scan for 'P' 'O' 'B' 'F' or scan POBF_SIGNATURE bytes
412 |
413 | #if 0
414 | byteArray[i] = (byteArray[i] ^ 0x69); // debug encryption key
415 | #else
416 | byteArray[i] = (byteArray[i] ^ encryptionKey[(i - segmentAddressStart) % encryptionKey.size()]);
417 | #endif
418 | }
419 |
420 |
421 | return true;
422 | }
423 |
424 | bool PowerObfuscator::skipLast2Bytes(uint32_t iterator)
425 | {
426 | // from 0 to 3
427 | bool isThirdByte = (iterator % 4) == 2;
428 | bool isFourthByte = (iterator % 4) == 3;
429 |
430 | if (isThirdByte || isFourthByte)
431 | return true;
432 |
433 | return false;
434 | }
435 |
436 | bool PowerObfuscator::skipInstructionsWithStringOrPointerReference(uint8_t* byteArray, uint32_t textSegmentStart, uint32_t textSegmentEnd, MainInfo& mainInfo, uint32_t offsetToCompare)
437 | {
438 | std::vector offsetsToSkip;
439 |
440 | if (offsetsToSkip.empty())
441 | {
442 | // in powerpc64 instructions are 4 bytes in length
443 | for (uint32_t i = textSegmentStart; i < textSegmentStart; i += 4)
444 | {
445 | // Skip the main() function
446 | if (i >= mainInfo.startWithElfHeader && i <= mainInfo.endWithElfHeader)
447 | continue;
448 |
449 | // read instruction
450 | uint32_t entireInstruction = 0;
451 | memcpy(&entireInstruction, byteArray + i, sizeof(uint32_t));
452 | entireInstruction = littleToBigEndian(entireInstruction);
453 | //qDebug() << Qt::hex << Qt::showbase << entireInstruction;
454 |
455 | uint8_t opCode = entireInstruction >> 24; // get the first byte of the instruction
456 |
457 | #if 0
458 | const uint8_t skipOpCodes[] = {
459 | 0x30, // addic
460 | 0x3C, // lis
461 | 0x80, // lwz
462 | //0x61, // ori
463 | //0x64, // oris
464 | };
465 | #endif
466 |
467 | if (opCode == 0x30 // addic
468 | || opCode == 0x3C // lis
469 | || opCode == 0x80) // lwz
470 | {
471 | // save offset of the last 2 bytes in the instruction
472 | offsetsToSkip.push_back(i + 2);
473 | offsetsToSkip.push_back(i + 3);
474 | }
475 | }
476 | }
477 |
478 | // skip the last 2 bytes of the instruction
479 | for (const auto& offset : offsetsToSkip)
480 | {
481 | if (offsetToCompare == offset)
482 | return true;
483 | }
484 |
485 | return false;
486 | }
487 |
488 | bool PowerObfuscator::fixHeader(uint8_t* byteArray, const QString& segmentNameInSymbol, const QString& symbolName)
489 | {
490 | ui.outputTextEdit->append("Replacing POBF Header values so we can use them in our sprx");
491 |
492 | const uint32_t elfHeaderSize = 0xF0;
493 |
494 | uint32_t dataSegmentAddress{};
495 | uint32_t dataSegmentSize{};
496 |
497 | // Get .data segment address and size
498 | for (const auto& section : m_sections)
499 | {
500 | if (section.name == ".data")
501 | {
502 | dataSegmentAddress = section.address;
503 | dataSegmentSize = section.size;
504 | }
505 | }
506 |
507 | uint32_t rodataSegmentAddress{};
508 | uint32_t rodataSegmentSize{};
509 |
510 | // Get .rodata segment and size
511 | for (const auto& section : m_sections)
512 | {
513 | if (section.name == ".rodata")
514 | {
515 | rodataSegmentAddress = section.address;
516 | rodataSegmentSize = section.size;
517 | }
518 | }
519 |
520 | uint32_t textSegmentAddress{};
521 | uint32_t textSegmentSize{};
522 |
523 | // Get .text segment address and size
524 | for (const auto& section : m_sections)
525 | {
526 | if (section.name == ".text")
527 | {
528 | textSegmentAddress = section.address;
529 | textSegmentSize = section.size;
530 | }
531 | }
532 |
533 | bool wasSymbolFound = false;
534 | SymbolInfo symbolInfo = findGlobalVariableBySymbolName(segmentNameInSymbol, symbolName, &wasSymbolFound);
535 |
536 | if (!wasSymbolFound)
537 | {
538 | ui.outputTextEdit->append("Failed to find symbol " + symbolName + " in [" + segmentNameInSymbol + "] segment");
539 | return false;
540 | }
541 |
542 | #if 0
543 | pobfHeader readHeader;
544 | memcpy(&readHeader, byteArray + elfHeaderSize + dataSegmentAddress + symbolInfo.value, sizeof(pobfHeader));
545 | qDebug() << "show symbol info offset";
546 | qDebug() << readHeader.magic[0] << readHeader.magic[1] << readHeader.magic[2] << readHeader.magic[3];
547 | qDebug() << Qt::hex << Qt::showbase << littleToBigEndian(readHeader.textSegmentStart);
548 | #endif
549 |
550 | pobfHeader header = {
551 | POBF_MAGIC,
552 | POBF_SIGNATURE,
553 | POBF_TEXT_SEGMENT_DUMMY_VALUES,
554 | POBF_DATA_SEGMENT_DUMMY_VALUES,
555 | POBF_RODATA_SEGMENT_DUMMY_VALUES,
556 | POBF_PLACEHOLDER_DUMMY_VALUES
557 | };
558 |
559 | header.textSegmentStart = littleToBigEndian(textSegmentAddress);
560 | header.textSegmentSize = littleToBigEndian(textSegmentSize);
561 |
562 | header.dataSegmentStart = littleToBigEndian(dataSegmentAddress);
563 | header.dataSegmentSize = littleToBigEndian(dataSegmentSize);
564 |
565 | header.rodataStart = littleToBigEndian(rodataSegmentAddress);
566 | header.rodataSize = littleToBigEndian(rodataSegmentSize);
567 |
568 | // rewrite our new header
569 | memcpy(byteArray + elfHeaderSize + dataSegmentAddress + symbolInfo.value, &header, sizeof(pobfHeader));
570 |
571 | ui.outputTextEdit->append("Sucessfuly rewrote POBF header");
572 | return true;
573 | }
574 |
575 | uint32_t PowerObfuscator::geBinaryOffsetFromSegment(const QString& segmentName)
576 | {
577 | uint32_t locationInBinary{};
578 |
579 | for (const auto& section : m_sections)
580 | {
581 | locationInBinary += section.size;
582 |
583 | if (section.name == segmentName.toStdString())
584 | break;
585 | }
586 |
587 | return locationInBinary;
588 | }
589 |
590 | MainInfo PowerObfuscator::findMain(uint8_t* byteArray, uint32_t elfHeaderSize, uint32_t textSegmentEnd)
591 | {
592 | MainInfo mainInfo{};
593 | qDebug() << "----- Searching for module_start in [.lib.ent] Segment -----";
594 |
595 | // HACK(Roulette): fucking hack to get module entry point via nid hash
596 | sys_prx_libent32_t* libEnt = reinterpret_cast(m_libEntSegmentInfo.byteData.data());
597 |
598 | uint32_t firstSubroutine = littleToBigEndian(libEnt->libname);
599 | uint32_t nidTable = littleToBigEndian(libEnt->nidtable);
600 | uint32_t funcTable = littleToBigEndian(libEnt->addtable);
601 | int hashIndex = 0;
602 |
603 | qDebug() << "First Subroutine Address: " << Qt::hex << Qt::showbase << firstSubroutine;
604 | qDebug() << "Nid Table Address: " << Qt::hex << Qt::showbase << nidTable;
605 | qDebug() << "Function Table Address: " << Qt::hex << Qt::showbase << funcTable;
606 |
607 | uint32_t moduleStartNidHash = 0;
608 | memcpy(&moduleStartNidHash, byteArray + elfHeaderSize + (nidTable + (hashIndex * 4)), sizeof(uint32_t));
609 | moduleStartNidHash = littleToBigEndian(moduleStartNidHash);
610 |
611 | uint32_t moduleStartOpd = 0;
612 | memcpy(&moduleStartOpd, byteArray + elfHeaderSize + (funcTable + (hashIndex * 4)), sizeof(uint32_t));
613 | moduleStartOpd = littleToBigEndian(moduleStartOpd);
614 |
615 | qDebug() << "module_start nid Hash: " << Qt::hex << Qt::showbase << moduleStartNidHash;
616 | qDebug() << "module_start opd Address: " << Qt::hex << Qt::showbase << moduleStartOpd;
617 |
618 | if (moduleStartNidHash == nid_module_start)
619 | {
620 | uint32_t moduleStartAddress = 0;
621 | memcpy(&moduleStartAddress, byteArray + elfHeaderSize + moduleStartOpd, sizeof(uint32_t));
622 |
623 | moduleStartAddress = littleToBigEndian(moduleStartAddress);
624 | mainInfo.start = moduleStartAddress;
625 | qDebug() << "module_start Address: " << Qt::hex << Qt::showbase << moduleStartAddress;
626 |
627 | moduleStartAddress += elfHeaderSize;
628 | mainInfo.startWithElfHeader = moduleStartAddress;
629 | qDebug() << "module_start Address with ELF header: " << Qt::hex << Qt::showbase << moduleStartAddress;
630 |
631 | qDebug() << "Searching for end of module_start";
632 | for (uint32_t i = moduleStartAddress; i < textSegmentEnd; i++)
633 | {
634 | // find end of function by searching for 'blr' instruction 4E 80 00 20
635 | if (byteArray[i] == 0x4E && byteArray[i + 1] == 0x80 && byteArray[i + 2] == 0x00 && byteArray[i + 3] == 0x20)
636 | {
637 | mainInfo.endWithElfHeader = i + 3;
638 | mainInfo.end = (i + 3) - elfHeaderSize;
639 |
640 | // Bytes found
641 | qDebug() << "End of function found at: " << Qt::hex << Qt::showbase << mainInfo.end;
642 | qDebug() << "End of function with ELF header found at: " << Qt::hex << Qt::showbase << mainInfo.endWithElfHeader;
643 | break;
644 | }
645 | }
646 | }
647 |
648 | return mainInfo;
649 | }
650 |
651 | SymbolInfo PowerObfuscator::findGlobalVariableBySymbolName(const QString& segmentName, const QString& symbolName, bool* outFound)
652 | {
653 | qDebug() << "----- Searching for " << symbolName << " symbol in [" << segmentName << "] segment -----";
654 |
655 | auto found = std::ranges::find_if(m_symbolsInfo, [&](const SymbolInfo& symInfo) {
656 | return (symInfo.binding == "Global") && (symInfo.type == "Object") && (symInfo.section == segmentName.toStdString()) && (symInfo.name == symbolName.toStdString());
657 | });
658 |
659 | if (found != m_symbolsInfo.end())
660 | {
661 | qDebug() << "Found symbol at offset " << Qt::hex << Qt::showbase << (*found).value << " in [" << segmentName << "] segment";
662 | *outFound = true;
663 | return *found;
664 | }
665 |
666 | qDebug() << "Failed to find " << symbolName << " symbol in [" << segmentName << "] segment";
667 | *outFound = false;
668 | return {};
669 | }
670 |
671 | void PowerObfuscator::saveFileWithPrefix(const QString& filePrefix, uint8_t* byteArray, bool isEncrypted)
672 | {
673 | ui.outputTextEdit->append("Saving obfuscated prx file");
674 | QString obfuscatedFileName = m_qFileInfo.path() + "/" + filePrefix + m_qFileInfo.fileName();
675 |
676 | QFile obfuscatedFile(obfuscatedFileName);
677 | if (obfuscatedFile.open(QIODevice::WriteOnly))
678 | {
679 | QDataStream obfuscatedDataStream(&obfuscatedFile);
680 |
681 | // Write the modified data to the new file
682 | obfuscatedDataStream.writeRawData(reinterpret_cast(byteArray), m_fileSize);
683 |
684 | obfuscatedFile.close();
685 | }
686 |
687 | if (isEncrypted && ui.stripSymbolsCheckBox->checkState() == Qt::Checked)
688 | {
689 | stripSymbolsPrx(obfuscatedFileName.toStdString());
690 | }
691 |
692 | if (isEncrypted && ui.signPRXCheckBox->checkState() == Qt::Checked)
693 | {
694 | QString signedPrxFileName = m_qFileInfo.path() + "/" + filePrefix + m_qFileInfo.baseName() + ".sprx";
695 | signPrx(obfuscatedFileName.toStdString(), signedPrxFileName.toStdString());
696 | }
697 |
698 | ui.outputTextEdit->append(obfuscatedFileName);
699 | }
700 |
701 | void PowerObfuscator::printEncryptionKeyForPrx(const std::vector& keyBytes)
702 | {
703 | ui.outputTextEdit->append("static uint8_t encryptionKey[" + QString::number(keyBytes.size()) + "];");
704 | #if 0
705 | // create int array from 0 to keyBytes.size()
706 | std::vector indices(keyBytes.size());
707 | for (int i = 0; i < keyBytes.size(); i++)
708 | indices[i] = i;
709 |
710 | // shuffle the indices array
711 | std::random_device randomDevice;
712 | std::mt19937 randomEngine(randomDevice());
713 | std::ranges::shuffle(indices, randomEngine);
714 |
715 | // show the shuffled encryption key
716 | for (int i = 0; i < keyBytes.size(); i++)
717 | {
718 | std::string inlineByte = std::format("encryptionKey[{}] = 0x{:02X};", indices[i], keyBytes[indices[i]]);
719 | ui.outputTextEdit->append(QString::fromStdString(inlineByte));
720 | }
721 | #else
722 | // show the encryption key
723 | for (size_t i = 0; i < keyBytes.size(); i++)
724 | {
725 | std::string inlineByte = std::format("encryptionKey[{}] = 0x{:02X};", i, keyBytes[i]);
726 | ui.outputTextEdit->append(QString::fromStdString(inlineByte));
727 | }
728 | #endif
729 | }
730 |
731 | void PowerObfuscator::getElfInfo(const std::string& fileName)
732 | {
733 | /*
734 | Target: PS3 PPU
735 | ELF header :
736 |
737 | File Class : ELFCLASS64
738 | Data Encoding : ELFDATA2MSB
739 | Type : ET_SCE_PPURELEXEC
740 | Machine : PowerPC64
741 | Entry point : 0x0000000000000000
742 | Program Header Offset : 0x0000000000000040
743 | Section Header Offset : 0x0000000000006468
744 | Flags : 0x01000000
745 | Number of Program Headers : 3
746 | Number of Section Headers : 40
747 | Section Header String Index : 26
748 | */
749 | std::string command = "ps3bin.exe --dump-elf-header \"" + fileName + "\"";
750 | std::string result = systemResult(command.c_str());
751 |
752 | ui.outputTextEdit->append("----- ELF Information -----");
753 |
754 | if (result.empty() || result.contains("ERROR: "))
755 | {
756 | ui.outputTextEdit->append(QString::fromStdString(result));
757 | return;
758 | }
759 |
760 | std::istringstream inStringStream(result);
761 | std::string line;
762 |
763 | while (std::getline(inStringStream, line))
764 | {
765 | if (line.contains("File Class:"))
766 | {
767 | m_elfInfo.fileClass = trim(line.substr(line.find(":") + 2));
768 | }
769 | else if (line.contains("Data Encoding:"))
770 | {
771 | m_elfInfo.dataEncoding = trim(line.substr(line.find(":") + 2));
772 | }
773 | else if (line.contains("Type:"))
774 | {
775 | m_elfInfo.type = trim(line.substr(line.find(":") + 2));
776 | }
777 | else if (line.contains("Machine:"))
778 | {
779 | m_elfInfo.machine = trim(line.substr(line.find(":") + 2));
780 | }
781 | else if (line.contains("Entry point:"))
782 | {
783 | m_elfInfo.entryPoint = std::stoull(trim(line.substr(line.find(":") + 2)));
784 | }
785 | else if (line.contains("Program Header Offset:"))
786 | {
787 | m_elfInfo.programHeaderOffset = trim(line.substr(line.find(":") + 2));
788 | }
789 | else if (line.contains("Section Header Offset:"))
790 | {
791 | m_elfInfo.sectionHeaderOffset = trim(line.substr(line.find(":") + 2));
792 | }
793 | else if (line.contains("Flags:"))
794 | {
795 | m_elfInfo.flags = trim(line.substr(line.find(":") + 2));
796 | }
797 | else if (line.contains("Number of Program Headers:"))
798 | {
799 | m_elfInfo.numProgramHeaders = trim(line.substr(line.find(":") + 2));
800 | }
801 | else if (line.contains("Number of Section Headers:"))
802 | {
803 | m_elfInfo.numSectionHeaders = trim(line.substr(line.find(":") + 2));
804 | }
805 | else if (line.contains("Section Header String Index:"))
806 | {
807 | m_elfInfo.sectionHeaderStringIndex = trim(line.substr(line.find(":") + 2));
808 | }
809 | }
810 |
811 | ui.outputTextEdit->append(QString::fromStdString(result));
812 | }
813 |
814 | void PowerObfuscator::getSectionHeaders(const std::string& fileName)
815 | {
816 | /*
817 | Index Name Size Type Address
818 | 0 SHN_UNDEF (0x00000000) SHT_NULL 0x00000000
819 | 1 .text 0x00003014 SHT_PROGBITS 0x00000000
820 | 2 .rela.text 0x000015D8 SHT_SCE_PPURELA 0x00000000
821 | 3 .sceStub.text 0x00000080 SHT_PROGBITS 0x00003014
822 | 4 .rela.sceStub.text 0x000000C0 SHT_SCE_PPURELA 0x00000000
823 | 5 .lib.ent.top 0x00000004 SHT_PROGBITS 0x000030A0
824 | 6 .lib.ent 0x0000001C SHT_PROGBITS 0x000030A4
825 | 7 .rela.lib.ent 0x00000030 SHT_SCE_PPURELA 0x00000000
826 | 8 .lib.ent.btm 0x00000004 SHT_PROGBITS 0x000030C0
827 | 9 .lib.stub.top 0x00000004 SHT_PROGBITS 0x000030C4
828 | 10 .lib.stub 0x0000002C SHT_PROGBITS 0x000030C8
829 | 11 .rela.lib.stub 0x00000048 SHT_SCE_PPURELA 0x00000000
830 | 12 .lib.stub.btm 0x00000004 SHT_PROGBITS 0x000030F4
831 | 13 .rodata.sceModuleInfo 0x00000034 SHT_PROGBITS 0x000030F8
832 | 14 .rela.rodata.sceModul... 0x00000078 SHT_SCE_PPURELA 0x00000000
833 | 15 .rodata.sceResident 0x0000002C SHT_PROGBITS 0x0000312C
834 | 16 .rela.rodata.sceResident 0x00000048 SHT_SCE_PPURELA 0x00000000
835 | 17 .rodata.sceFNID 0x00000010 SHT_PROGBITS 0x00003158
836 | 18 .rodata 0x000003F0 SHT_PROGBITS 0x00003168
837 | 19 .data.sceFStub 0x00000010 SHT_PROGBITS 0x00003560
838 | 20 .rela.data.sceFStub 0x00000060 SHT_SCE_PPURELA 0x00000000
839 | 21 .data 0x00000040 SHT_PROGBITS 0x00003570
840 | 22 .opd 0x000002C8 SHT_PROGBITS 0x000035B0
841 | 23 .rela.opd 0x000010B0 SHT_SCE_PPURELA 0x00000000
842 | 24 .toc 0x00000000 SHT_PROGBITS 0x00003880
843 | 25 .bss (0x00000008) SHT_NOBITS 0x00003880
844 | 26 .shstrtab 0x00000212 SHT_STRTAB 0x00000000
845 | 27 .symtab 0x00001C38 SHT_SYMTAB 0x00000000
846 | 28 .strtab 0x00004274 SHT_STRTAB 0x00000000
847 | 29 .debug_aranges 0x000001F0 SHT_PROGBITS 0x00000000
848 | 30 .debug_pubnames 0x00000A9A SHT_PROGBITS 0x00000000
849 | 31 .debug_info 0x00007247 SHT_PROGBITS 0x00000000
850 | 32 .debug_abbrev 0x0000029B SHT_PROGBITS 0x00000000
851 | 33 .debug_line 0x00000776 SHT_PROGBITS 0x00000000
852 | 34 .debug_str 0x00002AE8 SHT_PROGBITS 0x00000000
853 | 35 .rela.debug_aranges 0x000005A0 SHT_RELA 0x00000000
854 | 36 .rela.debug_pubnames 0x00000018 SHT_RELA 0x00000000
855 | 37 .rela.debug_info 0x00000EA0 SHT_RELA 0x00000000
856 | 38 .rela.debug_line 0x00000870 SHT_RELA 0x00000000
857 | 39 .sceversion 0x00000077 SHT_PROGBITS 0x00000000
858 | */
859 | std::string command = "ps3bin.exe --dump-section-headers \"" + fileName + "\"";
860 | std::string result = systemResult(command.c_str());
861 |
862 | ui.outputTextEdit->append("----- Section Headers -----");
863 |
864 | if (result.empty() || result.contains("ERROR: "))
865 | {
866 | ui.outputTextEdit->append(QString::fromStdString(result));
867 | return;
868 | }
869 |
870 | std::istringstream inStringStream(result);
871 | std::string line;
872 |
873 | // Skip the first line containing column headers
874 | std::getline(inStringStream, line);
875 |
876 | while (std::getline(inStringStream, line))
877 | {
878 | std::istringstream lineStream(line);
879 | SectionInfo section;
880 |
881 | lineStream >> section.index;
882 | lineStream >> section.name;
883 | lineStream >> std::hex >> section.size;
884 | lineStream >> section.type;
885 | lineStream >> std::hex >> section.address;
886 |
887 | #if 0
888 | // Remove leading/trailing white space from values
889 | section.name = trim(section.name);
890 | section.size = trim(section.size);
891 | section.type = trim(section.type);
892 | section.address = trim(section.address);
893 | #endif
894 |
895 | m_sections.push_back(section);
896 | }
897 |
898 | ui.outputTextEdit->append(QString::fromStdString(result));
899 | }
900 |
901 | void PowerObfuscator::getSizeStatistics(const std::string& fileName)
902 | {
903 | /*
904 | Text Size Data Size RO-Data Size BSS Size Total Filename
905 | 12436 792 1208 8 14444 C:\Users\agent\Documents\GitHub\PowerObfuscator\bin\Debug-PS3\PowerObfuscatorSPRX.prx
906 | */
907 | std::string command = "ps3bin.exe --dump-sizes \"" + fileName + "\"";
908 | std::string result = systemResult(command.c_str());
909 |
910 | ui.outputTextEdit->append("----- Segment Sizes -----");
911 |
912 | if (result.empty() || result.contains("ERROR: "))
913 | {
914 | ui.outputTextEdit->append(QString::fromStdString(result));
915 | return;
916 | }
917 |
918 | std::istringstream inStringStream(result);
919 | std::string line;
920 |
921 | // Skip the first line containing column headers
922 | std::getline(inStringStream, line);
923 |
924 | while (std::getline(inStringStream, line))
925 | {
926 | std::istringstream lineStream(line);
927 | lineStream >> m_sizeStats.textSize >> m_sizeStats.dataSize >> m_sizeStats.roDataSize >> m_sizeStats.bssSize >> m_sizeStats.total >> m_sizeStats.fileName;
928 | }
929 |
930 | ui.outputTextEdit->append(QString::fromStdString(result));
931 | }
932 |
933 | void PowerObfuscator::getSymbolInfo(const std::string& fileName)
934 | {
935 | /*
936 | Value Binding Type Section Name
937 | 0x0000000000000000 Local Section .sceversion .sceversion
938 | 0x0000000000000000 Local Object .rodata [local to Main_cpp]::pobf::Vx::vxCplEncryptCharKey
939 | 0x0000000000000000 Local Object .lib.ent.top __begin_of_section_lib_ent
940 | 0x0000000000000000 Local Object .lib.ent.btm __end_of_section_lib_ent
941 | 0x0000000000000000 Local Object .lib.stub.top __begin_of_section_lib_stub
942 | 0x0000000000000000 Local Object .lib.stub.btm __end_of_section_lib_stub
943 | 0x0000000000000000 Local Source File SHN_ABS /home/kanee/svnwork/ps3-svn/svn/sys/trunk/dinkumware/dinkum-pu/source/memcpy.S
944 | 0x0000000000000000 Local Source File SHN_ABS /home/kanee/svnwork/ps3-svn/svn/sys/trunk/dinkumware/dinkum-pu/source/sys/lv2/memset.S
945 | 0x0000000000000000 Local STT_NOTYPE .data.sceFStub _sys_printf.stub_entry
946 | 0x0000000000000000 Local Object .rodata.sceR... _sce_package_version_sysPrxForUser
947 | 0x0000000000000000 Global Function .text ThisFuncShouldBeEncrypted001()
948 | 0x0000000000000000 Global STT_NOTYPE .opd ThisFuncShouldBeEncrypted001()
949 | 0x0000000000000000 Global Object .rodata.sceM... __psp_moduleinfo
950 | 0x0000000000000000 Global Object .data gTestEncryptedThreadId
951 | 0x0000000000000000 Global Function .sceStub.text ._sys_printf
952 | 0x0000000000000000 Global STT_NOTYPE .text __start__Ztext
953 | 0x0000000000000000 Global Object .bss pobf::DumpObfuscation::g_EbootStart
954 | 0x0000000000000000 Global Object .lib.stub _sysPrxForUser_0001_stub_head
955 | 0x0000000000000004 Local Object .rodata ..LNst._Z28ThisFuncShouldBeEncrypted001v.0
956 | 0x0000000000000004 Local STT_NOTYPE .data.sceFStub sys_ppu_thread_exit.stub_entry
957 | 0x0000000000000004 Global Object .bss pobf::DumpObfuscation::g_EbootEnd
958 | 0x0000000000000004 Global Object .rodata.sceR... _sysPrxForUser_stub_str
959 | 0x0000000000000008 Local Object .data LS.10.AGGR.CONST._Z28pobf_vxStringEncrypt_Examplev.1
960 | 0x0000000000000008 Local STT_NOTYPE .data.sceFStub _sys_malloc.stub_entry
961 | 0x0000000000000008 Global STT_NOTYPE .opd ThisFuncShouldBeEncrypted002(int, int)
962 | 0x000000000000000C Local STT_NOTYPE .data.sceFStub _sys_free.stub_entry
963 | 0x0000000000000010 Global STT_NOTYPE .opd ThisFuncShouldBeEncrypted003()
964 | 0x0000000000000014 Local STT_NOTYPE .rodata.sceR... _NONAMEnid_table
965 | 0x0000000000000015 Local Object .data LS.13.AGGR.CONST._Z33pobf_AllStringEncryptions_Examplev.1
966 | 0x0000000000000018 Global STT_NOTYPE .opd MainThread(unsigned long long)
967 | 0x0000000000000020 Local STT_NOTYPE .rodata.sceR... _NONAMEentry_table
968 | 0x0000000000000020 Global STT_NOTYPE .opd pobf_CompileTime_RandomInt_Example()
969 | 0x0000000000000020 Global Function .sceStub.text .sys_ppu_thread_exit
970 | 0x0000000000000024 Local Object .rodata ..LNst._Z28ThisFuncShouldBeEncrypted001v.1
971 | 0x0000000000000028 Global STT_NOTYPE .opd pobf_vxRandom1_Example()
972 | 0x0000000000000030 Local Object .rodata ..LNst._Z28ThisFuncShouldBeEncrypted001v.2
973 | 0x0000000000000030 Global STT_NOTYPE .opd pobf_vxRandom2_Example()
974 | 0x0000000000000038 Global STT_NOTYPE .opd pobf_vxHashing_Example()
975 | 0x000000000000003C Local Object .rodata ..LNst._Z10MainThready.0
976 | 0x0000000000000040 Global STT_NOTYPE .opd pobf_vxStringEncrypt_Example()
977 | 0x0000000000000040 Global Function .sceStub.text ._sys_malloc
978 | 0x0000000000000048 Local Object .rodata ..LNst._Z10MainThready.1
979 | 0x0000000000000048 Global STT_NOTYPE .opd pobf_AllStringEncryptions_Example()
980 | 0x0000000000000050 Global STT_NOTYPE .opd pobf_DumpObfuscation_Example()
981 | 0x0000000000000058 Global STT_NOTYPE .opd size_of_dot_text()
982 | 0x000000000000005C Local Object .rodata ..LNst._Z34pobf_CompileTime_RandomInt_Examplev.0
983 | 0x0000000000000060 Global STT_NOTYPE .opd PowerObfuscatorSPRXMain
984 | 0x0000000000000060 Global Function .sceStub.text ._sys_free
985 | 0x0000000000000068 Global STT_NOTYPE .opd PowerObfuscatorSPRXStop
986 | 0x0000000000000070 Weak STT_NOTYPE .opd std::_String_val>::_String_val(std::allocator)
987 | 0x0000000000000078 Weak STT_NOTYPE .opd std::_String_val>::_String_val(std::allocator)
988 | 0x0000000000000080 Local Object .rodata ..LNst._Z34pobf_CompileTime_RandomInt_Examplev.1
989 | 0x0000000000000080 Weak STT_NOTYPE .opd std::char_traits::copy(char*, char const*, unsigned int)
990 | 0x0000000000000088 Weak STT_NOTYPE .opd std::allocator::deallocate(char*, unsigned int)
991 | 0x0000000000000090 Global Function .text ThisFuncShouldBeEncrypted002(int, int)
992 | 0x0000000000000090 Weak STT_NOTYPE .opd std::basic_string, std::allocator>::_Myptr()
993 | 0x0000000000000098 Weak STT_NOTYPE .opd std::char_traits::assign(char&, char const&)
994 | 0x000000000000009C Local Object .rodata ..LNst._Z34pobf_CompileTime_RandomInt_Examplev.2
995 | 0x00000000000000A0 Weak STT_NOTYPE .opd std::basic_string, std::allocator>::_Eos(unsigned int)
996 | 0x00000000000000A8 Weak STT_NOTYPE .opd std::basic_string, std::allocator>::_Tidy(bool, unsigned int)
997 | 0x00000000000000B0 Weak STT_NOTYPE .opd std::_String_base::_Xlen() const
998 | 0x00000000000000B8 Local Object .rodata ..LNst._Z34pobf_CompileTime_RandomInt_Examplev.3
999 | 0x00000000000000B8 Weak STT_NOTYPE .opd std::allocator::max_size() const
1000 | 0x00000000000000C0 Weak STT_NOTYPE .opd std::basic_string, std::allocator>::max_size() const
1001 | 0x00000000000000C8 Weak STT_NOTYPE .opd char* std::_Allocate(unsigned int, char*)
1002 | 0x00000000000000D0 Weak STT_NOTYPE .opd std::allocator::allocate(unsigned int)
1003 | 0x00000000000000D8 Local Object .rodata ..LNst._Z34pobf_CompileTime_RandomInt_Examplev.4
1004 | 0x00000000000000D8 Weak STT_NOTYPE .opd std::basic_string, std::allocator>::_Copy(unsigned int, unsigned int)
1005 | 0x00000000000000DC Global Function .text ThisFuncShouldBeEncrypted003()
1006 | */
1007 | std::string command = "ps3bin.exe --dump-symbols \"" + fileName + "\"";
1008 | std::string result = systemResult(command.c_str());
1009 |
1010 | ui.outputTextEdit->append("----- Symbol Information -----");
1011 |
1012 | if (result.empty() || result.contains("ERROR: ") || result.contains("WARNING: "))
1013 | {
1014 | ui.outputTextEdit->append(QString::fromStdString(result));
1015 | return;
1016 | }
1017 |
1018 | std::istringstream inStringStream(result);
1019 | std::string line;
1020 |
1021 | // Skip the first line containing column headers
1022 | std::getline(inStringStream, line);
1023 |
1024 | while (std::getline(inStringStream, line))
1025 | {
1026 | std::istringstream lineStream(line);
1027 | SymbolInfo symbolInfo;
1028 |
1029 | lineStream >> std::hex >> symbolInfo.value;
1030 | lineStream >> symbolInfo.binding;
1031 | lineStream >> symbolInfo.type;
1032 | lineStream >> symbolInfo.section;
1033 | lineStream >> symbolInfo.name;
1034 |
1035 | m_symbolsInfo.push_back(symbolInfo);
1036 | }
1037 |
1038 | // Find entry point function symbol
1039 | auto found = std::ranges::find_if(m_symbolsInfo, [this](const SymbolInfo& symInfo) {
1040 | return (symInfo.section == ".text") && (symInfo.type == "Function") && (symInfo.value == m_elfInfo.entryPoint);
1041 | });
1042 |
1043 | // Only display entry point symbol
1044 | std::string str = std::format("Entry Point Symbol: {0}\n", (*found).name);
1045 |
1046 | ui.outputTextEdit->append(QString::fromStdString(str));
1047 | }
1048 |
1049 | void PowerObfuscator::getSegmentInfo(const std::string& fileName, const std::string& segmentName, SegmentInfo& segmentInfo)
1050 | {
1051 | /*
1052 | 6 - .lib.ent:
1053 | Type: SHT_PROGBITS (0x00000001)
1054 | Flags: SHF_ALLOC
1055 | Address: 0x00000000000030A4 | Offset: 0x0000000000003194
1056 | Size: 0x000000000000001C | Link: 0x00000000
1057 | Info: 0x00000000 | Align: 0x0000000000000004
1058 | Entry Size: 0x0000000000000000
1059 |
1060 | 0x000030A4 1C 00 00 00 80 00 00 02 00 01 00 00 00 00 00 00 ................
1061 | 0x000030B4 00 00 00 00 00 00 31 40 00 00 31 4C ......1@..1L
1062 | */
1063 | std::string command = "ps3bin.exe --dump-sections=" + segmentName + " --hex \"" + fileName + "\"";
1064 | std::string result = systemResult(command.c_str());
1065 |
1066 | ui.outputTextEdit->append("----- Segment Info -----");
1067 |
1068 | if (result.empty() || result.contains("ERROR: ") || result.contains("WARNING: "))
1069 | {
1070 | ui.outputTextEdit->append(QString::fromStdString(result));
1071 | return;
1072 | }
1073 |
1074 | // Extract section information
1075 | std::vector lines = splitString(result, '\n');
1076 | for (const std::string& line : lines)
1077 | {
1078 | if (line.contains("Type:"))
1079 | {
1080 | std::vector tokens = splitString(line, ':');
1081 | segmentInfo.type = tokens[1];
1082 | }
1083 | else if (line.contains("Flags:"))
1084 | {
1085 | std::vector tokens = splitString(line, ':');
1086 | segmentInfo.flags = tokens[1];
1087 | }
1088 | else if (line.contains("Address:"))
1089 | {
1090 | std::vector tokens = splitString(line, '|');
1091 | segmentInfo.address = tokens[0];
1092 | segmentInfo.offset = tokens[1];
1093 | }
1094 | else if (line.contains("Size:"))
1095 | {
1096 | std::vector tokens = splitString(line, ':');
1097 | segmentInfo.size = tokens[1];
1098 | }
1099 | else if (line.contains("Link:"))
1100 | {
1101 | std::vector tokens = splitString(line, ':');
1102 | segmentInfo.link = tokens[1];
1103 | }
1104 | else if (line.contains("Info:"))
1105 | {
1106 | std::vector tokens = splitString(line, ':');
1107 | segmentInfo.info = tokens[1];
1108 | }
1109 | else if (line.contains("Align:"))
1110 | {
1111 | std::vector tokens = splitString(line, ':');
1112 | segmentInfo.align = tokens[1];
1113 | }
1114 | else if (line.contains("Entry Size:"))
1115 | {
1116 | std::vector tokens = splitString(line, ':');
1117 | segmentInfo.entrySize = tokens[1];
1118 | }
1119 | }
1120 |
1121 | segmentInfo.byteData = parseHexDump(result);
1122 |
1123 |
1124 | ui.outputTextEdit->append(QString::fromStdString(result));
1125 | }
1126 |
1127 | void PowerObfuscator::stripSymbolsPrx(const std::string& fileName)
1128 | {
1129 | std::string command = "ps3bin.exe --strip-all \"" + fileName + "\"";
1130 | std::string result = systemResult(command.c_str());
1131 |
1132 | ui.outputTextEdit->append("Stripping symbols");
1133 |
1134 | if (result.empty() || result.contains("ERROR: ") || result.contains("WARNING: "))
1135 | {
1136 | ui.outputTextEdit->append(QString::fromStdString(result));
1137 | return;
1138 | }
1139 | }
1140 |
1141 | void PowerObfuscator::signPrx(const std::string& inFileName, const std::string& outFileName)
1142 | {
1143 | std::string command = "scetool.exe -0 SELF -1 TRUE -s FALSE -2 0A -3 1070000052000001 -4 01000002 -5 APP -6 0003004000000000 -A 0001000000000000 --self-ctrl-flags 4000000000000000000000000000000000000000000000000000000000000002 -e \"" + inFileName + "\"" + " \"" + outFileName + "\"";
1144 |
1145 | systemResult(command.c_str());
1146 |
1147 | ui.outputTextEdit->append("Signing prx");
1148 | }
1149 |
1150 | std::string PowerObfuscator::systemResult(const char* cmd)
1151 | {
1152 | std::array buffer;
1153 | std::string result;
1154 | std::unique_ptr pipe(_popen(cmd, "r"), _pclose);
1155 |
1156 | if (!pipe)
1157 | throw std::runtime_error("popen() failed!");
1158 |
1159 | while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
1160 | result += buffer.data();
1161 |
1162 | return result;
1163 | }
1164 |
1165 | std::string PowerObfuscator::trim(std::string_view str)
1166 | {
1167 | // Lambda function to check if a character is a whitespace character
1168 | auto isSpace = [](char ch) { return std::isspace(ch); };
1169 |
1170 | // Create a view of the input string and apply range adaptors
1171 | auto trimmedRange = str |
1172 | std::views::drop_while(isSpace) | // Drop leading whitespace
1173 | std::views::reverse | // Reverse the order of elements
1174 | std::views::drop_while(isSpace) | // Drop trailing whitespace
1175 | std::views::reverse; // Reverse back to original order
1176 |
1177 | return std::ranges::to(trimmedRange);
1178 | }
1179 |
1180 | std::string PowerObfuscator::generateRandomEncryptionKey()
1181 | {
1182 | std::string characters = "0123456789ABCDEF";
1183 | std::string encryptionKey;
1184 | std::random_device randomDevice;
1185 | std::mt19937 randomEngine(randomDevice());
1186 |
1187 | std::uniform_int_distribution distribution(0, characters.size() - 1);
1188 |
1189 | for (int i = 0; i < 64 * 2; i++)
1190 | encryptionKey += characters[distribution(randomEngine)];
1191 |
1192 | return encryptionKey;
1193 | }
1194 |
1195 | std::vector PowerObfuscator::hexStringToBytes(const std::string& hexString)
1196 | {
1197 | std::vector bytes;
1198 |
1199 | for (size_t i = 0; i < hexString.length(); i += 2)
1200 | {
1201 | std::string byteString = hexString.substr(i, 2);
1202 |
1203 | // Check if the byteString consists of valid hex characters
1204 | bool isValidHex = std::all_of(byteString.begin(), byteString.end(), ::isxdigit);
1205 |
1206 | if (!isValidHex)
1207 | {
1208 | QMessageBox::critical(this, windowTitle(), "Key contains invalid hex value.");
1209 | return {};
1210 | }
1211 |
1212 | uint8_t byte = static_cast(std::stoi(byteString, nullptr, 16));
1213 | bytes.push_back(byte);
1214 | }
1215 |
1216 | return bytes;
1217 | }
1218 |
1219 | std::vector PowerObfuscator::splitString(const std::string& str, char delimiter)
1220 | {
1221 | std::vector tokens;
1222 | std::istringstream inStringStream(str);
1223 | std::string token;
1224 | while (std::getline(inStringStream, token, delimiter))
1225 | {
1226 | tokens.push_back(token);
1227 | }
1228 | return tokens;
1229 | }
1230 |
1231 | std::vector PowerObfuscator::parseHexDump(const std::string& hexDump)
1232 | {
1233 | std::vector bytes;
1234 | std::istringstream inStringStream(hexDump);
1235 | std::string line;
1236 |
1237 | // Parse the hex values and add them to the byte vector
1238 | while (std::getline(inStringStream, line))
1239 | {
1240 | if (line.substr(0, 2) == "0x")
1241 | {
1242 | std::istringstream hexStream(line.substr(10));
1243 | std::string byteString;
1244 | while (hexStream >> byteString)
1245 | {
1246 | try
1247 | {
1248 | uint8_t byte = static_cast(std::stoul(byteString, nullptr, 16));
1249 | bytes.push_back(byte);
1250 | }
1251 | catch (const std::invalid_argument&)
1252 | {
1253 | // Skip non-hexadecimal characters
1254 | }
1255 | }
1256 | }
1257 | }
1258 |
1259 | return bytes;
1260 | }
1261 |
1262 | uint32_t PowerObfuscator::bigToLittleEndian(uint32_t value)
1263 | {
1264 | return std::endian::native == std::endian::big ? value : std::byteswap(value);
1265 | }
1266 |
1267 | uint32_t PowerObfuscator::littleToBigEndian(uint32_t value)
1268 | {
1269 | return std::endian::native == std::endian::big ? value : std::byteswap(value);
1270 | }
1271 |
1272 | bool PowerObfuscator::IsHexString(const std::string& input)
1273 | {
1274 | const std::regex hexRegex("^[0-9a-fA-F]+$");
1275 |
1276 | return std::regex_match(input, hexRegex);
1277 | }
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscator.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 | #include
16 | #include
17 | #include
18 |
19 | #include
20 |
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include "ui_PowerObfuscator.h"
27 |
28 | struct ElfInfo
29 | {
30 | std::string fileClass;
31 | std::string dataEncoding;
32 | std::string type;
33 | std::string machine;
34 | uint64_t entryPoint;
35 | std::string programHeaderOffset;
36 | std::string sectionHeaderOffset;
37 | std::string flags;
38 | std::string numProgramHeaders;
39 | std::string numSectionHeaders;
40 | std::string sectionHeaderStringIndex;
41 | };
42 |
43 | struct SectionInfo
44 | {
45 | int index;
46 | std::string name;
47 | uint32_t size; // FIXME(Roulette): This should be std::string because some sizes have parentheses. Specifically .bss segment so if you encounter a bug when reading .bss it's because of this code
48 | std::string type;
49 | uint32_t address;
50 | };
51 |
52 | struct SizeStatistics
53 | {
54 | uint64_t textSize;
55 | uint64_t dataSize;
56 | uint64_t roDataSize;
57 | uint64_t bssSize;
58 | uint64_t total;
59 | std::string fileName;
60 | };
61 |
62 | struct SymbolInfo
63 | {
64 | uint64_t value; // symbol offset in section
65 | std::string binding;
66 | std::string type;
67 | std::string section;
68 | std::string name;
69 | };
70 |
71 | struct SegmentInfo
72 | {
73 | std::string type;
74 | std::string flags;
75 | std::string address;
76 | std::string offset;
77 | std::string size;
78 | std::string link;
79 | std::string info;
80 | std::string align;
81 | std::string entrySize;
82 | std::vector byteData;
83 | };
84 |
85 | struct MainInfo
86 | {
87 | uint32_t start;
88 | uint32_t end;
89 | uint32_t startWithElfHeader;
90 | uint32_t endWithElfHeader;
91 | };
92 |
93 | struct pobfHeader
94 | {
95 | char magic[4];
96 | uint32_t signature1;
97 | uint32_t signature2;
98 | uint32_t signature3;
99 | uint32_t textSegmentStart;
100 | uint32_t textSegmentSize;
101 | uint32_t _padding1;
102 | uint32_t dataSegmentStart;
103 | uint32_t dataSegmentSize;
104 | uint32_t _padding2;
105 | uint32_t rodataStart;
106 | uint32_t rodataSize;
107 | uint32_t _padding3;
108 | uint32_t placeHolder1;
109 | uint32_t placeHolder2;
110 | uint32_t _padding4;
111 | char placeHolder5[60];
112 | };
113 |
114 | #define POBF_MAGIC 'P', 'O', 'B', 'F'
115 | #define POBF_SIGNATURE littleToBigEndian(0xAABBCCDD), littleToBigEndian(0x12345678), littleToBigEndian(0xEEFFEEFF)
116 | // these values will be replaced by fixHeader()
117 | #define POBF_TEXT_SEGMENT_DUMMY_VALUES littleToBigEndian(0xDEADBEEF), littleToBigEndian(0x0BADCAFE), littleToBigEndian(0x00DDBA11)
118 | #define POBF_DATA_SEGMENT_DUMMY_VALUES littleToBigEndian(0x5CA1AB1E), littleToBigEndian(0x0DEC0DED), littleToBigEndian(0x00EFFEC7)
119 | #define POBF_RODATA_SEGMENT_DUMMY_VALUES littleToBigEndian(0x5E1EC7ED), littleToBigEndian(0x05EEDBED), littleToBigEndian(0x05CABB1E)
120 | #define POBF_PLACEHOLDER_DUMMY_VALUES littleToBigEndian(0x00FF5E75), littleToBigEndian(0x0001ABE1), littleToBigEndian(0x000F100D)
121 |
122 |
123 |
124 | // from #include
125 | typedef struct sys_prx_libent32_t {
126 | unsigned char structsize; /* 28 */
127 | unsigned char reserved1[1];
128 | unsigned short version;
129 | unsigned short attribute;
130 | unsigned short nfunc;
131 | unsigned short nvar;
132 | unsigned short ntls;
133 | unsigned char hashinfo; /* funchashinfo + (varhashinfo << 4) */
134 | unsigned char hashinfo2; /* tls */
135 | unsigned char reserved2[1];
136 | unsigned char nidaltsets; /* number of alternate nid set */
137 | uint32_t libname;
138 | uint32_t nidtable;
139 | uint32_t addtable;
140 | } sys_prx_libent32_t;
141 |
142 | #define nid_module_prologue 0x0D10FD3F
143 | #define nid_module_epilogue 0x330F7005
144 | #define nid_module_exit 0x3AB9A95E
145 | #define nid_module_start 0xBC9A0086
146 | #define nid_module_stop 0xAB779874
147 | #define nid_module_info 0xD7F43016
148 |
149 |
150 | struct DeobfuscateSegmentInfo
151 | {
152 | QString segmentName;
153 | uint32_t segmentAddressStart;
154 | uint32_t segmentAddressEnd;
155 | std::vector segmentEncryptionKey;
156 | };
157 |
158 | class PowerObfuscator : public QMainWindow
159 | {
160 | Q_OBJECT
161 |
162 | public:
163 | PowerObfuscator(QWidget *parent = nullptr);
164 | ~PowerObfuscator();
165 |
166 | public:
167 | void getElfInfo(const std::string& fileName);
168 | void getSectionHeaders(const std::string& fileName);
169 | void getSizeStatistics(const std::string& fileName);
170 | void getSymbolInfo(const std::string& fileName);
171 | void getSegmentInfo(const std::string& fileName, const std::string& segmentName, SegmentInfo& segmentInfo);
172 | void stripSymbolsPrx(const std::string& fileName);
173 | void signPrx(const std::string& inFileName, const std::string& outFileName);
174 | bool obfuscateSegment(const QString& segmentName, uint8_t* byteArray, const std::vector& encryptionKey);
175 | bool deobfuscateSegment(const QString& segmentName, uint8_t* byteArray, const std::vector& encryptionKey, uint32_t segmentAddressStart, uint32_t segmentAddressEnd);
176 |
177 | bool skipLast2Bytes(uint32_t iterator);
178 |
179 | /***
180 | * @brief skip the last 2 bytes of these instructions because that's where strings and functions are dynamically loaded
181 | */
182 | bool skipInstructionsWithStringOrPointerReference(uint8_t* byteArray, uint32_t textSegmentStart, uint32_t textSegmentEnd, MainInfo& mainInfo, uint32_t offsetToCompare);
183 |
184 | bool fixHeader(uint8_t* byteArray, const QString& segmentNameInSymbol, const QString& symbolName);
185 | uint32_t geBinaryOffsetFromSegment(const QString& segmentName);
186 | MainInfo findMain(uint8_t* byteArray, uint32_t elfHeaderSize, uint32_t textSegmentEnd);
187 | SymbolInfo findGlobalVariableBySymbolName(const QString& segmentName, const QString& symbolName, bool* outFound);
188 | void saveFileWithPrefix(const QString& filePrefix, uint8_t* byteArray, bool isEncrypted);
189 |
190 | /***
191 | * @brief calls a terminal command then returns the result
192 | */
193 | std::string systemResult(const char* cmd);
194 |
195 | /***
196 | * @brief removes white space from text
197 | */
198 | std::string trim(std::string_view str);
199 |
200 | std::string generateRandomEncryptionKey();
201 | void printEncryptionKeyForPrx(const std::vector& keyBytes);
202 |
203 | /***
204 | * @brief convert 5A5A5A5A5A5A5A5A5A5A5A5A into a uint8_t array
205 | */
206 | std::vector hexStringToBytes(const std::string& hexString);
207 |
208 | std::vector splitString(const std::string& str, char delimiter);
209 |
210 | /***
211 | * @brief convert hex dump into a uint8_t array
212 | * 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A
213 | * 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A
214 | * 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A
215 | */
216 | std::vector parseHexDump(const std::string& hexDump);
217 |
218 | /***
219 | * @brief convert a 32-bit integer from big-endian to little-endian
220 | */
221 | uint32_t bigToLittleEndian(uint32_t value);
222 |
223 | /***
224 | * @brief convert a 32-bit integer from little-endian to big-endian
225 | */
226 | uint32_t littleToBigEndian(uint32_t value);
227 |
228 | /***
229 | * @breif checks if string has hexadecimal characters
230 | */
231 | bool IsHexString(const std::string& input);
232 |
233 | public slots:
234 | void openFile(const QString& fileName);
235 |
236 | private slots:
237 | void on_loadPrxButton_clicked();
238 | void on_obfuscateButton_clicked();
239 | void on_deobfuscateButton_clicked();
240 | void on_addSegmentsToListButton_clicked();
241 | void on_generateRandomEncryptionKeyButton_clicked();
242 |
243 | private:
244 | Ui::PowerObfuscatorClass ui;
245 | QDir m_currentDir;
246 | bool m_doesfileExist{};
247 | bool m_isPrx{};
248 | quint64 m_fileSize{};
249 | ElfInfo m_elfInfo;
250 | std::vector m_sections;
251 | SizeStatistics m_sizeStats;
252 | std::vector m_symbolsInfo;
253 | SegmentInfo m_libEntSegmentInfo;
254 | QFile m_qFile;
255 | QFileInfo m_qFileInfo;
256 | QDataStream m_qDataStream;
257 | QByteArray m_qBytesArray;
258 | std::vector m_segmentsToDeobfuscate;
259 | };
260 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscator.qrc:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscator.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | PowerObfuscatorClass
4 |
5 |
6 |
7 | 0
8 | 0
9 | 710
10 | 552
11 |
12 |
13 |
14 |
15 | 0
16 | 0
17 |
18 |
19 |
20 | PowerObfuscator
21 |
22 |
23 |
24 |
25 | 0
26 | 0
27 |
28 |
29 |
30 |
31 |
32 | 10
33 | 10
34 | 91
35 | 30
36 |
37 |
38 |
39 | Load PRX
40 |
41 |
42 |
43 |
44 |
45 | 110
46 | 10
47 | 591
48 | 30
49 |
50 |
51 |
52 |
53 |
54 |
55 | 10
56 | 310
57 | 691
58 | 231
59 |
60 |
61 |
62 | true
63 |
64 |
65 |
66 |
67 |
68 | 350
69 | 50
70 | 351
71 | 251
72 |
73 |
74 |
75 | Deobfuscate
76 |
77 |
78 |
79 |
80 | 10
81 | 150
82 | 181
83 | 30
84 |
85 |
86 |
87 |
88 | 12
89 |
90 |
91 |
92 | Segment Encryption Key
93 |
94 |
95 |
96 |
97 |
98 | 190
99 | 60
100 | 151
101 | 31
102 |
103 |
104 |
105 |
106 |
107 |
108 | 190
109 | 100
110 | 151
111 | 31
112 |
113 |
114 |
115 |
116 |
117 |
118 | 190
119 | 140
120 | 151
121 | 61
122 |
123 |
124 |
125 |
126 |
127 |
128 | 10
129 | 20
130 | 171
131 | 30
132 |
133 |
134 |
135 |
136 | 12
137 |
138 |
139 |
140 | Segment Name
141 |
142 |
143 |
144 |
145 |
146 | 10
147 | 60
148 | 171
149 | 30
150 |
151 |
152 |
153 |
154 | 12
155 |
156 |
157 |
158 | Segment Address Start
159 |
160 |
161 |
162 |
163 |
164 | 10
165 | 100
166 | 171
167 | 30
168 |
169 |
170 |
171 |
172 | 12
173 |
174 |
175 |
176 | Segment Address End
177 |
178 |
179 |
180 |
181 |
182 | 10
183 | 210
184 | 171
185 | 30
186 |
187 |
188 |
189 | Deobfuscate Segments
190 |
191 |
192 |
193 |
194 |
195 | 190
196 | 210
197 | 151
198 | 30
199 |
200 |
201 |
202 | Add Segment To List
203 |
204 |
205 |
206 |
207 |
208 | 190
209 | 20
210 | 151
211 | 31
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 | 10
220 | 50
221 | 331
222 | 181
223 |
224 |
225 |
226 | Obfuscate
227 |
228 |
229 |
230 |
231 | 190
232 | 100
233 | 121
234 | 31
235 |
236 |
237 |
238 |
239 | 12
240 |
241 |
242 |
243 | Sign PRX
244 |
245 |
246 |
247 |
248 |
249 | 190
250 | 70
251 | 131
252 | 31
253 |
254 |
255 |
256 |
257 | 12
258 |
259 |
260 |
261 | Strip Symbols
262 |
263 |
264 |
265 |
266 |
267 | 190
268 | 140
269 | 131
270 | 30
271 |
272 |
273 |
274 | Obfuscate
275 |
276 |
277 |
278 |
279 |
280 | 10
281 | 50
282 | 171
283 | 121
284 |
285 |
286 |
287 |
288 |
289 |
290 | 10
291 | 20
292 | 111
293 | 31
294 |
295 |
296 |
297 |
298 | 12
299 |
300 |
301 |
302 | Encryption Key
303 |
304 |
305 |
306 |
307 |
308 |
309 | 20
310 | 270
311 | 91
312 | 41
313 |
314 |
315 |
316 |
317 | 14
318 |
319 |
320 |
321 | Output
322 |
323 |
324 |
325 |
326 |
327 | 10
328 | 239
329 | 331
330 | 31
331 |
332 |
333 |
334 | Generate Random Encryption Key
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscatorGUI.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | x64
7 |
8 |
9 | Release
10 | x64
11 |
12 |
13 |
14 | {C59C4CDE-CF36-4453-903F-3657B83D95B4}
15 | QtVS_v304
16 | 10.0
17 | 10.0
18 | $(MSBuildProjectDirectory)\QtMsBuild
19 |
20 |
21 |
22 | Application
23 | v143
24 |
25 |
26 | Application
27 | v143
28 |
29 |
30 |
31 |
32 |
33 |
34 | 6.6.0_msvc2019_64
35 | core;gui;widgets
36 | debug
37 |
38 |
39 | 6.6.0_msvc2019_64
40 | core;gui;widgets
41 | release
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
59 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
60 |
61 |
62 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
63 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
64 |
65 |
66 |
67 |
68 |
69 |
70 | stdc17
71 | stdcpplatest
72 |
73 |
74 |
75 |
76 | stdcpplatest
77 |
78 |
79 |
80 |
81 | stdc17
82 |
83 |
84 |
85 |
86 | true
87 | true
88 | ProgramDatabase
89 | Disabled
90 | MultiThreadedDebugDLL
91 |
92 |
93 | Windows
94 | true
95 |
96 |
97 |
98 |
99 | true
100 | true
101 | None
102 | MaxSpeed
103 | MultiThreadedDLL
104 |
105 |
106 | Windows
107 | false
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/PowerObfuscatorGUI.vcxproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 |
6 |
7 | 2023-07-09T09:31:16.4484988Z
8 |
9 |
10 | 2023-07-09T09:31:17.1489062Z
11 |
12 |
--------------------------------------------------------------------------------
/PowerObfuscatorGUI/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include "PowerObfuscator.h"
2 | #include
3 | #include
4 | #include
5 | #include
6 |
7 | int main(int argc, char *argv[])
8 | {
9 | QApplication a(argc, argv);
10 |
11 | Qt::ColorScheme colorScheme = a.styleHints()->colorScheme();
12 | if (colorScheme == Qt::ColorScheme::Dark)
13 | {
14 | a.setStyle(QStyleFactory::create("Fusion"));
15 |
16 | // Dark Mode
17 | QPalette darkPalette;
18 | darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
19 | darkPalette.setColor(QPalette::WindowText, Qt::white);
20 | darkPalette.setColor(QPalette::Base, QColor(25, 25, 25));
21 | darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
22 | darkPalette.setColor(QPalette::ToolTipBase, Qt::white);
23 | darkPalette.setColor(QPalette::ToolTipText, Qt::white);
24 | darkPalette.setColor(QPalette::Text, Qt::white);
25 | darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
26 | darkPalette.setColor(QPalette::ButtonText, Qt::white);
27 | darkPalette.setColor(QPalette::BrightText, Qt::red);
28 | darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));
29 | darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));
30 | darkPalette.setColor(QPalette::HighlightedText, Qt::black);
31 | a.setPalette(darkPalette);
32 | }
33 |
34 | PowerObfuscator w;
35 | w.show();
36 | return a.exec();
37 | }
38 |
--------------------------------------------------------------------------------
/PowerObfuscatorSPRX/src/Main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 |
9 | SYS_MODULE_INFO( PowerObfuscatorSPRX, 0, 1, 1);
10 | SYS_MODULE_START( PowerObfuscatorSPRXMain );
11 | SYS_MODULE_STOP( PowerObfuscatorSPRXStop );
12 |
13 |
14 | sys_ppu_thread_t gTestEncryptedThreadId = SYS_PPU_THREAD_ID_INVALID;
15 |
16 |
17 |
18 | void ThisFuncShouldBeEncrypted001();
19 | int ThisFuncShouldBeEncrypted002(int left, int right);
20 | void ThisFuncShouldBeEncrypted003();
21 |
22 | NO_INLINE void ThisFuncShouldBeEncrypted001()
23 | {
24 | printf("ThisFuncShouldBeEncrypted001\n");
25 |
26 | int value = ThisFuncShouldBeEncrypted002(800, 255);
27 | printf("value: %d\n", value);
28 |
29 | int value2 = ThisFuncShouldBeEncrypted002(450, 2896);
30 | printf("value2: %d\n", value2);
31 | }
32 |
33 | NO_INLINE int ThisFuncShouldBeEncrypted002(int left, int right)
34 | {
35 | int value = left * right;
36 | return value;
37 | }
38 |
39 | NO_INLINE void ThisFuncShouldBeEncrypted003()
40 | {
41 | ThisFuncShouldBeEncrypted001();
42 | ThisFuncShouldBeEncrypted001();
43 | }
44 |
45 | void MainThread(uint64_t arg)
46 | {
47 | printf("Hello from MainThread\n");
48 |
49 | ThisFuncShouldBeEncrypted003();
50 |
51 | sys_ppu_thread_exit(0);
52 | }
53 |
54 |
55 | void pobf_CompileTime_RandomInt_Example()
56 | {
57 | printf("pobf_CompileTime_RandomInt_Example\n");
58 |
59 | // Bernoulli engine is not fully implemented
60 | //pobf::Integer_MetaRand::CMetaUInt_PrintRandoms<10, typename pobf::Integer_MetaRand::Bernoulli, 1, 10>>::type >::print();
61 |
62 |
63 | // Meta Random
64 | pobf::Integer_MetaRand::CMetaUInt_PrintRandoms<15, typename pobf::Integer_MetaRand::CMetaUInt_Random>::type >::print();
65 |
66 |
67 | // Last template argument is the random seed. It is optional.
68 | typedef pobf::Integer_MetaRand::CMetaUInt_init>::type X;
69 |
70 | // Prints the first random number
71 | typedef pobf::Integer_MetaRand::CMetaUInt_Next::type X0;
72 | printf("CMetaUInt_Next: 0x%X\n", X0::value);
73 |
74 | // Prints the second random number
75 | typedef pobf::Integer_MetaRand::CMetaUInt_Next::type X1;
76 | printf("CMetaUInt_Next: 0x%X\n", X1::value);
77 |
78 | unsigned int randomInt1 = pobf::Integer_MetaRand::RandomCompileTimeInteger1::value;
79 | unsigned int randomInt2 = pobf::Integer_MetaRand::RandomCompileTimeInteger2::value;
80 | unsigned int randomInt3 = pobf::Integer_MetaRand::RandomCompileTimeInteger3::value;
81 | unsigned int randomInt4 = pobf::Integer_MetaRand::RandomCompileTimeInteger4::value;
82 | unsigned int randomInt5 = pobf::Integer_MetaRand::RandomCompileTimeInteger5::value;
83 |
84 | printf("RandomCompileTimeInteger1 0x%X\n", randomInt1);
85 | printf("RandomCompileTimeInteger2 0x%X\n", randomInt2);
86 | printf("RandomCompileTimeInteger3 0x%X\n", randomInt3);
87 | printf("RandomCompileTimeInteger4 0x%X\n", randomInt4);
88 | printf("RandomCompileTimeInteger5 0x%X\n", randomInt5);
89 | }
90 |
91 | void pobf_vxRandom1_Example()
92 | {
93 | printf("pobf_vxRandom1_Example\n");
94 |
95 | switch (vxRANDOM(1, 4))
96 | {
97 | case 1: { printf("exampleRandom1: Code path 1!\n"); break; }
98 | case 2: { printf("exampleRandom1: Code path 2!\n"); break; }
99 | case 3: { printf("exampleRandom1: Code path 3!\n"); break; }
100 | case 4: { printf("exampleRandom1: Code path 4!\n"); break; }
101 | default: { printf("Fucking poltergeist!\n"); }
102 | }
103 | }
104 |
105 | // A small random code generator example
106 | void pobf_vxRandom2_Example()
107 | {
108 | printf("pobf_vxRandom2_Example\n");
109 |
110 | volatile uint32_t RndVal = vxRANDOM(0, 100);
111 | if (vxRAND() % 2) { RndVal += vxRANDOM(0, 100); }
112 | else { RndVal -= vxRANDOM(0, 200); }
113 | printf("exampleRandom2: %d\n", RndVal);
114 | }
115 |
116 | // A small string hashing example
117 | void pobf_vxHashing_Example()
118 | {
119 | printf("pobf_vxHashing_Example\n");
120 |
121 | printf("exampleHashing: 0x%08X\n", vxHASH("hello world!"));
122 | printf("exampleHashing: 0x%08X\n", vxHASH("HELLO WORLD!"));
123 | }
124 |
125 | void pobf_vxStringEncrypt_Example()
126 | {
127 | printf("pobf_vxStringEncrypt_Example\n");
128 |
129 | printf("exampleEncryption: %s\n", vxENCRYPT("Hello world!"));
130 | }
131 |
132 | void pobf_AllStringEncryptions_Example()
133 | {
134 | printf("pobf_AllStringEncryptions_Example\n");
135 |
136 | printf("ENCRYPTSTRV1 %s\n", ENCRYPTSTRV1("this string will be encrypted using V1"));
137 |
138 | printf("ENCRYPTSTRV2 %s\n", ENCRYPTSTRV2("this string will be encrypted using V2"));
139 |
140 | printf("ENCRYPTSTRV3 %s\n", ENCRYPTSTRV3("this string will be encrypted using V3"));
141 | }
142 |
143 | void pobf_DumpObfuscation1_Example()
144 | {
145 | pobf::DumpObfuscation::SetEbootRange(0x0010200, 0x17FDA50);
146 |
147 | // Example using compile time random
148 | switch (vxRANDOM(0, 4))
149 | {
150 | case 0: { pobf::DumpObfuscation::ReplaceLisR3(); break; }
151 | case 1: { pobf::DumpObfuscation::ReplaceLisR4(); break; }
152 | case 2: { pobf::DumpObfuscation::ReplaceLisR5(); break; }
153 | case 3: { pobf::DumpObfuscation::ReplaceLisR6(); break; }
154 | case 4: { pobf::DumpObfuscation::ReplaceLisR7(); break; }
155 | default: { pobf::DumpObfuscation::ReplaceLisR3(); }
156 | }
157 | }
158 |
159 | void pobf_DumpObfuscation2_Example()
160 | {
161 | pobf::DumpObfuscation::SetEbootRange(0x0010200, 0x17FDA50);
162 |
163 | // Example using multiple types
164 | pobf::DumpObfuscation::ReplaceByType(pobf::DumpObfuscation::LisR3 | pobf::DumpObfuscation::LisR4 | pobf::DumpObfuscation::LisR6 | pobf::DumpObfuscation::XorR7);
165 | }
166 |
167 | bool g_firstTimeEncrypt = true;
168 | void pobf_RealTimeEncrypt_Example()
169 | {
170 | pobf::Encrypt::RealTimeFunctionEncrypt encrypt(pobf_RealTimeEncrypt_Example, &g_firstTimeEncrypt);
171 |
172 | // your code here..
173 | printf("This is encrypted in real time\n");
174 | }
175 |
176 | bool g_firstTimeAuthEncrypt = true;
177 | void pobf_RealTimeEncrypt2_Example()
178 | {
179 | // last bool is set to true to delete the function after it's been used once, Once deleted it can NOT be reused.
180 | pobf::Encrypt::RealTimeFunctionEncrypt encrypt(pobf_RealTimeEncrypt2_Example, &g_firstTimeAuthEncrypt, true);
181 |
182 |
183 | // Your auth code
184 | printf("Authentication example...");
185 |
186 | printf("socket()...");
187 |
188 | printf("send()...");
189 |
190 | printf("recv()...");
191 | }
192 |
193 | // IMPORTANT: functions in here must be inlined otherwise the get encrypted by PowerObfuscatorGUI
194 | // TODO(Roulette): either keep all functions inlined in main() or modify PowerObfuscatorGUI to skip symbols with 'pobf_' to allow no inline functions
195 | extern "C" int PowerObfuscatorSPRXMain(int argc, char* argv[])
196 | {
197 | pobf::Segment::DecryptSegments(PowerObfuscatorSPRXMain);
198 |
199 | sys_ppu_thread_create(&gTestEncryptedThreadId, MainThread, 0, 3000, 8192, SYS_PPU_THREAD_CREATE_JOINABLE, "TestEncryptedThread");
200 |
201 | return 0;
202 | }
203 |
204 | extern "C" int PowerObfuscatorSPRXStop(int argc, char* argv[])
205 | {
206 |
207 | return 0;
208 | }
--------------------------------------------------------------------------------
/PowerObfuscatorSPRX/src/PowerObfuscatorSPRX.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | PS3
7 |
8 |
9 | Release
10 | PS3
11 |
12 |
13 |
14 | $(VCTargetsPath12)
15 | {52D64FD4-79E9-4466-8D01-3B7D6C5383BC}
16 |
17 |
18 |
19 | DynamicLibrary
20 | SNC
21 |
22 |
23 | DynamicLibrary
24 | SNC
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
50 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
51 | true
52 | .prx
53 |
54 |
55 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
56 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
57 | true
58 | .prx
59 |
60 |
61 |
62 | _DEBUG;__CELL_ASSERT__;%(PreprocessorDefinitions);
63 | true
64 | NotUsing
65 | Cpp11
66 | $(SolutionDir)vendor\libPowerObfuscator\include;%(AdditionalIncludeDirectories)
67 |
68 |
69 | FullMapFile
70 | $(IntDir)$(TargetName).map
71 | -lc;-lPowerObfuscator;$(SCE_PS3_ROOT)\target\ppu\lib\libpsutil.a;%(AdditionalDependencies)
72 | $(SolutionDir)vendor\libPowerObfuscator\lib;%(AdditionalLibraryDirectories)
73 | PRXFile
74 |
75 |
76 |
77 |
78 | NDEBUG;%(PreprocessorDefinitions);
79 | Level2
80 | NotUsing
81 | Cpp11
82 | $(SolutionDir)vendor\libPowerObfuscator\include;%(AdditionalIncludeDirectories)
83 |
84 |
85 | $(IntDir)$(TargetName).map
86 | $(SolutionDir)vendor\libPowerObfuscator\lib;%(AdditionalLibraryDirectories)
87 | -lc;-lPowerObfuscator;$(SCE_PS3_ROOT)\target\ppu\lib\libpsutil.a;%(AdditionalDependencies)
88 | PRXFile
89 | StripDebug
90 | StripFuncsAndData
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/PowerObfuscatorSPRX/src/PowerObfuscatorSPRX.vcxproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PowerObfuscator
2 | PowerObfuscator obfuscate your PS3 .PRX/.SPRX plugins
3 |
4 | # Features
5 | - Compile Time String Obfuscation
6 | - Compile Time Hash Generation
7 | - Compile Time Random Number Generator
8 | - Real Time Function Encryption & Decryption
9 | - Real Time Memory Address Encryption & Decryption
10 | - Dump Obfuscation
11 | - Segment Obfuscation [.text] [.data] [.rodata]
12 |
13 | # Preview Results
14 | 
15 |
16 | 
17 |
18 | # How To Use
19 | 1. In order for your sprx to decrypt you need to add `pobf::Segment::DecryptSegments(main);`to your main(). It must be the first function
20 |
21 | 
22 |
23 | 2. In your prx go to definition of pobf::Segment::DecryptSegments(main); and replace the encryption key with your own.
24 |
25 | 3. Now load your prx in app and enter your encryption key. Default encryption key is: `5DF8B37ADF473A006210F4C66B4C8ECA148192813560F950F1804EF92C10EFDE0EEE63D63010088D705BCA549FC38383EB2F5110BEE4F1D88CD7F1D4719EBDB6`
26 |
27 | 
28 |
29 | # Installing PowerObfuscator into your sprx source code
30 | 1. Download the latest release from [Releases](https://github.com/TheRouletteBoi/PowerObfuscator/releases)
31 | 2. Navigate to your SDK installation folder (default: `C:\usr\local\cell\target\ppu`)
32 | 3. Drop the *include* and *lib* folders
33 | 4. Open up Project Properties and Add `-lc` to your project "Additional Dependencies"
34 | 5. Add `-lPowerObfuscator` to your project "Additional Dependencies"
35 | 6. Add `$(SCE_PS3_ROOT)\target\ppu\lib\libpsutil.a` to your project "Additional Dependencies"
36 |
37 | 
38 |
39 | 7. Now go to *Linker* change "Output Format" to `PRX File`
40 |
41 | 
42 |
43 | 8. Change "Debug Info and Symbol Stripping" to `Strip Debug Information Only`
44 |
45 | 
46 |
47 | 9. In Project Properties navigate to *C/C++* then *Language* and change "C++ Language Standard" to `Use C++11`
48 |
49 | 
50 |
51 | 10. Now go to *General* and change "Target Extension" to `.prx`
52 |
53 | 
54 |
55 | 11. Add `#include ` into your project
56 | 12. Add `#include ` into your project
57 |
58 | 
59 |
60 |
61 | # Building Requirements
62 | - Visual Studio 2013+
63 | - Sony PS3 4.75+ SDK w/ Visual Studio Integration
64 | - [Fixed std::string library](https://github.com/skiff/libpsutil/releases)
65 | - [Qt 6.6.0 with MSVC compilers](https://www.qt.io/download-qt-installer)
66 | - [Qt plugins for Visual Studio](https://www.youtube.com/watch?v=rH2Kq2BIGVs) You will need Visual Studio 2022 or higher to build GUI app because QT extensions don't work with Visual Studio 2013
67 |
68 | ## When building make sure to set PowerObfuscatorGUI as the startup project
69 | - Right click project PowerObfuscatorGUI
70 | 
71 | - Click on Set As Startup Project
72 | 
73 |
74 |
75 | # Credits
76 | - andrivet
77 | - canehaxs
78 | - cr-lupin
79 | - gopro2027
80 | - John Valincius
81 | - jordywastaken
82 | - LeFF
83 |
--------------------------------------------------------------------------------
/bin/Debug-PS3/PowerObfuscatorSPRX.prx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-PS3/PowerObfuscatorSPRX.prx
--------------------------------------------------------------------------------
/bin/Debug-PS3/libPowerObfuscator.a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-PS3/libPowerObfuscator.a
--------------------------------------------------------------------------------
/bin/Debug-x64/PowerObfuscatorGUI.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/PowerObfuscatorGUI.exe
--------------------------------------------------------------------------------
/bin/Debug-x64/PowerObfuscatorGUI.ilk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/PowerObfuscatorGUI.ilk
--------------------------------------------------------------------------------
/bin/Debug-x64/PowerObfuscatorGUI.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/PowerObfuscatorGUI.pdb
--------------------------------------------------------------------------------
/bin/Debug-x64/SecureTool.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/SecureTool.exe
--------------------------------------------------------------------------------
/bin/Debug-x64/data/keys:
--------------------------------------------------------------------------------
1 | [NP_tid]
2 | type=OTHER
3 | key=9B515FEACF75064981AA604D91A54E97
4 |
5 | [NP_ci]
6 | type=OTHER
7 | key=6BA52976EFDA16EF3C339FB2971E256B
8 |
9 | [NP_klic_free]
10 | type=OTHER
11 | key=72F990788F9CFF745725F08E4C128387
12 |
13 | [NP_klic_key]
14 | type=OTHER
15 | key=F2FBCA7A75B04EDC1390638CCDFDD1EE
16 |
17 | [NP_idps_const]
18 | type=OTHER
19 | key=5E06E04FD94A71BF0000000000000001
20 |
21 | [NP_rif_key]
22 | type=OTHER
23 | key=DA7D4B5E499A4F53B1C1A14A7484443B
24 |
25 | [NP_sig]
26 | type=OTHER
27 | pub=E6792E446CEBA27BCADF374B99504FD8E80ADFEB3E66DE73FFE58D3291221C65018C038D3822C3C9
28 | priv=000000000000000000000000000000000000000000
29 | ctype=2
30 |
31 | [pkg]
32 | type=PKG
33 | revision=00
34 | version=0003005500000000
35 | erk=A97818BD193A67A16FE83A855E1BE9FB5640938D4DBCB2CB52C5A2F8B02B1031
36 | riv=4ACEF01224FBEEDF8245F8FF10211E6E
37 | pub=41DA1A8F74FF8D3F1CE20EF3E9D8865C96014FE373CA143C9BADEDF2D9D3C7573307115CCFE04F13
38 | priv=00542D46E7B3DAAC8AEB81E533873AABD6D74BB710
39 | ctype=23
40 |
41 | [pkg]
42 | type=PKG
43 | revision=01
44 | version=0003005600000000
45 | erk=F8F99006F1C007D5D0B1909E9566E0E70B569399FC3394A811809FDB5CAE92CD
46 | riv=59D28DB4ADDFB40B7D768BC9667C67B1
47 | pub=5432BDDD1F97418147AFF016EAA6100834F2CAA8C498B88965689EE44DF349B066CD43CBF4F2C5D0
48 | priv=
49 | ctype=17
50 |
51 | [spp]
52 | type=SPP
53 | revision=00
54 | version=0003005500000000
55 | erk=56C655747A4B6957A2D8BB9AC605C297E6AC9871932BFECDDE066CEE5B29470A
56 | riv=007E6B268EF1E986D10A9889CF93A8CB
57 | pub=265C04E7F20C3B8ACAC90E7C9D12757ED7ACBC01AA6624A2A927E719A4AA1222F87D917005F6072A
58 | priv=0001608EF3BACAFFB8C3A5958A24F758325B62B08C
59 | ctype=22
60 |
61 | [spp]
62 | type=SPP
63 | revision=01
64 | version=0003005600000000
65 | erk=7FD222B3FEF467DF7E3F63AC8B77501A3B38752411E96AFEDA6587B5CD5E91B0
66 | riv=B889290922B002F57086B818A8FDE3CC
67 | pub=71E12CB3D81AFA79670AF4FAC4BBE41AA7F7DDF368F5615E933CB1C21A783B73C085CA49986CCF63
68 | priv=
69 | ctype=22
70 |
71 | [spp]
72 | type=SPP
73 | revision=02
74 | version=0003006000000000
75 | erk=ED17248214B9AB34D57ED5CA6CCAEC9879137B4B46CE5064E6491D34001BACF2
76 | riv=3E05572881C5BC845D310EAC28497B08
77 | pub=504F905A8AAAA0E9BF55F6D5285697E2CABDB1A5240C4745BE8923308169EAB43E1BFD265F5E579E
78 | priv=
79 | ctype=
80 |
81 | [rvk]
82 | type=RVK
83 | revision=00
84 | version=0003005500000000
85 | erk=03AF06FD1CE6DA366361682CDF59F9708B5D7876F40A9E1E9AC2B22F51B60BDF
86 | riv=8B5D7876F40A9E1E9AC2B22F51B60BDF
87 | pub=9ADE7830EB74245EC357CE4F6401633E5A8048FD865F9D8F1A9189535A37623E2921427463A754F7
88 | priv=00245E673B039D656DA206BDAE4EAEFCBF2A8D5EAF
89 | ctype=29
90 |
91 | [rvk]
92 | type=RVK
93 | revision=01
94 | version=0003005600000000
95 | erk=22628A9EC4C414D5B32F2B4BA4926089DE9A461B190FB3E4392D057C525535DE
96 | riv=D5D4B8ED62B6CCA0249A79776E136975
97 | pub=51751B9F1DA58638D2D99F67E20A1D4A454C5B042CD1D0A449A2989808002BA68FB5B7F4B5B4E63B
98 | priv=
99 | ctype=32
100 |
101 | [rvk]
102 | type=RVK
103 | revision=02
104 | version=0003006000000000
105 | erk=BCFEDBE01D445CDEF335C543703D8E9C1199FAC33DC4595D7382EAF54EF9C4C3
106 | riv=B20A23079516205525683D8058379CBF
107 | pub=9859B677A5B8FCCA31A6FBA2E3220EE5E207343A58EEEE6B6CB260EB5E971352C45428E8C8398BE6
108 | priv=
109 | ctype=
110 |
111 | [metldr]
112 | type=SELF
113 | revision=00
114 | self_type=LDR
115 | erk=C0CEFE84C227F75BD07A7EB846509F93B238E770DACB9FF4A388F812482BE21B
116 | riv=47EE7454E4774CC9B8960C7B59F4C14D
117 | pub=C2D4AAF319355019AF99D44E2B58CA29252C89123D11D6218F40B138CAB29B7101F3AEB72A975019
118 | priv=00C5B2BFA1A413DD16F26D31C0F2ED4720DCFB0670
119 | ctype=20
120 |
121 | [isoldr]
122 | type=SELF
123 | version=0003001500000000
124 | self_type=ISO
125 | erk=8860D0CFF4D0DC688D3223321B96B59A777E6914961488E07048DAECB020ECA4
126 | riv=C82D015D46CF152F1DD0C16F18B5B1E5
127 | pub=733918D7C888130509346E6B4A8B6CAA357AB557E814E8122BF102C14A314BF9475B9D70EAF9EC29
128 | priv=009BE892E122A5C943C1BB7403A67318AA9E1B286F
129 | ctype=36
130 |
131 | [isoldr]
132 | type=SELF
133 | version=0003003100000000
134 | self_type=ISO
135 | erk=8860D0CFF4D0DC688D3223321B96B59A777E6914961488E07048DAECB020ECA4
136 | riv=C82D015D46CF152F1DD0C16F18B5B1E5
137 | pub=733918D7C888130509346E6B4A8B6CAA357AB557E814E8122BF102C14A314BF9475B9D70EAF9EC29
138 | priv=009BE892E122A5C943C1BB7403A67318AA9E1B286F
139 | ctype=36
140 |
141 | [isoldr]
142 | type=SELF
143 | version=0003004100000000
144 | self_type=ISO
145 | erk=101E27F3FA2FB53ACA924F783AD553162D56B975D05B81351A1111799F20254D
146 | riv=8D2E9C6297B8AD252998458296AC773C
147 | pub=138446EE0BDDA5638F97328C8956E6489CBBFE57C5961D40DD5C43BB4138F1C400A8B27204A5D625
148 | priv=00849DBC57D3B92F01864E6E82EB4EF0EF6311E122
149 | ctype=32
150 |
151 | [isoldr]
152 | type=SELF
153 | version=0003005000000000
154 | self_type=ISO
155 | erk=3F2604FA27AEADFBE1AC69EB00BB16EF196C2193CBD62900FFD8C25041680843
156 | riv=A414AC1DB7987E43777651B330B899E1
157 | pub=1F4633AFDE18614D6CEF38A2FD6C4CCAC7B6EB8109D72CD066ECEBA0193EA3F43C37AE83179A4E5F
158 | priv=0085B4B05DEBA7E6AD831653C974D95149803BB272
159 | ctype=33
160 |
161 | [isoldr]
162 | type=SELF
163 | version=0003005500000000
164 | self_type=ISO
165 | erk=BDB74AA6E3BA2DC10B1BD7F17198399A158DBE1FA0BEA68C90FCACBE4D04BE37
166 | riv=0207A479B1574F8E7F697528F05D5435
167 | pub=917E1F1DC48A54EB5F10B38E7569BB5383628A7C906F0DCA62FDA33805C15FAB270016940A09DB58
168 | priv=00294411363290975BA551336D3965D88AF029A17B
169 | ctype=03
170 |
171 | [isoldr]
172 | type=SELF
173 | version=0003005600000000
174 | self_type=ISO
175 | erk=311C015F169F2A1E0757F7064B14C7C9F3A3FFEE015BD4E3A22401A2667857CE
176 | riv=7BB8B3F5AC8E0890E3148AE5688C7350
177 | pub=3F040EFA2335FED5670BA4D5C3AB2D9D0B4BA69D154A0062EA995A7D21DBAF0DC5A0DAD333D1C1DD
178 | priv=
179 | ctype=08
180 |
181 | [isoldr]
182 | type=SELF
183 | version=0003006000000000
184 | self_type=ISO
185 | erk=8474ADCA3B3244931EECEB9357841442442A1C4A4BCF4E498E6738950F4E4093
186 | riv=FFF9CACCC4129125CAFB240F419E5F39
187 | pub=098E1A53E59A95316B00D5A29C05FFEBAE41D1A8A386F9DA96F98858FD25E07BB7A3BC96A5D5B556
188 | priv=
189 | ctype=03
190 |
191 | [isoldr]
192 | type=SELF
193 | revision=0001
194 | version=0004002000000000
195 | self_type=ISO
196 | erk=63565DBE98C3B1A52AADC907C47130FE57A10734E84F22592670F86ED2B0A086
197 | riv=953F6A99891B4739358F5363A00C08B9
198 | pub=26BE7B02E7D65C6C21BF4063CDB8C0092FE1679D62FA1A8CCC284A1D21885473A959992537A06612
199 | priv=
200 | ctype=15
201 |
202 | [isoldr]
203 | type=SELF
204 | revision=0001
205 | version=0004003000000000
206 | self_type=ISO
207 | erk=63565DBE98C3B1A52AADC907C47130FE57A10734E84F22592670F86ED2B0A086
208 | riv=953F6A99891B4739358F5363A00C08B9
209 | pub=26BE7B02E7D65C6C21BF4063CDB8C0092FE1679D62FA1A8CCC284A1D21885473A959992537A06612
210 | priv=
211 | ctype=15
212 |
213 | [lv1ldr]
214 | type=SELF
215 | version=0003001500000000
216 | self_type=LV1
217 | erk=B9F3F9E6107CFF2680A91E118C2403CF4A6F18F3C7EFD7D13D1AC4DB760BD222
218 | riv=B43661B9A79BAD9D8E2B046469CDA1E7
219 | pub=4C870BE86DDD996A92A3F7F404F33604244A1D02AB5B78BC9DAF030B78BE8867CF586171B7D45D20
220 | priv=002CC736C7AD06D264E9AB663EB1F35F5DC159248C
221 | ctype=33
222 |
223 | [lv1ldr]
224 | type=SELF
225 | version=0003004100000000
226 | self_type=LV1
227 | erk=B880593856C8C6D2037585626A12977F50DCFCF3F132D2C89AA6E670EAFC1646
228 | riv=A79B05D4E37B8117A95E6E7C14FB640E
229 | pub=7454C7CCBFC2F66C142D78A730A3A6F973CC0FB75A46FCBB390790138910A0CAC78E5E21F4DA3375
230 | priv=00033A699FDD2DA6CDD6CCC03B2C6145F998706F74
231 | ctype=34
232 |
233 | [lv1ldr]
234 | type=SELF
235 | version=0003005000000000
236 | self_type=LV1
237 | erk=1E8EEEA9E80A729F3FA52CF523B25941EA44B4155D94E5DADC5C5A77847620C7
238 | riv=E034D31A80316960024D1B3D3164FDC3
239 | pub=7E3A196F4A5879F3A7B091A2263F7C24E1716129B580566D308D9C2254B36AEE53DEF30EC85F8398
240 | priv=005815D17125D04C33790321DE29EB6241365100B5
241 | ctype=35
242 |
243 | [lv1ldr]
244 | type=SELF
245 | version=0003005500000000
246 | self_type=LV1
247 | erk=53ABDF84BE08B0351B734F2B97D2BE1621BC6C889E4362E5C70F39D6C3ED9F23
248 | riv=44E652661AC7584DBE08ECB810FB5FC0
249 | pub=733198A7759BC07326755BC9773A8A17C8A7043C7BDAB83D88E230512E2EA3852D7DA4263A7E97F9
250 | priv=004312C65347ACBE95CC306442FEFD0AF4C2935EB3
251 | ctype=05
252 |
253 | [lv1ldr]
254 | type=SELF
255 | version=0003005600000000
256 | self_type=LV1
257 | erk=48793EBDDA1AF65D737DA2FDA2DD104447A698F8A82CAAEE992831711BA94E83
258 | riv=15DCF3C67147A45D09DE7521EECA07A1
259 | pub=85A8868C320127F10B6598964C69221C086702021D31803520E21FDE4DBE827766BE41825CB7328C
260 | priv=
261 | ctype=07
262 |
263 | [lv1ldr]
264 | type=SELF
265 | version=0003006000000000
266 | self_type=LV1
267 | erk=5FF17D836E2C4AD69476E2614F64BDD05B9115389A9A6D055B5B544B1C34E3D5
268 | riv=DF0F50EC3C4743C5B17839D7B49F24A4
269 | pub=1CDABE30833823F461CA534104115FFF60010B710631E435A7D915E82AE88EDE667264656CB7062E
270 | priv=
271 | ctype=05
272 |
273 | [lv1ldr]
274 | type=SELF
275 | revision=0000
276 | version=0004002000000000
277 | self_type=LV1
278 | erk=10CEA04973FCCC12EC19924510822D8D4C41F657FD3D7E73F415A8D687421BCD
279 | riv=ED8699562C6AC65204FA166257E7FCF4
280 | pub=1C0587163886C7071808501900200000143FCF9E3B8586084080061518078D141C05C70D3885474918068C93143FCC17
281 | ctype=30
282 |
283 | [lv1ldr]
284 | type=SELF
285 | revision=0000
286 | version=0004003000000000
287 | self_type=LV1
288 | erk=10CEA04973FCCC12EC19924510822D8D4C41F657FD3D7E73F415A8D687421BCD
289 | riv=ED8699562C6AC65204FA166257E7FCF4
290 | pub=1C0587163886C7071808501900200000143FCF9E3B8586084080061518078D141C05C70D3885474918068C93143FCC17
291 | ctype=30
292 |
293 | [lv2ldr]
294 | type=SELF
295 | version=0000000800000000
296 | self_type=LV2
297 | erk=014485445EC9926C50F613AE77D9C37AA99838CCEB6F75FA78E29A8C622E8011
298 | riv=A17D6A522CB1B08F97DA8A82E97C12F7
299 |
300 | [lv2ldr]
301 | type=SELF
302 | version=0003001500000000
303 | self_type=LV2
304 | erk=94303F69513572AB5AE17C8C2A1839D2C24C28F65389D3BBB11894CE23E0798F
305 | riv=9769BFD187B90990AE5FEA4E110B9CF5
306 | pub=AFAF5E96AF396CBB69071082C46A8F34A030E8EDB799E0A7BE00AA264DFF3AEBF7923920D559404D
307 | priv=0070ABF9361B02291829D479F56AB248203CD3EB46
308 | ctype=20
309 |
310 | [lv2ldr]
311 | type=SELF
312 | version=0003004100000000
313 | self_type=LV2
314 | erk=575B0A6C4B4F2760A03FE4189EBAF4D947279FD982B14070349098B08FF92C10
315 | riv=411CB18F460CE50CAF2C426D8F0D93C8
316 | pub=3FEE313954CB3039C321A7E33B97FFDEC8988A8B55759161B04DBF4731284E4A8191E3F17D32B0EA
317 | priv=0073076441A08CD179E5FACE349B86DA58B5B7BA78
318 | ctype=21
319 |
320 | [lv2ldr]
321 | type=SELF
322 | version=0003005000000000
323 | self_type=LV2
324 | erk=6DBD48D787C58803A8D724DA5ACF04FF8FCE91D7545D2322F2B7ABF57014AF68
325 | riv=603A36213708520ED5D745DEC1325BA5
326 | pub=5888CB83AC3CCA9610BC173C53141C0CA58B93719E744660CA8823D5EAEE8F9BF736997054E4B7E3
327 | priv=0009EBC3DE442FA5FBF6C4F3D4F9EAB07778A142BD
328 | ctype=22
329 |
330 | [lv2ldr]
331 | type=SELF
332 | version=0003005500000000
333 | self_type=LV2
334 | erk=84015E90FA23139628A3C75CC09714E6427B527A82D18ABC3E91CD8D7DDAFF17
335 | riv=5B240444D645F2038118F97FD5A145D5
336 | pub=B266318245266B2D33641CD8A864066D077FAC60B7E27399099A70A683454B70F9888E7CC0C2BF72
337 | priv=009D4CBA2BFB1A8330D3E20E59D281D476D231C73A
338 | ctype=32
339 |
340 | [lv2ldr]
341 | type=SELF
342 | version=0003005600000000
343 | self_type=LV2
344 | erk=EAE15444048EFDE7A831BFA9F5D96F047C9FCFF50723E292CF50F5417D81E359
345 | riv=9CA9282DC7FA9F315EF3156D970B7CD4
346 | pub=0D58938CB47598A6A672874F1768068F8B80D8D17014D2ABEBAC85E5B0993D9FB6F307DDC3DDA699
347 | priv=
348 | ctype=33
349 |
350 | [lv2ldr]
351 | type=SELF
352 | version=0003006000000000
353 | self_type=LV2
354 | erk=88AD367EDEC2FEED3E2F99B1C685075C41BDEC90C84F526CAF588F89BBD1CBCC
355 | riv=8D18E8E525230E63DE10291C9DD615BF
356 | pub=86EED1D65E58890ABDA9ACA486A2BDDB9C0A529C2053FAE301F0F698EAF443DA0F60595A597A7027
357 | priv=
358 | ctype=32
359 |
360 | [lv2ldr]
361 | type=SELF
362 | revision=0000
363 | version=0004002000000000
364 | self_type=LV2
365 | erk=0CAF212B6FA53C0DA7E2C575ADF61DBE68F34A33433B1B891ABF5C4251406A03
366 | riv=9B79374722AD888EB6A35A2DF25A8B3E
367 | pub=695984B7EE2EC2F77FCC3120150DCE7E4480D84480DDD8C5940AEB6F79E63D17A8BA3E4E63B2BB06FC0CE57E3BB8FC46
368 |
369 | [lv2ldr]
370 | type=SELF
371 | revision=0000
372 | version=0004003000000000
373 | self_type=LV2
374 | erk=0CAF212B6FA53C0DA7E2C575ADF61DBE68F34A33433B1B891ABF5C4251406A03
375 | riv=9B79374722AD888EB6A35A2DF25A8B3E
376 | pub=695984B7EE2EC2F77FCC3120150DCE7E4480D84480DDD8C5940AEB6F79E63D17A8BA3E4E63B2BB06FC0CE57E3BB8FC46
377 |
378 | [appldr]
379 | type=SELF
380 | revision=0000
381 | version=0000008000000000
382 | self_type=APP
383 | erk=95F50019E7A68E341FA72EFDF4D60ED376E25CF46BB48DFDD1F080259DC93F04
384 | riv=4A0955D946DB70D691A640BB7FAECC4C
385 | pub=6F8DF8EBD0A1D1DB08B30DD3A951E3F1F27E34030B42C729C55555232D61B834B8BDFFB07E54B343
386 | priv=006C3E4CCB2C69A5AD7C6F60448E50C7F9184EEAF4
387 | ctype=21
388 |
389 | [appldr]
390 | type=SELF
391 | revision=0001
392 | version=0003001500000000
393 | self_type=APP
394 | erk=79481839C406A632BDB4AC093D73D99AE1587F24CE7E69192C1CD0010274A8AB
395 | riv=6F0F25E1C8C4B7AE70DF968B04521DDA
396 | pub=94D1B7378BAFF5DFED269240A7A364ED68446741622E50BC6079B6E606A2F8E0A4C56E5CFF836526
397 | priv=003DE80167D2F0E9D30F2145144A558D1174F5410C
398 | ctype=11
399 |
400 | [appldr]
401 | type=SELF
402 | revision=0002
403 | version=0003001500000000
404 | self_type=APP
405 | erk=4F89BE98DDD43CAD343F5BA6B1A133B0A971566F770484AAC20B5DD1DC9FA06A
406 | riv=90C127A9B43BA9D8E89FE6529E25206F
407 | pub=8CA6905F46148D7D8D84D2AFCEAE61B41E6750FC22EA435DFA61FCE6F4F860EE4F54D9196CA5290E
408 | priv=
409 | ctype=13
410 |
411 | [appldr]
412 | type=SELF
413 | revision=0003
414 | version=0003001500000000
415 | self_type=APP
416 | erk=C1E6A351FCED6A0636BFCB6801A0942DB7C28BDFC5E0A053A3F52F52FCE9754E
417 | riv=E0908163F457576440466ACAA443AE7C
418 | pub=50022D5D37C97905F898E78E7AA14A0B5CAAD5CE8190AE5629A10D6F0CF4173597B37A95A7545C92
419 | priv=
420 | ctype=0B
421 |
422 | [appldr]
423 | type=SELF
424 | revision=0004
425 | version=0003004100000000
426 | self_type=APP
427 | erk=838F5860CF97CDAD75B399CA44F4C214CDF951AC795298D71DF3C3B7E93AAEDA
428 | riv=7FDBB2E924D182BB0D69844ADC4ECA5B
429 | pub=1F140E8EF887DAB52F079A06E6915A6460B75CD256834A43FA7AF90C23067AF412EDAFE2C1778D69
430 | priv=0074E922FDEE5DC4CDF22FC8D7986477F813400860
431 | ctype=14
432 |
433 | [appldr]
434 | type=SELF
435 | revision=0005
436 | version=0003004100000000
437 | self_type=APP
438 | erk=C109AB56593DE5BE8BA190578E7D8109346E86A11088B42C727E2B793FD64BDC
439 | riv=15D3F191295C94B09B71EBDE088A187A
440 | pub=B6BB0A84C649A90D97EBA55B555366F52381BB38A84C8BB71DA5A5A0949043C6DB249029A43156F7
441 | priv=
442 | ctype=15
443 |
444 | [appldr]
445 | type=SELF
446 | revision=0006
447 | version=0003004100000000
448 | self_type=APP
449 | erk=6DFD7AFB470D2B2C955AB22264B1FF3C67F180983B26C01615DE9F2ECCBE7F41
450 | riv=24BD1C19D2A8286B8ACE39E4A37801C2
451 | pub=71F46AC33FF89DF589A100A7FB64CEAC244C9A0CBBC1FDCE80FB4BF8A0D2E66293309CB8EE8CFA95
452 | priv=
453 | ctype=2C
454 |
455 | [appldr]
456 | type=SELF
457 | revision=0007
458 | version=0003005000000000
459 | self_type=APP
460 | erk=945B99C0E69CAF0558C588B95FF41B232660ECB017741F3218C12F9DFDEEDE55
461 | riv=1D5EFBE7C5D34AD60F9FBC46A5977FCE
462 | pub=AB284CA549B2DE9AA5C903B75652F78D192F8F4A8F3CD99209415C0A84C5C9FD6BF3095C1C18FFCD
463 | priv=002CF896D35DB871D0E6A252E799876A70D043C23E
464 | ctype=15
465 |
466 | [appldr]
467 | type=SELF
468 | revision=0008
469 | version=0003005000000000
470 | self_type=APP
471 | erk=2C9E8969EC44DFB6A8771DC7F7FDFBCCAF329EC3EC070900CABB23742A9A6E13
472 | riv=5A4CEFD5A9C3C093D0B9352376D19405
473 | pub=6E82F6B54A0E9DEBE4A8B3043EE3B24CD9BBB62B4416B0482582E419A2552E29AB4BEA0A4D7FA2D5
474 | priv=
475 | ctype=16
476 |
477 | [appldr]
478 | type=SELF
479 | revision=0009
480 | version=0003005000000000
481 | self_type=APP
482 | erk=F69E4A2934F114D89F386CE766388366CDD210F1D8913E3B973257F1201D632B
483 | riv=F4D535069301EE888CC2A852DB654461
484 | pub=1D7B974D10E61C2ED087A0981535904677EC07E96260F89565FF7EBDA4EE035C2AA9BCBDD5893F99
485 | priv=
486 | ctype=2D
487 |
488 | [appldr]
489 | type=SELF
490 | revision=000A
491 | version=0003005500000000
492 | self_type=APP
493 | erk=29805302E7C92F204009161CA93F776A072141A8C46A108E571C46D473A176A3
494 | riv=5D1FAB844107676ABCDFC25EAEBCB633
495 | pub=09301B6436C85B53CB1585300A3F1AF9FB14DB7C30088C4642AD66D5C148B8995BB1A698A8C71827
496 | priv=0010818ED8A666051C6198662C3D6DDE2CA4901DDC
497 | ctype=25
498 |
499 | [appldr]
500 | type=SELF
501 | revision=000B
502 | version=0003005500000000
503 | self_type=APP
504 | erk=A4C97402CC8A71BC7748661FE9CE7DF44DCE95D0D58938A59F47B9E9DBA7BFC3
505 | riv=E4792F2B9DB30CB8D1596077A13FB3B5
506 | pub=2733C889D289550FE00EAA5A47A34CEF0C1AF187610EB07BA35D2C09BB73C80B244EB4147700D1BF
507 | priv=
508 | ctype=26
509 |
510 | [appldr]
511 | type=SELF
512 | revision=000C
513 | version=0003005500000000
514 | self_type=APP
515 | erk=9814EFFF67B7074D1B263BF85BDC8576CE9DEC914123971B169472A1BC2387FA
516 | riv=D43B1FA8BE15714B3078C23908BB2BCA
517 | pub=7D1986C6BEE6CE1E0C5893BD2DF203881F40D5056761CC3F1F2E9D9A378617A2DE40BA5F09844CEB
518 | priv=
519 | ctype=3D
520 |
521 | [appldr]
522 | type=SELF
523 | revision=000D
524 | version=0003005600000000
525 | self_type=APP
526 | erk=03B4C421E0C0DE708C0F0B71C24E3EE04306AE7383D8C5621394CCB99FF7A194
527 | riv=5ADB9EAFE897B54CB1060D6885BE22CF
528 | pub=71502ADB5783583AB88B2D5F23F419AF01C8B1E72FCA1E694AD49FE3266F1F9C61EFC6F29B351142
529 | priv=
530 | ctype=12
531 |
532 | [appldr]
533 | type=SELF
534 | revision=000E
535 | version=0003005600000000
536 | self_type=APP
537 | erk=39A870173C226EB8A3EEE9CA6FB675E82039B2D0CCB22653BFCE4DB013BAEA03
538 | riv=90266C98CBAA06C1BF145FF760EA1B45
539 | pub=84DE5692809848E5ACBE25BE548F6981E3DB14735A5DDE1A0FD1F475866532B862B1AB6A004B7255
540 | priv=
541 | ctype=27
542 |
543 | [appldr]
544 | type=SELF
545 | revision=000F
546 | version=0003005600000000
547 | self_type=APP
548 | erk=FD52DFA7C6EEF5679628D12E267AA863B9365E6DB95470949CFD235B3FCA0F3B
549 | riv=64F50296CF8CF49CD7C643572887DA0B
550 | pub=0696D6CCBD7CF585EF5E00D547503C185D7421581BAD196E081723CD0A97FA40B2C0CD2492B0B5A1
551 | priv=
552 | ctype=3A
553 |
554 | [appldr]
555 | type=SELF
556 | revision=0010
557 | version=0003006000000000
558 | self_type=APP
559 | erk=A5E51AD8F32FFBDE808972ACEE46397F2D3FE6BC823C8218EF875EE3A9B0584F
560 | riv=7A203D5112F799979DF0E1B8B5B52AA4
561 | pub=50597B7F680DD89F6594D9BDC0CBEE03666AB53647D0487F7F452FE2DD02694631EA755548C9E934
562 | priv=
563 | ctype=25
564 |
565 | [appldr]
566 | type=SELF
567 | revision=0011
568 | version=0003006000000000
569 | self_type=APP
570 | erk=0F8EAB8884A51D092D7250597388E3B8B75444AC138B9D36E5C7C5B8C3DF18FD
571 | riv=97AF39C383E7EF1C98FA447C597EA8FE
572 | pub=2FDA7A56AAEA65921C0284FF1942C6DE137370093D106034B59191951A5201B422D462F8726F852D
573 | priv=
574 | ctype=26
575 |
576 | [appldr]
577 | type=SELF
578 | revision=0013
579 | version=0003006500000000
580 | self_type=APP
581 | erk=DBF62D76FC81C8AC92372A9D631DDC9219F152C59C4B20BFF8F96B64AB065E94
582 | riv=CB5DD4BE8CF115FFB25801BC6086E729
583 | pub=B26FE6D3E3A1E766FAE79A8E6A7F48998E7FC1E4B0AD8745FF54C018C2A6CC7A0DD7525FAFEA4917
584 | priv=
585 | ctype=12
586 |
587 | [appldr]
588 | type=SELF
589 | revision=0014
590 | version=0003006500000000
591 | self_type=APP
592 | erk=491B0D72BB21ED115950379F4564CE784A4BFAABB00E8CB71294B192B7B9F88E
593 | riv=F98843588FED8B0E62D7DDCB6F0CECF4
594 | pub=04275E8838EF95BD013B223C3DF674540932F21B534C7ED2944B9104D938FEB03B824DDB866AB26E
595 | priv=
596 | ctype=27
597 |
598 | [appldr]
599 | type=SELF
600 | revision=0016
601 | version=0003007000000000
602 | self_type=APP
603 | erk=A106692224F1E91E1C4EBAD4A25FBFF66B4B13E88D878E8CD072F23CD1C5BF7C
604 | riv=62773C70BD749269C0AFD1F12E73909E
605 | pub=566635D3E1DCEC47243AAD1628AE6B2CEB33463FC155E4635846CE33899C5E353DDFA47FEF5694AF
606 | priv=
607 | ctype=30
608 |
609 | [appldr]
610 | type=SELF
611 | revision=0017
612 | version=0003007000000000
613 | self_type=APP
614 | erk=4E104DCE09BA878C75DA98D0B1636F0E5F058328D81419E2A3D22AB0256FDF46
615 | riv=954A86C4629E116532304A740862EF85
616 | pub=3B7B04C71CAE2B1199D57453C038BB1B541A05AD1B94167B0AB47A9B24CAECB9000CB21407009666
617 | priv=
618 | ctype=08
619 |
620 | [appldr]
621 | type=SELF
622 | revision=0019
623 | version=0004000000000000
624 | self_type=APP
625 | erk=3236B9937174DF1DC12EC2DD8A318A0EA4D3ECDEA5DFB4AC1B8278447000C297
626 | riv=6153DEE781B8ADDC6A439498B816DC46
627 | pub=148DCA961E2738BAF84B2D1B6E2DA2ABD6A95F2C9571E54C6922F9ED9674F062B7F1BE5BD6FA5268
628 | priv=
629 | ctype=31
630 |
631 | [appldr]
632 | type=SELF
633 | revision=001A
634 | version=0004000000000000
635 | self_type=APP
636 | erk=5EFD1E9961462794E3B9EF2A4D0C1F46F642AAE053B5025504130590E66F19C9
637 | riv=1AC8FA3B3C90F8FDE639515F91B58327
638 | pub=BE4B1B513536960618BFEF12A713F6673881B02F9DC616191E823FC8337CCF99ADAA6172019C0C23
639 | priv=
640 | ctype=17
641 |
642 | [appldr]
643 | type=SELF
644 | revision=001C
645 | version=0004002000000000
646 | self_type=APP
647 | erk=CFF025375BA0079226BE01F4A31F346D79F62CFB643CA910E16CF60BD9092752
648 | riv=FD40664E2EBBA01BF359B0DCDF543DA4
649 | pub=36C1ACE6DD5CCC0006FDF3424750FAC515FC5CFA2C93EC53C6EC2BC421708D154E91F2E7EA54A893
650 | priv=
651 | ctype=09
652 |
653 | [appldr]
654 | type=SELF
655 | revision=001D
656 | version=0004002000000000
657 | self_type=APP
658 | erk=D202174EB65A62048F3674B59EF6FE72E1872962F3E1CD658DE8D7AF71DA1F3E
659 | riv=ACB9945914EBB7B9A31ECE320AE09F2D
660 | pub=430322887503CF52928FAAA410FD623C7321281C8825D95F5B47EF078EFCFC44454C3AB4F00BB879
661 | priv=
662 | ctype=1A
663 |
664 | [appldr]
665 | type=SELF
666 | revision=001E
667 | version=0004003000000000
668 | self_type=APP
669 | erk=46BD0891224E0CE13E2162921D4BB76193AEEE4416A729FCDD111C5536BF87C9
670 | riv=BF036387CDB613C0AC88A6D9D2CC5316
671 | pub=A14F6D5F9AD7EBB3B7A39A7C32F13E5DC3B0BA16BDC33D39FDDF88F4AEEA6CFEEB0C0796C917A952
672 | priv=
673 | ctype=0F
674 |
675 |
676 |
677 | [appldr]
678 | type=SELF
679 | revision=0000
680 | version=0000009200000000
681 | self_type=NPDRM
682 | erk=D91166973979EA8694476B011AC62C7E9F37DA26DE1E5C2EE3D66E42B8517085
683 | riv=DC01280A6E46BC674B81A7E8801EBE6E
684 | pub=A0FC44108236141BF3517A662B027AFC1AC513A05690496C754DEB7D43BDC41B80FD75C212624EE4
685 | priv=
686 | ctype=11
687 |
688 | [appldr]
689 | type=SELF
690 | revision=0001
691 | version=0001000000000000
692 | self_type=NPDRM
693 | erk=F9EDD0301F770FABBA8863D9897F0FEA6551B09431F61312654E28F43533EA6B
694 | riv=A551CCB4A42C37A734A2B4F9657D5540
695 | pub=B05F9DA5F9121EE4031467E74C505C29A8E29D1022379EDFF0500B9AE480B5DAB4578A4C61C5D6BF
696 | priv=00040AB47509BED04BD96521AD1B365B86BF620A98
697 | ctype=11
698 |
699 | [appldr]
700 | type=SELF
701 | revision=0002
702 | version=0001000000000000
703 | self_type=NPDRM
704 | erk=8E737230C80E66AD0162EDDD32F1F774EE5E4E187449F19079437A508FCF9C86
705 | riv=7AAECC60AD12AED90C348D8C11D2BED5
706 | pub=05BF09CB6FD78050C78DE69CC316FF27C9F1ED66A45BFCE0A1E5A6749B19BD546BBB4602CF373440
707 | priv=
708 | ctype=0A
709 |
710 | [appldr]
711 | type=SELF
712 | revision=0003
713 | version=0003001500000000
714 | self_type=NPDRM
715 | erk=1B715B0C3E8DC4C1A5772EBA9C5D34F7CCFE5B82025D453F3167566497239664
716 | riv=E31E206FBB8AEA27FAB0D9A2FFB6B62F
717 | pub=3F51E59FC74D6618D34431FA67987FA11ABBFACC7111811473CD9988FE91C43FC74605E7B8CB732D
718 | priv=
719 | ctype=08
720 |
721 | [appldr]
722 | type=SELF
723 | revision=0004
724 | version=0003004000000000
725 | self_type=NPDRM
726 | erk=BB4DBF66B744A33934172D9F8379A7A5EA74CB0F559BB95D0E7AECE91702B706
727 | riv=ADF7B207A15AC601110E61DDFC210AF6
728 | pub=9C327471BAFF1F877AE4FE29F4501AF5AD6A2C459F8622697F583EFCA2CA30ABB5CD45D1131CAB30
729 | priv=00B61A91DF4AB6A9F142C326BA9592B5265DA88856
730 | ctype=16
731 |
732 | [appldr]
733 | type=SELF
734 | revision=0005
735 | version=0003004000000000
736 | self_type=NPDRM
737 | erk=B73111B0B00117E48DE5E2EE5E534C0F0EFFA4890BBB8CAD01EE0F848F91583E
738 | riv=86F56F9E5DE513894874B8BA253334B1
739 | pub=B0BA1A1AB9723BB4E87CED9637BE056066BC56E16572D43D0210A06411DBF8FEB8885CD912384AE5
740 | priv=
741 | ctype=12
742 |
743 | [appldr]
744 | type=SELF
745 | revision=0006
746 | version=0003004000000000
747 | self_type=NPDRM
748 | erk=8B4C52849765D2B5FA3D5628AFB17644D52B9FFEE235B4C0DB72A62867EAA020
749 | riv=05719DF1B1D0306C03910ADDCE4AF887
750 | pub=2A5D6C6908CA98FC4740D834C6400E6D6AD74CF0A712CF1E7DAE806E98605CC308F6A03658F2970E
751 | priv=
752 | ctype=29
753 |
754 | [appldr]
755 | type=SELF
756 | revision=0007
757 | version=0003005000000000
758 | self_type=NPDRM
759 | erk=3946DFAA141718C7BE339A0D6C26301C76B568AEBC5CD52652F2E2E0297437C3
760 | riv=E4897BE553AE025CDCBF2B15D1C9234E
761 | pub=A13AFE8B63F897DA2D3DC3987B39389DC10BAD99DFB703838C4A0BC4E8BB44659C726CFD0CE60D0E
762 | priv=009EF86907782A318D4CC3617EBACE2480E73A46F6
763 | ctype=17
764 |
765 | [appldr]
766 | type=SELF
767 | revision=0008
768 | version=0003005000000000
769 | self_type=NPDRM
770 | erk=8E944267C02E69A4FE474B7F5FCD7974A4F936FF4355AEC4F80EFA123858D8F6
771 | riv=908A75754E521EAC2F5A4889C6D7B72D
772 | pub=91201DA7D79E8EE2563142ECBD646DA026C963AC09E760E5390FFE24DAE6864310ABE147F8204D0B
773 | priv=
774 | ctype=13
775 |
776 | [appldr]
777 | type=SELF
778 | revision=0009
779 | version=0003005000000000
780 | self_type=NPDRM
781 | erk=0786F4B0CA5937F515BDCE188F569B2EF3109A4DA0780A7AA07BD89C3350810A
782 | riv=04AD3C2F122A3B35E804850CAD142C6D
783 | pub=A1FE61035DBBEA5A94D120D03C000D3B2F084B9F4AFA99A2D4A588DF92B8F36327CE9E47889A45D0
784 | priv=
785 | ctype=2A
786 |
787 | [appldr]
788 | type=SELF
789 | revision=000A
790 | version=0003005500000000
791 | self_type=NPDRM
792 | erk=03C21AD78FBB6A3D425E9AAB1298F9FD70E29FD4E6E3A3C151205DA50C413DE4
793 | riv=0A99D4D4F8301A88052D714AD2FB565E
794 | pub=3995C390C9F7FBBAB124A1C14E70F9741A5E6BDF17A605D88239652C8EA7D5FC9F24B30546C1E44B
795 | priv=009AC6B22A056BA9E0B6D1520F28A57A3135483F9F
796 | ctype=27
797 |
798 | [appldr]
799 | type=SELF
800 | revision=000B
801 | version=0003005500000000
802 | self_type=NPDRM
803 | erk=BB31DF9A6F62C0DF853075FAA65134D9CE2240306C1731D1F7DA9B5329BD699F
804 | riv=263057225873F83940A65C8C926AC3E4
805 | pub=BC3A82A4F44C43A197070CD236FDC94FCC542D69A3E803E0AFF78D1F3DA19A79D2F61FAB5B94B437
806 | priv=
807 | ctype=23
808 |
809 | [appldr]
810 | type=SELF
811 | revision=000C
812 | version=0003005500000000
813 | self_type=NPDRM
814 | erk=337A51416105B56E40D7CAF1B954CDAF4E7645F28379904F35F27E81CA7B6957
815 | riv=8405C88E042280DBD794EC7E22B74002
816 | pub=9BFF1CC7118D2393DE50D5CF44909860683411A532767BFDAC78622DB9E5456753FE422CBAFA1DA1
817 | priv=
818 | ctype=18
819 |
820 | [appldr]
821 | type=SELF
822 | revision=000D
823 | version=0003005600000000
824 | self_type=NPDRM
825 | erk=357EBBEA265FAEC271182D571C6CD2F62CFA04D325588F213DB6B2E0ED166D92
826 | riv=D26E6DD2B74CD78E866E742E5571B84F
827 | pub=00DCF5391618604AB42C8CFF3DC304DF45341EBA4551293E9E2B68FFE2DF527FFA3BE8329E015E57
828 | priv=
829 | ctype=3A
830 |
831 | [appldr]
832 | type=SELF
833 | revision=000E
834 | version=0003005600000000
835 | self_type=NPDRM
836 | erk=71AA75C70A255580E4AE9BDAA0B08828C53EAA713CD0713797F143B284C1589B
837 | riv=9DED878CB6BA07121C0F50E7B172A8BF
838 | pub=387FCDAEAFF1B59CFAF79CE6215A065ACEAFFAF4048A4F217E1FF5CE67C66EC3F089DB235E52F9D3
839 | priv=
840 | ctype=29
841 |
842 | [appldr]
843 | type=SELF
844 | revision=000F
845 | version=0003005600000000
846 | self_type=NPDRM
847 | erk=135C098CBE6A3E037EBE9F2BB9B30218DDE8D68217346F9AD33203352FBB3291
848 | riv=4070C898C2EAAD1634A288AA547A35A8
849 | pub=BBD7CCCB556C2EF0F908DC7810FAFC37F2E56B3DAA5F7FAF53A4944AA9B841F76AB091E16B231433
850 | priv=
851 | ctype=3B
852 |
853 | [appldr]
854 | type=SELF
855 | revision=0010
856 | version=0003006000000000
857 | self_type=NPDRM
858 | erk=4B3CD10F6A6AA7D99F9B3A660C35ADE08EF01C2C336B9E46D1BB5678B4261A61
859 | riv=C0F2AB86E6E0457552DB50D7219371C5
860 | pub=64A5C60BC2AD18B8A237E4AA690647E12BF7A081523FAD4F29BE89ACAC72F7AB43C74EC9AFFDA213
861 | ctype=27
862 |
863 | [appldr]
864 | type=SELF
865 | revision=0013
866 | version=0003006500000000
867 | self_type=NPDRM
868 | erk=265C93CF48562EC5D18773BEB7689B8AD10C5EB6D21421455DEBC4FB128CBF46
869 | riv=8DEA5FF959682A9B98B688CEA1EF4A1D
870 | pub=9D8DB5A880608DC69717991AFC3AD5C0215A5EE413328C2ABC8F35589E04432373DB2E2339EEF7C8
871 | priv=
872 | ctype=18
873 |
874 | [appldr]
875 | type=SELF
876 | revision=0016
877 | version=0003007000000000
878 | self_type=NPDRM
879 | erk=7910340483E419E55F0D33E4EA5410EEEC3AF47814667ECA2AA9D75602B14D4B
880 | riv=4AD981431B98DFD39B6388EDAD742A8E
881 | pub=62DFE488E410B1B6B2F559E4CB932BCB78845AB623CC59FDF65168400FD76FA82ED1DC60E091D1D1
882 | priv=
883 | ctype=25
884 |
885 | [appldr]
886 | type=SELF
887 | revision=0019
888 | version=0004000000000000
889 | self_type=NPDRM
890 | erk=FBDA75963FE690CFF35B7AA7B408CF631744EDEF5F7931A04D58FD6A921FFDB3
891 | riv=F72C1D80FFDA2E3BF085F4133E6D2805
892 | pub=637EAD34E7B85C723C627E68ABDD0419914EBED4008311731DD87FDDA2DAF71F856A70E14DA17B42
893 | priv=
894 | ctype=24
895 |
896 | [appldr]
897 | type=SELF
898 | revision=0019
899 | version=0004000100000000
900 | self_type=NPDRM
901 | erk=FBDA75963FE690CFF35B7AA7B408CF631744EDEF5F7931A04D58FD6A921FFDB3
902 | riv=F72C1D80FFDA2E3BF085F4133E6D2805
903 | pub=637EAD34E7B85C723C627E68ABDD0419914EBED4008311731DD87FDDA2DAF71F856A70E14DA17B42
904 | priv=
905 | ctype=24
906 |
907 | [appldr]
908 | type=SELF
909 | revision=001C
910 | version=0004002000000000
911 | self_type=NPDRM
912 | erk=8103EA9DB790578219C4CEDF0592B43064A7D98B601B6C7BC45108C4047AA80F
913 | riv=246F4B8328BE6A2D394EDE20479247C5
914 | pub=503172C9551308A87621ECEE90362D14889BFED2CF32B0B3E32A4F9FE527A41464B735E1ADBC6762
915 | priv=
916 | ctype=30
917 |
--------------------------------------------------------------------------------
/bin/Debug-x64/data/ldr_curves:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/data/ldr_curves
--------------------------------------------------------------------------------
/bin/Debug-x64/data/vsh_curves:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/data/vsh_curves
--------------------------------------------------------------------------------
/bin/Debug-x64/ps3bin.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/ps3bin.exe
--------------------------------------------------------------------------------
/bin/Debug-x64/scetool.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/scetool.exe
--------------------------------------------------------------------------------
/bin/Debug-x64/zlib1.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Debug-x64/zlib1.dll
--------------------------------------------------------------------------------
/bin/Release-PS3/PowerObfuscatorSPRX.prx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-PS3/PowerObfuscatorSPRX.prx
--------------------------------------------------------------------------------
/bin/Release-PS3/libPowerObfuscator.a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-PS3/libPowerObfuscator.a
--------------------------------------------------------------------------------
/bin/Release-x64/PowerObfuscatorGUI.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/PowerObfuscatorGUI.exe
--------------------------------------------------------------------------------
/bin/Release-x64/SecureTool.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/SecureTool.exe
--------------------------------------------------------------------------------
/bin/Release-x64/data/keys:
--------------------------------------------------------------------------------
1 | [NP_tid]
2 | type=OTHER
3 | key=9B515FEACF75064981AA604D91A54E97
4 |
5 | [NP_ci]
6 | type=OTHER
7 | key=6BA52976EFDA16EF3C339FB2971E256B
8 |
9 | [NP_klic_free]
10 | type=OTHER
11 | key=72F990788F9CFF745725F08E4C128387
12 |
13 | [NP_klic_key]
14 | type=OTHER
15 | key=F2FBCA7A75B04EDC1390638CCDFDD1EE
16 |
17 | [NP_idps_const]
18 | type=OTHER
19 | key=5E06E04FD94A71BF0000000000000001
20 |
21 | [NP_rif_key]
22 | type=OTHER
23 | key=DA7D4B5E499A4F53B1C1A14A7484443B
24 |
25 | [NP_sig]
26 | type=OTHER
27 | pub=E6792E446CEBA27BCADF374B99504FD8E80ADFEB3E66DE73FFE58D3291221C65018C038D3822C3C9
28 | priv=000000000000000000000000000000000000000000
29 | ctype=2
30 |
31 | [pkg]
32 | type=PKG
33 | revision=00
34 | version=0003005500000000
35 | erk=A97818BD193A67A16FE83A855E1BE9FB5640938D4DBCB2CB52C5A2F8B02B1031
36 | riv=4ACEF01224FBEEDF8245F8FF10211E6E
37 | pub=41DA1A8F74FF8D3F1CE20EF3E9D8865C96014FE373CA143C9BADEDF2D9D3C7573307115CCFE04F13
38 | priv=00542D46E7B3DAAC8AEB81E533873AABD6D74BB710
39 | ctype=23
40 |
41 | [pkg]
42 | type=PKG
43 | revision=01
44 | version=0003005600000000
45 | erk=F8F99006F1C007D5D0B1909E9566E0E70B569399FC3394A811809FDB5CAE92CD
46 | riv=59D28DB4ADDFB40B7D768BC9667C67B1
47 | pub=5432BDDD1F97418147AFF016EAA6100834F2CAA8C498B88965689EE44DF349B066CD43CBF4F2C5D0
48 | priv=
49 | ctype=17
50 |
51 | [spp]
52 | type=SPP
53 | revision=00
54 | version=0003005500000000
55 | erk=56C655747A4B6957A2D8BB9AC605C297E6AC9871932BFECDDE066CEE5B29470A
56 | riv=007E6B268EF1E986D10A9889CF93A8CB
57 | pub=265C04E7F20C3B8ACAC90E7C9D12757ED7ACBC01AA6624A2A927E719A4AA1222F87D917005F6072A
58 | priv=0001608EF3BACAFFB8C3A5958A24F758325B62B08C
59 | ctype=22
60 |
61 | [spp]
62 | type=SPP
63 | revision=01
64 | version=0003005600000000
65 | erk=7FD222B3FEF467DF7E3F63AC8B77501A3B38752411E96AFEDA6587B5CD5E91B0
66 | riv=B889290922B002F57086B818A8FDE3CC
67 | pub=71E12CB3D81AFA79670AF4FAC4BBE41AA7F7DDF368F5615E933CB1C21A783B73C085CA49986CCF63
68 | priv=
69 | ctype=22
70 |
71 | [spp]
72 | type=SPP
73 | revision=02
74 | version=0003006000000000
75 | erk=ED17248214B9AB34D57ED5CA6CCAEC9879137B4B46CE5064E6491D34001BACF2
76 | riv=3E05572881C5BC845D310EAC28497B08
77 | pub=504F905A8AAAA0E9BF55F6D5285697E2CABDB1A5240C4745BE8923308169EAB43E1BFD265F5E579E
78 | priv=
79 | ctype=
80 |
81 | [rvk]
82 | type=RVK
83 | revision=00
84 | version=0003005500000000
85 | erk=03AF06FD1CE6DA366361682CDF59F9708B5D7876F40A9E1E9AC2B22F51B60BDF
86 | riv=8B5D7876F40A9E1E9AC2B22F51B60BDF
87 | pub=9ADE7830EB74245EC357CE4F6401633E5A8048FD865F9D8F1A9189535A37623E2921427463A754F7
88 | priv=00245E673B039D656DA206BDAE4EAEFCBF2A8D5EAF
89 | ctype=29
90 |
91 | [rvk]
92 | type=RVK
93 | revision=01
94 | version=0003005600000000
95 | erk=22628A9EC4C414D5B32F2B4BA4926089DE9A461B190FB3E4392D057C525535DE
96 | riv=D5D4B8ED62B6CCA0249A79776E136975
97 | pub=51751B9F1DA58638D2D99F67E20A1D4A454C5B042CD1D0A449A2989808002BA68FB5B7F4B5B4E63B
98 | priv=
99 | ctype=32
100 |
101 | [rvk]
102 | type=RVK
103 | revision=02
104 | version=0003006000000000
105 | erk=BCFEDBE01D445CDEF335C543703D8E9C1199FAC33DC4595D7382EAF54EF9C4C3
106 | riv=B20A23079516205525683D8058379CBF
107 | pub=9859B677A5B8FCCA31A6FBA2E3220EE5E207343A58EEEE6B6CB260EB5E971352C45428E8C8398BE6
108 | priv=
109 | ctype=
110 |
111 | [metldr]
112 | type=SELF
113 | revision=00
114 | self_type=LDR
115 | erk=C0CEFE84C227F75BD07A7EB846509F93B238E770DACB9FF4A388F812482BE21B
116 | riv=47EE7454E4774CC9B8960C7B59F4C14D
117 | pub=C2D4AAF319355019AF99D44E2B58CA29252C89123D11D6218F40B138CAB29B7101F3AEB72A975019
118 | priv=00C5B2BFA1A413DD16F26D31C0F2ED4720DCFB0670
119 | ctype=20
120 |
121 | [isoldr]
122 | type=SELF
123 | version=0003001500000000
124 | self_type=ISO
125 | erk=8860D0CFF4D0DC688D3223321B96B59A777E6914961488E07048DAECB020ECA4
126 | riv=C82D015D46CF152F1DD0C16F18B5B1E5
127 | pub=733918D7C888130509346E6B4A8B6CAA357AB557E814E8122BF102C14A314BF9475B9D70EAF9EC29
128 | priv=009BE892E122A5C943C1BB7403A67318AA9E1B286F
129 | ctype=36
130 |
131 | [isoldr]
132 | type=SELF
133 | version=0003003100000000
134 | self_type=ISO
135 | erk=8860D0CFF4D0DC688D3223321B96B59A777E6914961488E07048DAECB020ECA4
136 | riv=C82D015D46CF152F1DD0C16F18B5B1E5
137 | pub=733918D7C888130509346E6B4A8B6CAA357AB557E814E8122BF102C14A314BF9475B9D70EAF9EC29
138 | priv=009BE892E122A5C943C1BB7403A67318AA9E1B286F
139 | ctype=36
140 |
141 | [isoldr]
142 | type=SELF
143 | version=0003004100000000
144 | self_type=ISO
145 | erk=101E27F3FA2FB53ACA924F783AD553162D56B975D05B81351A1111799F20254D
146 | riv=8D2E9C6297B8AD252998458296AC773C
147 | pub=138446EE0BDDA5638F97328C8956E6489CBBFE57C5961D40DD5C43BB4138F1C400A8B27204A5D625
148 | priv=00849DBC57D3B92F01864E6E82EB4EF0EF6311E122
149 | ctype=32
150 |
151 | [isoldr]
152 | type=SELF
153 | version=0003005000000000
154 | self_type=ISO
155 | erk=3F2604FA27AEADFBE1AC69EB00BB16EF196C2193CBD62900FFD8C25041680843
156 | riv=A414AC1DB7987E43777651B330B899E1
157 | pub=1F4633AFDE18614D6CEF38A2FD6C4CCAC7B6EB8109D72CD066ECEBA0193EA3F43C37AE83179A4E5F
158 | priv=0085B4B05DEBA7E6AD831653C974D95149803BB272
159 | ctype=33
160 |
161 | [isoldr]
162 | type=SELF
163 | version=0003005500000000
164 | self_type=ISO
165 | erk=BDB74AA6E3BA2DC10B1BD7F17198399A158DBE1FA0BEA68C90FCACBE4D04BE37
166 | riv=0207A479B1574F8E7F697528F05D5435
167 | pub=917E1F1DC48A54EB5F10B38E7569BB5383628A7C906F0DCA62FDA33805C15FAB270016940A09DB58
168 | priv=00294411363290975BA551336D3965D88AF029A17B
169 | ctype=03
170 |
171 | [isoldr]
172 | type=SELF
173 | version=0003005600000000
174 | self_type=ISO
175 | erk=311C015F169F2A1E0757F7064B14C7C9F3A3FFEE015BD4E3A22401A2667857CE
176 | riv=7BB8B3F5AC8E0890E3148AE5688C7350
177 | pub=3F040EFA2335FED5670BA4D5C3AB2D9D0B4BA69D154A0062EA995A7D21DBAF0DC5A0DAD333D1C1DD
178 | priv=
179 | ctype=08
180 |
181 | [isoldr]
182 | type=SELF
183 | version=0003006000000000
184 | self_type=ISO
185 | erk=8474ADCA3B3244931EECEB9357841442442A1C4A4BCF4E498E6738950F4E4093
186 | riv=FFF9CACCC4129125CAFB240F419E5F39
187 | pub=098E1A53E59A95316B00D5A29C05FFEBAE41D1A8A386F9DA96F98858FD25E07BB7A3BC96A5D5B556
188 | priv=
189 | ctype=03
190 |
191 | [isoldr]
192 | type=SELF
193 | revision=0001
194 | version=0004002000000000
195 | self_type=ISO
196 | erk=63565DBE98C3B1A52AADC907C47130FE57A10734E84F22592670F86ED2B0A086
197 | riv=953F6A99891B4739358F5363A00C08B9
198 | pub=26BE7B02E7D65C6C21BF4063CDB8C0092FE1679D62FA1A8CCC284A1D21885473A959992537A06612
199 | priv=
200 | ctype=15
201 |
202 | [isoldr]
203 | type=SELF
204 | revision=0001
205 | version=0004003000000000
206 | self_type=ISO
207 | erk=63565DBE98C3B1A52AADC907C47130FE57A10734E84F22592670F86ED2B0A086
208 | riv=953F6A99891B4739358F5363A00C08B9
209 | pub=26BE7B02E7D65C6C21BF4063CDB8C0092FE1679D62FA1A8CCC284A1D21885473A959992537A06612
210 | priv=
211 | ctype=15
212 |
213 | [lv1ldr]
214 | type=SELF
215 | version=0003001500000000
216 | self_type=LV1
217 | erk=B9F3F9E6107CFF2680A91E118C2403CF4A6F18F3C7EFD7D13D1AC4DB760BD222
218 | riv=B43661B9A79BAD9D8E2B046469CDA1E7
219 | pub=4C870BE86DDD996A92A3F7F404F33604244A1D02AB5B78BC9DAF030B78BE8867CF586171B7D45D20
220 | priv=002CC736C7AD06D264E9AB663EB1F35F5DC159248C
221 | ctype=33
222 |
223 | [lv1ldr]
224 | type=SELF
225 | version=0003004100000000
226 | self_type=LV1
227 | erk=B880593856C8C6D2037585626A12977F50DCFCF3F132D2C89AA6E670EAFC1646
228 | riv=A79B05D4E37B8117A95E6E7C14FB640E
229 | pub=7454C7CCBFC2F66C142D78A730A3A6F973CC0FB75A46FCBB390790138910A0CAC78E5E21F4DA3375
230 | priv=00033A699FDD2DA6CDD6CCC03B2C6145F998706F74
231 | ctype=34
232 |
233 | [lv1ldr]
234 | type=SELF
235 | version=0003005000000000
236 | self_type=LV1
237 | erk=1E8EEEA9E80A729F3FA52CF523B25941EA44B4155D94E5DADC5C5A77847620C7
238 | riv=E034D31A80316960024D1B3D3164FDC3
239 | pub=7E3A196F4A5879F3A7B091A2263F7C24E1716129B580566D308D9C2254B36AEE53DEF30EC85F8398
240 | priv=005815D17125D04C33790321DE29EB6241365100B5
241 | ctype=35
242 |
243 | [lv1ldr]
244 | type=SELF
245 | version=0003005500000000
246 | self_type=LV1
247 | erk=53ABDF84BE08B0351B734F2B97D2BE1621BC6C889E4362E5C70F39D6C3ED9F23
248 | riv=44E652661AC7584DBE08ECB810FB5FC0
249 | pub=733198A7759BC07326755BC9773A8A17C8A7043C7BDAB83D88E230512E2EA3852D7DA4263A7E97F9
250 | priv=004312C65347ACBE95CC306442FEFD0AF4C2935EB3
251 | ctype=05
252 |
253 | [lv1ldr]
254 | type=SELF
255 | version=0003005600000000
256 | self_type=LV1
257 | erk=48793EBDDA1AF65D737DA2FDA2DD104447A698F8A82CAAEE992831711BA94E83
258 | riv=15DCF3C67147A45D09DE7521EECA07A1
259 | pub=85A8868C320127F10B6598964C69221C086702021D31803520E21FDE4DBE827766BE41825CB7328C
260 | priv=
261 | ctype=07
262 |
263 | [lv1ldr]
264 | type=SELF
265 | version=0003006000000000
266 | self_type=LV1
267 | erk=5FF17D836E2C4AD69476E2614F64BDD05B9115389A9A6D055B5B544B1C34E3D5
268 | riv=DF0F50EC3C4743C5B17839D7B49F24A4
269 | pub=1CDABE30833823F461CA534104115FFF60010B710631E435A7D915E82AE88EDE667264656CB7062E
270 | priv=
271 | ctype=05
272 |
273 | [lv1ldr]
274 | type=SELF
275 | revision=0000
276 | version=0004002000000000
277 | self_type=LV1
278 | erk=10CEA04973FCCC12EC19924510822D8D4C41F657FD3D7E73F415A8D687421BCD
279 | riv=ED8699562C6AC65204FA166257E7FCF4
280 | pub=1C0587163886C7071808501900200000143FCF9E3B8586084080061518078D141C05C70D3885474918068C93143FCC17
281 | ctype=30
282 |
283 | [lv1ldr]
284 | type=SELF
285 | revision=0000
286 | version=0004003000000000
287 | self_type=LV1
288 | erk=10CEA04973FCCC12EC19924510822D8D4C41F657FD3D7E73F415A8D687421BCD
289 | riv=ED8699562C6AC65204FA166257E7FCF4
290 | pub=1C0587163886C7071808501900200000143FCF9E3B8586084080061518078D141C05C70D3885474918068C93143FCC17
291 | ctype=30
292 |
293 | [lv2ldr]
294 | type=SELF
295 | version=0000000800000000
296 | self_type=LV2
297 | erk=014485445EC9926C50F613AE77D9C37AA99838CCEB6F75FA78E29A8C622E8011
298 | riv=A17D6A522CB1B08F97DA8A82E97C12F7
299 |
300 | [lv2ldr]
301 | type=SELF
302 | version=0003001500000000
303 | self_type=LV2
304 | erk=94303F69513572AB5AE17C8C2A1839D2C24C28F65389D3BBB11894CE23E0798F
305 | riv=9769BFD187B90990AE5FEA4E110B9CF5
306 | pub=AFAF5E96AF396CBB69071082C46A8F34A030E8EDB799E0A7BE00AA264DFF3AEBF7923920D559404D
307 | priv=0070ABF9361B02291829D479F56AB248203CD3EB46
308 | ctype=20
309 |
310 | [lv2ldr]
311 | type=SELF
312 | version=0003004100000000
313 | self_type=LV2
314 | erk=575B0A6C4B4F2760A03FE4189EBAF4D947279FD982B14070349098B08FF92C10
315 | riv=411CB18F460CE50CAF2C426D8F0D93C8
316 | pub=3FEE313954CB3039C321A7E33B97FFDEC8988A8B55759161B04DBF4731284E4A8191E3F17D32B0EA
317 | priv=0073076441A08CD179E5FACE349B86DA58B5B7BA78
318 | ctype=21
319 |
320 | [lv2ldr]
321 | type=SELF
322 | version=0003005000000000
323 | self_type=LV2
324 | erk=6DBD48D787C58803A8D724DA5ACF04FF8FCE91D7545D2322F2B7ABF57014AF68
325 | riv=603A36213708520ED5D745DEC1325BA5
326 | pub=5888CB83AC3CCA9610BC173C53141C0CA58B93719E744660CA8823D5EAEE8F9BF736997054E4B7E3
327 | priv=0009EBC3DE442FA5FBF6C4F3D4F9EAB07778A142BD
328 | ctype=22
329 |
330 | [lv2ldr]
331 | type=SELF
332 | version=0003005500000000
333 | self_type=LV2
334 | erk=84015E90FA23139628A3C75CC09714E6427B527A82D18ABC3E91CD8D7DDAFF17
335 | riv=5B240444D645F2038118F97FD5A145D5
336 | pub=B266318245266B2D33641CD8A864066D077FAC60B7E27399099A70A683454B70F9888E7CC0C2BF72
337 | priv=009D4CBA2BFB1A8330D3E20E59D281D476D231C73A
338 | ctype=32
339 |
340 | [lv2ldr]
341 | type=SELF
342 | version=0003005600000000
343 | self_type=LV2
344 | erk=EAE15444048EFDE7A831BFA9F5D96F047C9FCFF50723E292CF50F5417D81E359
345 | riv=9CA9282DC7FA9F315EF3156D970B7CD4
346 | pub=0D58938CB47598A6A672874F1768068F8B80D8D17014D2ABEBAC85E5B0993D9FB6F307DDC3DDA699
347 | priv=
348 | ctype=33
349 |
350 | [lv2ldr]
351 | type=SELF
352 | version=0003006000000000
353 | self_type=LV2
354 | erk=88AD367EDEC2FEED3E2F99B1C685075C41BDEC90C84F526CAF588F89BBD1CBCC
355 | riv=8D18E8E525230E63DE10291C9DD615BF
356 | pub=86EED1D65E58890ABDA9ACA486A2BDDB9C0A529C2053FAE301F0F698EAF443DA0F60595A597A7027
357 | priv=
358 | ctype=32
359 |
360 | [lv2ldr]
361 | type=SELF
362 | revision=0000
363 | version=0004002000000000
364 | self_type=LV2
365 | erk=0CAF212B6FA53C0DA7E2C575ADF61DBE68F34A33433B1B891ABF5C4251406A03
366 | riv=9B79374722AD888EB6A35A2DF25A8B3E
367 | pub=695984B7EE2EC2F77FCC3120150DCE7E4480D84480DDD8C5940AEB6F79E63D17A8BA3E4E63B2BB06FC0CE57E3BB8FC46
368 |
369 | [lv2ldr]
370 | type=SELF
371 | revision=0000
372 | version=0004003000000000
373 | self_type=LV2
374 | erk=0CAF212B6FA53C0DA7E2C575ADF61DBE68F34A33433B1B891ABF5C4251406A03
375 | riv=9B79374722AD888EB6A35A2DF25A8B3E
376 | pub=695984B7EE2EC2F77FCC3120150DCE7E4480D84480DDD8C5940AEB6F79E63D17A8BA3E4E63B2BB06FC0CE57E3BB8FC46
377 |
378 | [appldr]
379 | type=SELF
380 | revision=0000
381 | version=0000008000000000
382 | self_type=APP
383 | erk=95F50019E7A68E341FA72EFDF4D60ED376E25CF46BB48DFDD1F080259DC93F04
384 | riv=4A0955D946DB70D691A640BB7FAECC4C
385 | pub=6F8DF8EBD0A1D1DB08B30DD3A951E3F1F27E34030B42C729C55555232D61B834B8BDFFB07E54B343
386 | priv=006C3E4CCB2C69A5AD7C6F60448E50C7F9184EEAF4
387 | ctype=21
388 |
389 | [appldr]
390 | type=SELF
391 | revision=0001
392 | version=0003001500000000
393 | self_type=APP
394 | erk=79481839C406A632BDB4AC093D73D99AE1587F24CE7E69192C1CD0010274A8AB
395 | riv=6F0F25E1C8C4B7AE70DF968B04521DDA
396 | pub=94D1B7378BAFF5DFED269240A7A364ED68446741622E50BC6079B6E606A2F8E0A4C56E5CFF836526
397 | priv=003DE80167D2F0E9D30F2145144A558D1174F5410C
398 | ctype=11
399 |
400 | [appldr]
401 | type=SELF
402 | revision=0002
403 | version=0003001500000000
404 | self_type=APP
405 | erk=4F89BE98DDD43CAD343F5BA6B1A133B0A971566F770484AAC20B5DD1DC9FA06A
406 | riv=90C127A9B43BA9D8E89FE6529E25206F
407 | pub=8CA6905F46148D7D8D84D2AFCEAE61B41E6750FC22EA435DFA61FCE6F4F860EE4F54D9196CA5290E
408 | priv=
409 | ctype=13
410 |
411 | [appldr]
412 | type=SELF
413 | revision=0003
414 | version=0003001500000000
415 | self_type=APP
416 | erk=C1E6A351FCED6A0636BFCB6801A0942DB7C28BDFC5E0A053A3F52F52FCE9754E
417 | riv=E0908163F457576440466ACAA443AE7C
418 | pub=50022D5D37C97905F898E78E7AA14A0B5CAAD5CE8190AE5629A10D6F0CF4173597B37A95A7545C92
419 | priv=
420 | ctype=0B
421 |
422 | [appldr]
423 | type=SELF
424 | revision=0004
425 | version=0003004100000000
426 | self_type=APP
427 | erk=838F5860CF97CDAD75B399CA44F4C214CDF951AC795298D71DF3C3B7E93AAEDA
428 | riv=7FDBB2E924D182BB0D69844ADC4ECA5B
429 | pub=1F140E8EF887DAB52F079A06E6915A6460B75CD256834A43FA7AF90C23067AF412EDAFE2C1778D69
430 | priv=0074E922FDEE5DC4CDF22FC8D7986477F813400860
431 | ctype=14
432 |
433 | [appldr]
434 | type=SELF
435 | revision=0005
436 | version=0003004100000000
437 | self_type=APP
438 | erk=C109AB56593DE5BE8BA190578E7D8109346E86A11088B42C727E2B793FD64BDC
439 | riv=15D3F191295C94B09B71EBDE088A187A
440 | pub=B6BB0A84C649A90D97EBA55B555366F52381BB38A84C8BB71DA5A5A0949043C6DB249029A43156F7
441 | priv=
442 | ctype=15
443 |
444 | [appldr]
445 | type=SELF
446 | revision=0006
447 | version=0003004100000000
448 | self_type=APP
449 | erk=6DFD7AFB470D2B2C955AB22264B1FF3C67F180983B26C01615DE9F2ECCBE7F41
450 | riv=24BD1C19D2A8286B8ACE39E4A37801C2
451 | pub=71F46AC33FF89DF589A100A7FB64CEAC244C9A0CBBC1FDCE80FB4BF8A0D2E66293309CB8EE8CFA95
452 | priv=
453 | ctype=2C
454 |
455 | [appldr]
456 | type=SELF
457 | revision=0007
458 | version=0003005000000000
459 | self_type=APP
460 | erk=945B99C0E69CAF0558C588B95FF41B232660ECB017741F3218C12F9DFDEEDE55
461 | riv=1D5EFBE7C5D34AD60F9FBC46A5977FCE
462 | pub=AB284CA549B2DE9AA5C903B75652F78D192F8F4A8F3CD99209415C0A84C5C9FD6BF3095C1C18FFCD
463 | priv=002CF896D35DB871D0E6A252E799876A70D043C23E
464 | ctype=15
465 |
466 | [appldr]
467 | type=SELF
468 | revision=0008
469 | version=0003005000000000
470 | self_type=APP
471 | erk=2C9E8969EC44DFB6A8771DC7F7FDFBCCAF329EC3EC070900CABB23742A9A6E13
472 | riv=5A4CEFD5A9C3C093D0B9352376D19405
473 | pub=6E82F6B54A0E9DEBE4A8B3043EE3B24CD9BBB62B4416B0482582E419A2552E29AB4BEA0A4D7FA2D5
474 | priv=
475 | ctype=16
476 |
477 | [appldr]
478 | type=SELF
479 | revision=0009
480 | version=0003005000000000
481 | self_type=APP
482 | erk=F69E4A2934F114D89F386CE766388366CDD210F1D8913E3B973257F1201D632B
483 | riv=F4D535069301EE888CC2A852DB654461
484 | pub=1D7B974D10E61C2ED087A0981535904677EC07E96260F89565FF7EBDA4EE035C2AA9BCBDD5893F99
485 | priv=
486 | ctype=2D
487 |
488 | [appldr]
489 | type=SELF
490 | revision=000A
491 | version=0003005500000000
492 | self_type=APP
493 | erk=29805302E7C92F204009161CA93F776A072141A8C46A108E571C46D473A176A3
494 | riv=5D1FAB844107676ABCDFC25EAEBCB633
495 | pub=09301B6436C85B53CB1585300A3F1AF9FB14DB7C30088C4642AD66D5C148B8995BB1A698A8C71827
496 | priv=0010818ED8A666051C6198662C3D6DDE2CA4901DDC
497 | ctype=25
498 |
499 | [appldr]
500 | type=SELF
501 | revision=000B
502 | version=0003005500000000
503 | self_type=APP
504 | erk=A4C97402CC8A71BC7748661FE9CE7DF44DCE95D0D58938A59F47B9E9DBA7BFC3
505 | riv=E4792F2B9DB30CB8D1596077A13FB3B5
506 | pub=2733C889D289550FE00EAA5A47A34CEF0C1AF187610EB07BA35D2C09BB73C80B244EB4147700D1BF
507 | priv=
508 | ctype=26
509 |
510 | [appldr]
511 | type=SELF
512 | revision=000C
513 | version=0003005500000000
514 | self_type=APP
515 | erk=9814EFFF67B7074D1B263BF85BDC8576CE9DEC914123971B169472A1BC2387FA
516 | riv=D43B1FA8BE15714B3078C23908BB2BCA
517 | pub=7D1986C6BEE6CE1E0C5893BD2DF203881F40D5056761CC3F1F2E9D9A378617A2DE40BA5F09844CEB
518 | priv=
519 | ctype=3D
520 |
521 | [appldr]
522 | type=SELF
523 | revision=000D
524 | version=0003005600000000
525 | self_type=APP
526 | erk=03B4C421E0C0DE708C0F0B71C24E3EE04306AE7383D8C5621394CCB99FF7A194
527 | riv=5ADB9EAFE897B54CB1060D6885BE22CF
528 | pub=71502ADB5783583AB88B2D5F23F419AF01C8B1E72FCA1E694AD49FE3266F1F9C61EFC6F29B351142
529 | priv=
530 | ctype=12
531 |
532 | [appldr]
533 | type=SELF
534 | revision=000E
535 | version=0003005600000000
536 | self_type=APP
537 | erk=39A870173C226EB8A3EEE9CA6FB675E82039B2D0CCB22653BFCE4DB013BAEA03
538 | riv=90266C98CBAA06C1BF145FF760EA1B45
539 | pub=84DE5692809848E5ACBE25BE548F6981E3DB14735A5DDE1A0FD1F475866532B862B1AB6A004B7255
540 | priv=
541 | ctype=27
542 |
543 | [appldr]
544 | type=SELF
545 | revision=000F
546 | version=0003005600000000
547 | self_type=APP
548 | erk=FD52DFA7C6EEF5679628D12E267AA863B9365E6DB95470949CFD235B3FCA0F3B
549 | riv=64F50296CF8CF49CD7C643572887DA0B
550 | pub=0696D6CCBD7CF585EF5E00D547503C185D7421581BAD196E081723CD0A97FA40B2C0CD2492B0B5A1
551 | priv=
552 | ctype=3A
553 |
554 | [appldr]
555 | type=SELF
556 | revision=0010
557 | version=0003006000000000
558 | self_type=APP
559 | erk=A5E51AD8F32FFBDE808972ACEE46397F2D3FE6BC823C8218EF875EE3A9B0584F
560 | riv=7A203D5112F799979DF0E1B8B5B52AA4
561 | pub=50597B7F680DD89F6594D9BDC0CBEE03666AB53647D0487F7F452FE2DD02694631EA755548C9E934
562 | priv=
563 | ctype=25
564 |
565 | [appldr]
566 | type=SELF
567 | revision=0011
568 | version=0003006000000000
569 | self_type=APP
570 | erk=0F8EAB8884A51D092D7250597388E3B8B75444AC138B9D36E5C7C5B8C3DF18FD
571 | riv=97AF39C383E7EF1C98FA447C597EA8FE
572 | pub=2FDA7A56AAEA65921C0284FF1942C6DE137370093D106034B59191951A5201B422D462F8726F852D
573 | priv=
574 | ctype=26
575 |
576 | [appldr]
577 | type=SELF
578 | revision=0013
579 | version=0003006500000000
580 | self_type=APP
581 | erk=DBF62D76FC81C8AC92372A9D631DDC9219F152C59C4B20BFF8F96B64AB065E94
582 | riv=CB5DD4BE8CF115FFB25801BC6086E729
583 | pub=B26FE6D3E3A1E766FAE79A8E6A7F48998E7FC1E4B0AD8745FF54C018C2A6CC7A0DD7525FAFEA4917
584 | priv=
585 | ctype=12
586 |
587 | [appldr]
588 | type=SELF
589 | revision=0014
590 | version=0003006500000000
591 | self_type=APP
592 | erk=491B0D72BB21ED115950379F4564CE784A4BFAABB00E8CB71294B192B7B9F88E
593 | riv=F98843588FED8B0E62D7DDCB6F0CECF4
594 | pub=04275E8838EF95BD013B223C3DF674540932F21B534C7ED2944B9104D938FEB03B824DDB866AB26E
595 | priv=
596 | ctype=27
597 |
598 | [appldr]
599 | type=SELF
600 | revision=0016
601 | version=0003007000000000
602 | self_type=APP
603 | erk=A106692224F1E91E1C4EBAD4A25FBFF66B4B13E88D878E8CD072F23CD1C5BF7C
604 | riv=62773C70BD749269C0AFD1F12E73909E
605 | pub=566635D3E1DCEC47243AAD1628AE6B2CEB33463FC155E4635846CE33899C5E353DDFA47FEF5694AF
606 | priv=
607 | ctype=30
608 |
609 | [appldr]
610 | type=SELF
611 | revision=0017
612 | version=0003007000000000
613 | self_type=APP
614 | erk=4E104DCE09BA878C75DA98D0B1636F0E5F058328D81419E2A3D22AB0256FDF46
615 | riv=954A86C4629E116532304A740862EF85
616 | pub=3B7B04C71CAE2B1199D57453C038BB1B541A05AD1B94167B0AB47A9B24CAECB9000CB21407009666
617 | priv=
618 | ctype=08
619 |
620 | [appldr]
621 | type=SELF
622 | revision=0019
623 | version=0004000000000000
624 | self_type=APP
625 | erk=3236B9937174DF1DC12EC2DD8A318A0EA4D3ECDEA5DFB4AC1B8278447000C297
626 | riv=6153DEE781B8ADDC6A439498B816DC46
627 | pub=148DCA961E2738BAF84B2D1B6E2DA2ABD6A95F2C9571E54C6922F9ED9674F062B7F1BE5BD6FA5268
628 | priv=
629 | ctype=31
630 |
631 | [appldr]
632 | type=SELF
633 | revision=001A
634 | version=0004000000000000
635 | self_type=APP
636 | erk=5EFD1E9961462794E3B9EF2A4D0C1F46F642AAE053B5025504130590E66F19C9
637 | riv=1AC8FA3B3C90F8FDE639515F91B58327
638 | pub=BE4B1B513536960618BFEF12A713F6673881B02F9DC616191E823FC8337CCF99ADAA6172019C0C23
639 | priv=
640 | ctype=17
641 |
642 | [appldr]
643 | type=SELF
644 | revision=001C
645 | version=0004002000000000
646 | self_type=APP
647 | erk=CFF025375BA0079226BE01F4A31F346D79F62CFB643CA910E16CF60BD9092752
648 | riv=FD40664E2EBBA01BF359B0DCDF543DA4
649 | pub=36C1ACE6DD5CCC0006FDF3424750FAC515FC5CFA2C93EC53C6EC2BC421708D154E91F2E7EA54A893
650 | priv=
651 | ctype=09
652 |
653 | [appldr]
654 | type=SELF
655 | revision=001D
656 | version=0004002000000000
657 | self_type=APP
658 | erk=D202174EB65A62048F3674B59EF6FE72E1872962F3E1CD658DE8D7AF71DA1F3E
659 | riv=ACB9945914EBB7B9A31ECE320AE09F2D
660 | pub=430322887503CF52928FAAA410FD623C7321281C8825D95F5B47EF078EFCFC44454C3AB4F00BB879
661 | priv=
662 | ctype=1A
663 |
664 | [appldr]
665 | type=SELF
666 | revision=001E
667 | version=0004003000000000
668 | self_type=APP
669 | erk=46BD0891224E0CE13E2162921D4BB76193AEEE4416A729FCDD111C5536BF87C9
670 | riv=BF036387CDB613C0AC88A6D9D2CC5316
671 | pub=A14F6D5F9AD7EBB3B7A39A7C32F13E5DC3B0BA16BDC33D39FDDF88F4AEEA6CFEEB0C0796C917A952
672 | priv=
673 | ctype=0F
674 |
675 |
676 |
677 | [appldr]
678 | type=SELF
679 | revision=0000
680 | version=0000009200000000
681 | self_type=NPDRM
682 | erk=D91166973979EA8694476B011AC62C7E9F37DA26DE1E5C2EE3D66E42B8517085
683 | riv=DC01280A6E46BC674B81A7E8801EBE6E
684 | pub=A0FC44108236141BF3517A662B027AFC1AC513A05690496C754DEB7D43BDC41B80FD75C212624EE4
685 | priv=
686 | ctype=11
687 |
688 | [appldr]
689 | type=SELF
690 | revision=0001
691 | version=0001000000000000
692 | self_type=NPDRM
693 | erk=F9EDD0301F770FABBA8863D9897F0FEA6551B09431F61312654E28F43533EA6B
694 | riv=A551CCB4A42C37A734A2B4F9657D5540
695 | pub=B05F9DA5F9121EE4031467E74C505C29A8E29D1022379EDFF0500B9AE480B5DAB4578A4C61C5D6BF
696 | priv=00040AB47509BED04BD96521AD1B365B86BF620A98
697 | ctype=11
698 |
699 | [appldr]
700 | type=SELF
701 | revision=0002
702 | version=0001000000000000
703 | self_type=NPDRM
704 | erk=8E737230C80E66AD0162EDDD32F1F774EE5E4E187449F19079437A508FCF9C86
705 | riv=7AAECC60AD12AED90C348D8C11D2BED5
706 | pub=05BF09CB6FD78050C78DE69CC316FF27C9F1ED66A45BFCE0A1E5A6749B19BD546BBB4602CF373440
707 | priv=
708 | ctype=0A
709 |
710 | [appldr]
711 | type=SELF
712 | revision=0003
713 | version=0003001500000000
714 | self_type=NPDRM
715 | erk=1B715B0C3E8DC4C1A5772EBA9C5D34F7CCFE5B82025D453F3167566497239664
716 | riv=E31E206FBB8AEA27FAB0D9A2FFB6B62F
717 | pub=3F51E59FC74D6618D34431FA67987FA11ABBFACC7111811473CD9988FE91C43FC74605E7B8CB732D
718 | priv=
719 | ctype=08
720 |
721 | [appldr]
722 | type=SELF
723 | revision=0004
724 | version=0003004000000000
725 | self_type=NPDRM
726 | erk=BB4DBF66B744A33934172D9F8379A7A5EA74CB0F559BB95D0E7AECE91702B706
727 | riv=ADF7B207A15AC601110E61DDFC210AF6
728 | pub=9C327471BAFF1F877AE4FE29F4501AF5AD6A2C459F8622697F583EFCA2CA30ABB5CD45D1131CAB30
729 | priv=00B61A91DF4AB6A9F142C326BA9592B5265DA88856
730 | ctype=16
731 |
732 | [appldr]
733 | type=SELF
734 | revision=0005
735 | version=0003004000000000
736 | self_type=NPDRM
737 | erk=B73111B0B00117E48DE5E2EE5E534C0F0EFFA4890BBB8CAD01EE0F848F91583E
738 | riv=86F56F9E5DE513894874B8BA253334B1
739 | pub=B0BA1A1AB9723BB4E87CED9637BE056066BC56E16572D43D0210A06411DBF8FEB8885CD912384AE5
740 | priv=
741 | ctype=12
742 |
743 | [appldr]
744 | type=SELF
745 | revision=0006
746 | version=0003004000000000
747 | self_type=NPDRM
748 | erk=8B4C52849765D2B5FA3D5628AFB17644D52B9FFEE235B4C0DB72A62867EAA020
749 | riv=05719DF1B1D0306C03910ADDCE4AF887
750 | pub=2A5D6C6908CA98FC4740D834C6400E6D6AD74CF0A712CF1E7DAE806E98605CC308F6A03658F2970E
751 | priv=
752 | ctype=29
753 |
754 | [appldr]
755 | type=SELF
756 | revision=0007
757 | version=0003005000000000
758 | self_type=NPDRM
759 | erk=3946DFAA141718C7BE339A0D6C26301C76B568AEBC5CD52652F2E2E0297437C3
760 | riv=E4897BE553AE025CDCBF2B15D1C9234E
761 | pub=A13AFE8B63F897DA2D3DC3987B39389DC10BAD99DFB703838C4A0BC4E8BB44659C726CFD0CE60D0E
762 | priv=009EF86907782A318D4CC3617EBACE2480E73A46F6
763 | ctype=17
764 |
765 | [appldr]
766 | type=SELF
767 | revision=0008
768 | version=0003005000000000
769 | self_type=NPDRM
770 | erk=8E944267C02E69A4FE474B7F5FCD7974A4F936FF4355AEC4F80EFA123858D8F6
771 | riv=908A75754E521EAC2F5A4889C6D7B72D
772 | pub=91201DA7D79E8EE2563142ECBD646DA026C963AC09E760E5390FFE24DAE6864310ABE147F8204D0B
773 | priv=
774 | ctype=13
775 |
776 | [appldr]
777 | type=SELF
778 | revision=0009
779 | version=0003005000000000
780 | self_type=NPDRM
781 | erk=0786F4B0CA5937F515BDCE188F569B2EF3109A4DA0780A7AA07BD89C3350810A
782 | riv=04AD3C2F122A3B35E804850CAD142C6D
783 | pub=A1FE61035DBBEA5A94D120D03C000D3B2F084B9F4AFA99A2D4A588DF92B8F36327CE9E47889A45D0
784 | priv=
785 | ctype=2A
786 |
787 | [appldr]
788 | type=SELF
789 | revision=000A
790 | version=0003005500000000
791 | self_type=NPDRM
792 | erk=03C21AD78FBB6A3D425E9AAB1298F9FD70E29FD4E6E3A3C151205DA50C413DE4
793 | riv=0A99D4D4F8301A88052D714AD2FB565E
794 | pub=3995C390C9F7FBBAB124A1C14E70F9741A5E6BDF17A605D88239652C8EA7D5FC9F24B30546C1E44B
795 | priv=009AC6B22A056BA9E0B6D1520F28A57A3135483F9F
796 | ctype=27
797 |
798 | [appldr]
799 | type=SELF
800 | revision=000B
801 | version=0003005500000000
802 | self_type=NPDRM
803 | erk=BB31DF9A6F62C0DF853075FAA65134D9CE2240306C1731D1F7DA9B5329BD699F
804 | riv=263057225873F83940A65C8C926AC3E4
805 | pub=BC3A82A4F44C43A197070CD236FDC94FCC542D69A3E803E0AFF78D1F3DA19A79D2F61FAB5B94B437
806 | priv=
807 | ctype=23
808 |
809 | [appldr]
810 | type=SELF
811 | revision=000C
812 | version=0003005500000000
813 | self_type=NPDRM
814 | erk=337A51416105B56E40D7CAF1B954CDAF4E7645F28379904F35F27E81CA7B6957
815 | riv=8405C88E042280DBD794EC7E22B74002
816 | pub=9BFF1CC7118D2393DE50D5CF44909860683411A532767BFDAC78622DB9E5456753FE422CBAFA1DA1
817 | priv=
818 | ctype=18
819 |
820 | [appldr]
821 | type=SELF
822 | revision=000D
823 | version=0003005600000000
824 | self_type=NPDRM
825 | erk=357EBBEA265FAEC271182D571C6CD2F62CFA04D325588F213DB6B2E0ED166D92
826 | riv=D26E6DD2B74CD78E866E742E5571B84F
827 | pub=00DCF5391618604AB42C8CFF3DC304DF45341EBA4551293E9E2B68FFE2DF527FFA3BE8329E015E57
828 | priv=
829 | ctype=3A
830 |
831 | [appldr]
832 | type=SELF
833 | revision=000E
834 | version=0003005600000000
835 | self_type=NPDRM
836 | erk=71AA75C70A255580E4AE9BDAA0B08828C53EAA713CD0713797F143B284C1589B
837 | riv=9DED878CB6BA07121C0F50E7B172A8BF
838 | pub=387FCDAEAFF1B59CFAF79CE6215A065ACEAFFAF4048A4F217E1FF5CE67C66EC3F089DB235E52F9D3
839 | priv=
840 | ctype=29
841 |
842 | [appldr]
843 | type=SELF
844 | revision=000F
845 | version=0003005600000000
846 | self_type=NPDRM
847 | erk=135C098CBE6A3E037EBE9F2BB9B30218DDE8D68217346F9AD33203352FBB3291
848 | riv=4070C898C2EAAD1634A288AA547A35A8
849 | pub=BBD7CCCB556C2EF0F908DC7810FAFC37F2E56B3DAA5F7FAF53A4944AA9B841F76AB091E16B231433
850 | priv=
851 | ctype=3B
852 |
853 | [appldr]
854 | type=SELF
855 | revision=0010
856 | version=0003006000000000
857 | self_type=NPDRM
858 | erk=4B3CD10F6A6AA7D99F9B3A660C35ADE08EF01C2C336B9E46D1BB5678B4261A61
859 | riv=C0F2AB86E6E0457552DB50D7219371C5
860 | pub=64A5C60BC2AD18B8A237E4AA690647E12BF7A081523FAD4F29BE89ACAC72F7AB43C74EC9AFFDA213
861 | ctype=27
862 |
863 | [appldr]
864 | type=SELF
865 | revision=0013
866 | version=0003006500000000
867 | self_type=NPDRM
868 | erk=265C93CF48562EC5D18773BEB7689B8AD10C5EB6D21421455DEBC4FB128CBF46
869 | riv=8DEA5FF959682A9B98B688CEA1EF4A1D
870 | pub=9D8DB5A880608DC69717991AFC3AD5C0215A5EE413328C2ABC8F35589E04432373DB2E2339EEF7C8
871 | priv=
872 | ctype=18
873 |
874 | [appldr]
875 | type=SELF
876 | revision=0016
877 | version=0003007000000000
878 | self_type=NPDRM
879 | erk=7910340483E419E55F0D33E4EA5410EEEC3AF47814667ECA2AA9D75602B14D4B
880 | riv=4AD981431B98DFD39B6388EDAD742A8E
881 | pub=62DFE488E410B1B6B2F559E4CB932BCB78845AB623CC59FDF65168400FD76FA82ED1DC60E091D1D1
882 | priv=
883 | ctype=25
884 |
885 | [appldr]
886 | type=SELF
887 | revision=0019
888 | version=0004000000000000
889 | self_type=NPDRM
890 | erk=FBDA75963FE690CFF35B7AA7B408CF631744EDEF5F7931A04D58FD6A921FFDB3
891 | riv=F72C1D80FFDA2E3BF085F4133E6D2805
892 | pub=637EAD34E7B85C723C627E68ABDD0419914EBED4008311731DD87FDDA2DAF71F856A70E14DA17B42
893 | priv=
894 | ctype=24
895 |
896 | [appldr]
897 | type=SELF
898 | revision=0019
899 | version=0004000100000000
900 | self_type=NPDRM
901 | erk=FBDA75963FE690CFF35B7AA7B408CF631744EDEF5F7931A04D58FD6A921FFDB3
902 | riv=F72C1D80FFDA2E3BF085F4133E6D2805
903 | pub=637EAD34E7B85C723C627E68ABDD0419914EBED4008311731DD87FDDA2DAF71F856A70E14DA17B42
904 | priv=
905 | ctype=24
906 |
907 | [appldr]
908 | type=SELF
909 | revision=001C
910 | version=0004002000000000
911 | self_type=NPDRM
912 | erk=8103EA9DB790578219C4CEDF0592B43064A7D98B601B6C7BC45108C4047AA80F
913 | riv=246F4B8328BE6A2D394EDE20479247C5
914 | pub=503172C9551308A87621ECEE90362D14889BFED2CF32B0B3E32A4F9FE527A41464B735E1ADBC6762
915 | priv=
916 | ctype=30
917 |
--------------------------------------------------------------------------------
/bin/Release-x64/data/ldr_curves:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/data/ldr_curves
--------------------------------------------------------------------------------
/bin/Release-x64/data/vsh_curves:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/data/vsh_curves
--------------------------------------------------------------------------------
/bin/Release-x64/ps3bin.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/ps3bin.exe
--------------------------------------------------------------------------------
/bin/Release-x64/scetool.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/scetool.exe
--------------------------------------------------------------------------------
/bin/Release-x64/zlib1.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/bin/Release-x64/zlib1.dll
--------------------------------------------------------------------------------
/libPowerObfuscator/src/DumpObfuscation/DumpObfuscation.cpp:
--------------------------------------------------------------------------------
1 | #include "DumpObfuscation.h"
2 |
3 | namespace pobf
4 | {
5 | namespace DumpObfuscation
6 | {
7 | uint32_t g_EbootStart = 0;
8 | uint32_t g_EbootEnd = 0;
9 |
10 | void SetEbootRange(uint32_t ebootStartAddress, uint32_t ebootEndAddress)
11 | {
12 | g_EbootStart = ebootStartAddress;
13 | g_EbootEnd = ebootEndAddress;
14 | }
15 |
16 | void ReplaceLiR3WithLisR3(uint32_t i)
17 | {
18 | if (*(uint32_t*)i == 0x38600000) // li r3, 0
19 | *(uint32_t*)i = 0x3C600000; // lis r3, 0
20 | }
21 |
22 | void ReplaceLiR4WithLisR4(uint32_t i)
23 | {
24 | if (*(uint32_t*)i == 0x38800000) // li r4, 0
25 | *(uint32_t*)i = 0x3C800000; // lis r4, 0
26 | }
27 |
28 | void ReplaceLiR5WithLisR5(uint32_t i)
29 | {
30 | if (*(uint32_t*)i == 0x38A00000) // li r5, 0
31 | *(uint32_t*)i = 0x3CA00000; // lis r5, 0
32 | }
33 |
34 | void ReplaceLiR6WithLisR6(uint32_t i)
35 | {
36 | if (*(uint32_t*)i == 0x38C00000) // li r6, 0
37 | *(uint32_t*)i = 0x3CC00000; // lis r6, 0
38 | }
39 |
40 | void ReplaceLiR7WithLisR7(uint32_t i)
41 | {
42 | if (*(uint32_t*)i == 0x38E00000) // li r7, 0
43 | *(uint32_t*)i = 0x3CE00000; // lis r7, 0
44 | }
45 |
46 | void ReplaceLiR3WithXorR3(uint32_t i)
47 | {
48 | if (*(uint32_t*)i == 0x38600000) // li r3, 0
49 | *(uint32_t*)i = 0x7CA32A78; // xor r3, r5, r5
50 | }
51 |
52 | void ReplaceLiR4WithXorR4(uint32_t i)
53 | {
54 | if (*(uint32_t*)i == 0x38800000) // li r4, 0
55 | *(uint32_t*)i = 0x7CA42A78; // xor r4, r5, r5
56 | }
57 |
58 | void ReplaceLiR5WithXorR5(uint32_t i)
59 | {
60 | if (*(uint32_t*)i == 0x38A00000) // li r5, 0
61 | *(uint32_t*)i = 0x7CA52A78; // xor, r5, r5, r5
62 | }
63 |
64 | void ReplaceLiR6WithXorR6(uint32_t i)
65 | {
66 | if (*(uint32_t*)i == 0x38C00000) // li r6, 0
67 | *(uint32_t*)i = 0x7CA62A78; // xor r6, r5, r5
68 | }
69 |
70 | void ReplaceLiR7WithXorR7(uint32_t i)
71 | {
72 | if (*(uint32_t*)i == 0x38E00000) // li r7, 0
73 | *(uint32_t*)i = 0x7CA72A78; // xor, r7, r5, r5
74 | }
75 |
76 | void ReplaceLisR3()
77 | {
78 | if (!g_EbootStart)
79 | return;
80 |
81 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
82 | ReplaceLiR3WithLisR3(i);
83 | }
84 |
85 | void ReplaceLisR4()
86 | {
87 | if (!g_EbootStart)
88 | return;
89 |
90 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
91 | ReplaceLiR4WithLisR4(i);
92 | }
93 |
94 | void ReplaceLisR5()
95 | {
96 | if (!g_EbootStart)
97 | return;
98 |
99 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
100 | ReplaceLiR5WithLisR5(i);
101 | }
102 |
103 | void ReplaceLisR6()
104 | {
105 | if (!g_EbootStart)
106 | return;
107 |
108 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
109 | ReplaceLiR6WithLisR6(i);
110 | }
111 |
112 | void ReplaceLisR7()
113 | {
114 | if (!g_EbootStart)
115 | return;
116 |
117 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
118 | ReplaceLiR7WithLisR7(i);
119 | }
120 |
121 | void ReplaceXorR3()
122 | {
123 | if (!g_EbootStart)
124 | return;
125 |
126 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
127 | ReplaceLiR3WithXorR3(i);
128 | }
129 |
130 | void ReplaceXorR4()
131 | {
132 | if (!g_EbootStart)
133 | return;
134 |
135 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
136 | ReplaceLiR4WithXorR4(i);
137 | }
138 |
139 | void ReplaceXorR5()
140 | {
141 | if (!g_EbootStart)
142 | return;
143 |
144 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
145 | ReplaceLiR5WithXorR5(i);
146 | }
147 |
148 | void ReplaceXorR6()
149 | {
150 | if (!g_EbootStart)
151 | return;
152 |
153 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
154 | ReplaceLiR6WithXorR6(i);
155 | }
156 |
157 | void ReplaceXorR7()
158 | {
159 | if (!g_EbootStart)
160 | return;
161 |
162 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
163 | ReplaceLiR7WithXorR7(i);
164 | }
165 |
166 | void ReplaceByType(uint32_t type)
167 | {
168 | if (!g_EbootStart)
169 | return;
170 |
171 | for (uint32_t i = g_EbootStart; i < g_EbootEnd; i += 4)
172 | {
173 | if (type & LisR3)
174 | ReplaceLiR3WithLisR3(i);
175 |
176 | if (type & LisR4)
177 | ReplaceLiR4WithLisR4(i);
178 |
179 | if (type & LisR5)
180 | ReplaceLiR5WithLisR5(i);
181 |
182 | if (type & LisR6)
183 | ReplaceLiR6WithLisR6(i);
184 |
185 | if (type & LisR7)
186 | ReplaceLiR7WithLisR7(i);
187 |
188 | if (type & XorR3)
189 | ReplaceLiR3WithXorR3(i);
190 |
191 | if (type & XorR4)
192 | ReplaceLiR4WithXorR4(i);
193 |
194 | if (type & XorR5)
195 | ReplaceLiR5WithXorR5(i);
196 |
197 | if (type & XorR6)
198 | ReplaceLiR6WithXorR6(i);
199 |
200 | if (type & XorR7)
201 | ReplaceLiR7WithXorR7(i);
202 | }
203 | }
204 | }
205 |
206 | }
--------------------------------------------------------------------------------
/libPowerObfuscator/src/DumpObfuscation/DumpObfuscation.h:
--------------------------------------------------------------------------------
1 | #ifndef __DUMPOBFUSCATION_H__
2 | #define __DUMPOBFUSCATION_H__
3 |
4 | #include
5 |
6 | namespace pobf
7 | {
8 | namespace DumpObfuscation
9 | {
10 | enum Type : uint32_t
11 | {
12 | LisR3 = 1 << 0,
13 | LisR4 = 1 << 1,
14 | LisR5 = 1 << 2,
15 | LisR6 = 1 << 3,
16 | LisR7 = 1 << 4,
17 | XorR3 = 1 << 5,
18 | XorR4 = 1 << 6,
19 | XorR5 = 1 << 7,
20 | XorR6 = 1 << 8,
21 | XorR7 = 1 << 9
22 | };
23 |
24 | /**
25 | * @brief set the eboot start and end address
26 | * @note This function must be called before any of the other DumpObfuscation functions
27 | */
28 | void SetEbootRange(uint32_t ebootStartAddress, uint32_t ebootEndAddress);
29 |
30 | /**
31 | * @brief Replaces all 'li r3, 0' instructions with 'lis r3, 0'
32 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
33 | * All this does is slow down the attacker.
34 | */
35 | void ReplaceLisR3();
36 |
37 | /**
38 | * @brief Replaces all 'li r4, 0' instructions with 'lis r4, 0'
39 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
40 | * All this does is slow down the attacker.
41 | */
42 | void ReplaceLisR4();
43 |
44 | /**
45 | * @brief Replaces all 'li r5, 0' instructions with 'lis r5, 0'
46 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
47 | * All this does is slow down the attacker.
48 | */
49 | void ReplaceLisR5();
50 |
51 | /**
52 | * @brief Replaces all 'li r6, 0' instructions with 'lis r6, 0'
53 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
54 | * All this does is slow down the attacker.
55 | */
56 | void ReplaceLisR6();
57 |
58 | /**
59 | * @brief Replaces all 'li r7, 0' instructions with 'lis r7, 0'
60 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
61 | * All this does is slow down the attacker.
62 | */
63 | void ReplaceLisR7();
64 |
65 | /**
66 | * @brief Replaces all 'li r3, 0' instructions with 'xor r3, r5, r5'
67 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
68 | * All this does is slow down the attacker.
69 | */
70 | void ReplaceXorR3();
71 |
72 | /**
73 | * @brief Replaces all 'li r4, 0' instructions with 'xor r4, r5, r5'
74 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
75 | * All this does is slow down the attacker.
76 | */
77 | void ReplaceXorR4();
78 |
79 | /**
80 | * @brief Replaces all 'li r5, 0' instructions with 'xor, r5, r5, r5'
81 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
82 | * All this does is slow down the attacker.
83 | */
84 | void ReplaceXorR5();
85 |
86 | /**
87 | * @brief Replaces all 'li r6, 0' instructions with 'xor r6, r5, r5'
88 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
89 | * All this does is slow down the attacker.
90 | */
91 | void ReplaceXorR6();
92 |
93 | /**
94 | * @brief Replaces all 'li r7, 0' instructions with 'xor, r7, r5, r5'
95 | * @note If anyone tries to dump the game memory they will need to replace all these instruction in the dump if compared to the original eboot.
96 | * All this does is slow down the attacker.
97 | */
98 | void ReplaceXorR7();
99 |
100 | /**
101 | * @brief Replace instructions by type. Using enum DumpObfuscation::Type
102 | */
103 | void ReplaceByType(uint32_t type);
104 | }
105 | }
106 |
107 |
108 |
109 |
110 |
111 | #endif // __DUMPOBFUSCATION_H__
--------------------------------------------------------------------------------
/libPowerObfuscator/src/PowerObfuscator.cpp:
--------------------------------------------------------------------------------
1 | #include "PowerObfuscator.h"
2 |
3 | namespace pobf
4 | {
5 | pobfHeader pobf_header = {
6 | POBF_MAGIC,
7 | POBF_SIGNATURE,
8 | POBF_TEXT_SEGMENT_DUMMY_VALUES,
9 | POBF_DATA_SEGMENT_DUMMY_VALUES,
10 | POBF_RODATA_SEGMENT_DUMMY_VALUES,
11 | POBF_PLACEHOLDER_DUMMY_VALUES
12 | };
13 | }
--------------------------------------------------------------------------------
/libPowerObfuscator/src/PowerObfuscator.h:
--------------------------------------------------------------------------------
1 | #ifndef __POWEROBFUSCATOR_H__
2 | #define __POWEROBFUSCATOR_H__
3 |
4 | #include
5 | #include
6 | #include
7 | #undef vector
8 | #include
9 | #include
10 |
11 | /* symbols generated by the linker! */
12 | extern unsigned char const __start__Ztext[];
13 | extern unsigned char const __start__Zdata[];
14 | extern unsigned char const __start__Zrodata[];
15 |
16 | #define STATIC_ALWAYS_INLINE static inline __attribute__((always_inline))
17 | #define NO_STATIC_ALWAYS_INLINE inline __attribute__((always_inline))
18 | #define NO_INLINE __attribute__((noinline))
19 |
20 | #define POBF_MAGIC 'P', 'O', 'B', 'F'
21 | #define POBF_SIGNATURE 0xAABBCCDD, 0x12345678, 0xEEFFEEFF
22 | /* these values will be replaced by the real values using PowerObfuscatorGUI */
23 | #define POBF_TEXT_SEGMENT_DUMMY_VALUES 0xDEADBEEF, 0x0BADCAFE, 0x00DDBA11
24 | #define POBF_DATA_SEGMENT_DUMMY_VALUES 0x5CA1AB1E, 0x0DEC0DED, 0x00EFFEC7
25 | #define POBF_RODATA_SEGMENT_DUMMY_VALUES 0x5E1EC7ED, 0x05EEDBED, 0x05CABB1E
26 | #define POBF_PLACEHOLDER_DUMMY_VALUES 0x00FF5E75, 0x0001ABE1, 0x000F100D
27 |
28 | namespace pobf
29 | {
30 | struct opd_s
31 | {
32 | uint32_t func;
33 | uint32_t toc;
34 | };
35 |
36 | struct Pattern
37 | {
38 | const char* find;
39 | const char* mask;
40 | bool found;
41 | };
42 |
43 | struct pobfHeader
44 | {
45 | char magic[4];
46 | uint32_t signature1;
47 | uint32_t signature2;
48 | uint32_t signature3;
49 | uint32_t textSegmentStart;
50 | uint32_t textSegmentSize;
51 | uint32_t _padding1;
52 | uint32_t dataSegmentStart;
53 | uint32_t dataSegmentSize;
54 | uint32_t _padding2;
55 | uint32_t rodataSegmentStart;
56 | uint32_t rodataSegmentSize;
57 | uint32_t _padding3;
58 | uint32_t placeHolder1;
59 | uint32_t placeHolder2;
60 | uint32_t _padding4;
61 | char placeHolder5[60];
62 | };
63 |
64 | extern pobfHeader pobf_header;
65 |
66 | }
67 |
68 | #endif // __POWEROBFUSCATOR_H__
69 |
70 |
--------------------------------------------------------------------------------
/libPowerObfuscator/src/libPowerObfuscator.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | PS3
7 |
8 |
9 | Release
10 | PS3
11 |
12 |
13 |
14 | {71D35301-A6D2-4CE0-855C-BD7AE9D1D91C}
15 | libPowerObfuscator
16 |
17 |
18 |
19 | StaticLibrary
20 | true
21 | SNC
22 |
23 |
24 | StaticLibrary
25 | false
26 | SNC
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
40 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
41 |
42 |
43 | $(SolutionDir)bin\$(Configuration)-$(Platform)\
44 | $(SolutionDir)bin-int\$(Configuration)-$(Platform)\$(ProjectName)\
45 |
46 |
47 |
48 | _DEBUG;__CELL_ASSERT__;%(UserPreprocessorDefinitions);
49 | true
50 | %(UserPreprocessorDefinitions);$(BuiltInDefines);__INTELLISENSE__;%(PreprocessorDefinitions);
51 | Cpp11
52 |
53 |
54 | copy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)vendor\$(ProjectName)\lib\$(TargetFileName)"
55 |
56 |
57 |
58 |
59 | NDEBUG;%(UserPreprocessorDefinitions);
60 | Level2
61 | %(UserPreprocessorDefinitions);$(BuiltInDefines);__INTELLISENSE__;%(PreprocessorDefinitions);
62 | Cpp11
63 |
64 |
65 | copy /Y "$(TargetDir)$(TargetFileName)" "$(SolutionDir)vendor\$(ProjectName)\lib\$(TargetFileName)"
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/libPowerObfuscator/src/libPowerObfuscator.vcxproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | true
5 |
6 |
--------------------------------------------------------------------------------
/vendor/libPowerObfuscator/lib/libPowerObfuscator.a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheRouletteBoi/PowerObfuscator_PS3/7ba560fac894d54f3077c3d963d53dacdd7339ec/vendor/libPowerObfuscator/lib/libPowerObfuscator.a
--------------------------------------------------------------------------------