我可以使用Mono.Cecil和ICSharpCode.Decompiler来生成类型或程序集的代码.
但是,如果我尝试为单个方法生成代码,我将收到错误"对象引用未设置为对象的实例".
你们能给我任何关于此的提示吗?感谢所有的帮助.
用于为程序集内的所有类型生成代码的代码:
DirectoryInfo di = new DirectoryInfo(appPath);
FileInfo[] allAssemblies = di.GetFiles("*.dll");
foreach (var assemblyFile in allAssemblies)
{
string pathToAssembly = assemblyFile.FullName;
System.Reflection.Assembly assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(pathToAssembly);
Mono.Cecil.AssemblyDefinition assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(pathToAssembly,parameters);
AstBuilder astBuilder = null;
foreach (var typeInAssembly in assemblyDefinition.MainModule.Types)
{
if (typeInAssembly.IsPublic)
{
Console.WriteLine("T:{0}", typeInAssembly.Name);
//just reset the builder to include only code for a single type
astBuilder = new AstBuilder(new ICSharpCode.Decompiler.DecompilerContext(assemblyDefinition.MainModule));
astBuilder.AddType(typeInAssembly);
StringWriter output = new StringWriter();
astBuilder.GenerateCode(new PlainTextOutput(output));
string result = output.ToString();
output.Dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)
用于为程序集内的所有公共方法生成代码的代码: …
当使用像DotPeek这样的东西来反编译DLL时,如何判断它最初是用VB.Net还是C#编码的?
我认为没有简单的方法可以告诉你,但是在某些反编译代码中可能会有告诉标记(即线索)?
我正在尝试使用 Storyyeller/Krakatau 反编译器反编译文件。我已经下载了相关文件并将其放在一个文件夹中。我尝试使用命令提示符使用以下语法反编译文件。
===反编译===
用法:
python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target
Run Code Online (Sandbox Code Playgroud)
PATH:用于在其中搜索类的目录、jar 或 zip 文件的可选列表。Krakatau 将尝试自动检测并添加包含核心语言类的 jar,但您可以使用该选项禁用此功能-nauto。对于多个 jar,您可以传递以分号分隔的 jar 列表,也可以-path多次传递该选项。
OUT:要写入源文件的目录名称。默认为当前目录。如果名称以 .zip 或 .jar 结尾,则输出将是 zip 文件。
-r:反编译在目录目标中找到的所有.class文件(递归地)
-skip:出现错误时继续。如果在反编译特定方法时发生错误,则回溯将作为注释打印在源文件中。如果在类级别反编译时发生错误,则不会发出源文件,并且会将错误消息打印到控制台。
target:要反编译的类名或jar名。如果指定了jar,则该jar中的所有类都将被反编译。如果-r指定,这应该是一个目录。
但我总是遇到错误。我不明白上面的语法。
请解释一下这个语法
python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target
Run Code Online (Sandbox Code Playgroud)
使用一个简单的例子。
在以下使用 Ida pro 的 Hex 射线的反编译函数中:
int sub_409650()
{
int v0; // ecx@1
int result; // eax@1
bool v2; // zf@1
bool v3; // sf@1
unsigned __int8 v4; // of@1
unsigned __int16 v5; // cx@2
unsigned int v6; // ecx@2
v0 = gS1_dword_62EEA8 & 7;
result = gS1_dword_62EEA8 - v0;
v4 = __OFSUB__(gS1_dword_62EEA8 - v0, 16);
v2 = gS1_dword_62EEA8 - v0 == 16;
v3 = gS1_dword_62EEA8 - v0 - 16 < 0;
gS1_dword_62EEA8 -= v0;
gs2_dword_62EFB4 >>= v0;
if ( …Run Code Online (Sandbox Code Playgroud) 我开发了一个Android AAR库,其中包含客户所需的所有功能,我想在将其交付给客户之前在库上应用proguard,以便混淆代码,使代码不容易反编译。
在发布这个问题之前我用谷歌搜索了它,我发现库项目本身不运行 ProGuard,因此它们不使用任何配置,如此处提到的单击此处
我已经完成了以下配置,以便在我的库项目上应用 proguard。
buildTypes {
debug {
shrinkResources false
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
我已应用此规则proguard-rules.pro
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements …Run Code Online (Sandbox Code Playgroud) 我试图将apk转换为源代码。当我输入以下命令时
./d2j-dex2jar.sh classes.dex
Run Code Online (Sandbox Code Playgroud)
我有这个例外:
com.googlecode.d2j.DexException: not support version.
at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:151)
at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:211)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:104)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)
Run Code Online (Sandbox Code Playgroud)
我的apk版本是Oreo,而dexcompiler是dex2jar-2.0。据我所知,此dexcompiler最多支持N版本(如果我输入错了,请更正我)。我已经搜索了此异常,但是没有找到任何答案。
请帮助我解决此异常
我从官方网站(hex-rays)IDA 下载,安装,一切正常。我发现需要我的功能,按 F5(反编译热键,所以我会看到 C 伪代码),并得到弹出消息:
ida 抱歉你在 Windows 上没有任何反编译器
无法理解出了什么问题,我发现在谷歌中没有关于此类消息的信息......
这是消息的屏幕: 在此处输入图像描述
我使用 JD-GUI 反编译了一个 Java 项目,当我看到所有标识符都使用 Java 保留关键字,例如 int do throw extends 等时,我感到很惊讶。
这是该项目的一个片段:
public class try extends Thread {
private int do;
private JSONArray if;
private int for;
private String int;
private String new;
}
Run Code Online (Sandbox Code Playgroud)
我在另一篇关于使用 UTF-16 编码时的文章中读到,有些字符可能看起来相同,但实际上不同,所以我使用 Notepad++ 切换了编码,但这对显示没有影响。
我也尝试使用 Github 中的一些去混淆器,但没有成功。
我知道它并没有真正使用保留关键字,但我无法弄清楚,所以这里的技巧是什么?
编辑:
这是项目中最小的类:
package tech.iresponse.break;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;
public class do {
public static void do(Throwable paramThrowable) {
Logger.getLogger("rootLogger").error(ExceptionUtils.getFullStackTrace(paramThrowable));
}
}
/* Location: C:\Users\User\Desktop\app.jar!\tech\iresponse\break\do.class
* Java compiler version: 8 (52.0)
* JD-Core Version: 1.1.3
*/
Run Code Online (Sandbox Code Playgroud)
这是十六进制转储: …
decompiler ×10
java ×4
android ×2
apk ×2
c# ×2
dex ×2
ida ×2
.net ×1
aar ×1
c ×1
decompiling ×1
icsharpcode ×1
identifier ×1
keyword ×1
mono.cecil ×1
proguard ×1
python-2.7 ×1
reflection ×1
reserved ×1
vb.net ×1