Dotpeek 在反编译代码时遇到问题?
Posted
技术标签:
【中文标题】Dotpeek 在反编译代码时遇到问题?【英文标题】:Dotpeek having issue decompiling code? 【发布时间】:2018-09-23 12:17:42 【问题描述】:作为 Hackthebox.eu 的逆向工程挑战的一部分,我尝试反编译一个 .net 可执行文件。整个程序反编译成功,但有两个错误。我将在整个方法下方发布。
private unsafe void kapa(object sender, EventArgs e)
int num1 = 0;
this.z = "";
this.o = "";
this.m = "";
int num2;
IntPtr num3 = (IntPtr) &num2;
int num4;
int* numPtr1 = &num4;
int num5;
int* numPtr2 = &num5;
int num6;
int* numPtr3 = &num6;
int num7;
int* numPtr4 = &num7;
int num8;
int* numPtr5 = &num8;
int num9;
int* numPtr6 = &num9;
int* numPtr7 = &num1;
int num10 = 79;
*(int*) num3 = num10;
*numPtr1 = 128;
*numPtr2 = 128;
*numPtr3 = 105;
*numPtr4 = 112;
*numPtr5 = 112;
*numPtr6 = 129;
*numPtr7 = 130;
this.pp = num2;
this.linear(this.pp);
这一行有错误:
"'IntPtr' 是一个类型,在给定的上下文中是无效的"
IntPtr num3 = (IntPtr) &num2;
然后是未定义变量 num2 的错误。
这是 DotPeek 中的错误吗?
【问题讨论】:
“有错误” -> 什么错误?错误信息是什么?代码在第一次查看时看起来不错,num2
在前一行声明。
'IntPtr' 是一种类型,在给定的上下文中无效
这是因为该表达式被(尝试)编译为(IntPtr) & num2
,因此它尝试将其用作按位或逻辑&
运算符,而不是“取num2 的地址”。请注意,如果代码是使用 IL 编写的,则它可能根本无法反编译为 C#。 IL 可以表示的东西在 C# 中是不可能的。
为什么不用JetBrains提出来
代码也是仅 32 位的,DotPeek 可能无法接受,这可能是因为这看起来不是使用 C# 构建的。
【参考方案1】:
我今天刚刚完成了这个挑战。 dot Peek 没有任何问题,但您需要对代码进行一些细微的更改。
-
num2 被使用而不被分配:分配给 0 就对了
在 (IntPtr) 线上方
IntPtr 是在给定中无效的类型
上下文:您只需将代码修改为 (IntPtr)(&num2)。
这样编译器就知道您将 num2 的地址转换为
一个 IntPtr。
在 C++(非托管代码)中,指针基本上是指向内存地址的变量。在这个特定的代码中,它说 num3 是指向变量 num2 的地址的指针。希望这有助于解决问题。
【讨论】:
以上是关于Dotpeek 在反编译代码时遇到问题?的主要内容,如果未能解决你的问题,请参考以下文章
Protobuf-net r282 在反序列化使用 r249 序列化的对象时遇到问题