Fix problems decrypting strings when there's a missing assembly

This commit is contained in:
de4dot 2012-01-18 18:39:59 +01:00
parent 04903f0f9b
commit d278c29fa2
3 changed files with 25 additions and 10 deletions

View File

@ -83,12 +83,21 @@ namespace AssemblyData {
public object[] decryptStrings(int stringDecrypterMethod, object[] args, int callerToken) {
checkStringDecrypter();
var caller = assembly.GetModules()[0].ResolveMethod(callerToken);
var caller = getCaller(callerToken);
foreach (var arg in args)
SimpleData.unpack((object[])arg);
return SimpleData.pack(stringDecrypter.decryptStrings(stringDecrypterMethod, args, caller));
}
MethodBase getCaller(int callerToken) {
try {
return assembly.GetModules()[0].ResolveMethod(callerToken);
}
catch {
return null;
}
}
public void exit() {
exitEvent.Set();
}

View File

@ -40,17 +40,21 @@ namespace AssemblyData.methodsrewriter {
}
void initTokenToType() {
var tmpTokenToType = new Dictionary<int, Type>();
var tmpTokenToTypeDefinition = new Dictionary<int, TypeDefinition>();
foreach (var t in module.GetTypes())
tmpTokenToType[t.MetadataToken] = t;
foreach (var t in moduleDefinition.GetTypes())
tmpTokenToTypeDefinition[t.MetadataToken.ToInt32()] = t;
moduleType = DotNetUtils.getModuleType(moduleDefinition);
foreach (var token in tmpTokenToType.Keys) {
var mtype = new MType(tmpTokenToType[token], tmpTokenToTypeDefinition[token]);
foreach (var typeDefinition in moduleDefinition.GetTypes()) {
int token = typeDefinition.MetadataToken.ToInt32();
Type type;
try {
type = module.ResolveType(token);
}
catch {
tokenToType[token] = null;
typeReferenceToType.add(typeDefinition, null);
continue;
}
var mtype = new MType(type, typeDefinition);
tokenToType[token] = mtype;
typeReferenceToType.add(mtype.typeDefinition, mtype);
typeReferenceToType.add(typeDefinition, mtype);
}
}

View File

@ -165,6 +165,8 @@ namespace AssemblyData.methodsrewriter {
}
public void setCaller(RewrittenMethod rewrittenMethod, MethodBase caller) {
if (caller == null)
return;
var newMethodInfo = getNewMethodInfo(rewrittenMethod.Method.Name);
newStackMethodDict[newMethodInfo] = caller;
}