Jump to content

Reflection and obfuscation - Not the best friends!


Bedrock_Miner

Recommended Posts

Hello everyone!

 

Its me again.. I recently thought about whether its possible to get the obfuscated name for a method or a field at runtime.

This would mean you wouldn't have to write two statements to get the fields "field_71428_T" and "timer" from the class Minecraft.class, but you can just write

getFieldName("timer", Minecraft.class)

and you would automatically have the right field name.

 

Would this be possible?

Link to comment
Share on other sites

There's a way of detecting if you're in a deobf environment (I don't use reflection often enough to be using that method, or remember what it's called) and you can do an

if(obf) { str = "p_1234_0_" } else { str = "theThing" }

and do the reflection with the

str

variable.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Apparently I didnt say clearly what I meant.  ;D

I wanted to know whether there is a method to find out which obfuscated name belongs to a non-obfuscated name in a special class.

For instance, I have a method for this, I insert the class and the unobfuscated name and it returns the obfuscated one.

getObfuscatedName(Minecraft.class, "timer")
    returns: "field_71428_T"

Link to comment
Share on other sites

Oh that.  Not that I know of.  All that info is stored in a CSV file:

 

C:\Users\[username]\.gradle\caches\minecraft\net\minecraftforge\forge\[forge version]\unpacked\conf

 

You want fields.csv and methods.csv and be aware that same-name objects in different classes have different obfuscated names.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Basically it would be possible to do the same with a mapping from MCP->SRG. The only problem would be that for some special variables more than one name would be returned. For these variables a special test would be needed which of the names exist in the given class. If you do it right, this method would be as fast as direct reflection.

But anyway, I think this is possible, or do I miss something?

 

EDIT:

Btw, is there a way to get the csv files for the mapping at runtime in eclipse as well as in the compiled mod somehow without copying them manually? Or do I need to copy them for every minecraft version that has a new mapping?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.