使用反射器我得到以下输出:
.method private hidebysig static class myModelTestarea.Foo Method() cil managed
{
.maxstack 1
.locals init ([0] class myModelTestarea.Foo CS$1$0000)
L_0000: nop
L_0001: ldc.i4.0
L_0002: newarr object
L_0007: call object myModelTestarea.Program::Resolve(object[])
L_000c: castclass myModelTestarea.Foo
L_0011: stloc.0
L_0012: br.s L_0014
L_0014: ldloc.0
L_0015: ret
}
Run Code Online (Sandbox Code Playgroud)
对于
private static Foo Method()
{
return (Foo)Resolve();
}
private static object Resolve( params object[] args )
{
return new Foo();
}
Run Code Online (Sandbox Code Playgroud)
第11-14行是做什么的?我调用一个函数并得到一个结果(第7行).我将结果转换为正确的返回类型(第c行) - 为什么不立即返回?
不知何故,铸造的结果存储为局部变量 - 然后有一个无法跳转到下一行,再次加载局部变量.为什么?
在我看来,第11-14行和局部变量可以省略......?
我正在尝试编写一个exe包装器/保护器作为一种学习更多关于汇编程序,c ++以及PE文件如何工作的方法.我现在已经开始工作,所以包含EP的部分与一个密钥进行异或,并创建一个包含我的解密代码的新部分.一切都很好,除非我在解密后尝试JMP到原始EP.
基本上我这样做:
DWORD originalEntryPoint = optionalHeader->AddressOfEntryPoint;
// -- snip -- //
crypted.put(0xE9);
crypted.write((char*)&orginalEntryPoint, sizeof(DWORD));
Run Code Online (Sandbox Code Playgroud)
但是,它不是跳到入口点,而是显示此代码反汇编为:
00404030 .-E9 00100000 JMP 00405035 ; should be 00401000 =[
Run Code Online (Sandbox Code Playgroud)
当我尝试手动更改它时,新的操作码显示为
00404030 -E9 CBCFFFFF JMP crypted.00401000
Run Code Online (Sandbox Code Playgroud)
0xCBCFFFFF来自哪里?我如何从C++端生成它?
我正在为MIPS架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如"如果这个操作码是lui而下一个操作码是addiu然后返回var = value "或"如果这个操作码是bne,它指的是当前的地址 - 创建循环解析树中的定义".问题 - 有很多这样的规则,我找不到定义它们的好方法.我尝试为每个规则编写分离的函数,定义好的OOP基础逻辑类并扩展它们来创建规则,甚至尝试了令人沮丧的代码的正则表达式(令我惊讶的是这比预期更好)但无论我尝试过什么,我的代码很快变得很大,难以阅读,无论我试图记录和结构如何它.
这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于这样复杂的任务来说太愚蠢:)),但我不知道应该尝试什么.目前我有两个未经考虑的想法,一个是使用某种DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似二进制regexp的工具用于操作码匹配.
我希望有人可以指出我正确的方向,谢谢.
我知道我可以使用以下命令获取编译器生成的汇编源代码:
gcc -S ...
Run Code Online (Sandbox Code Playgroud)
即使这令人烦恼也没有给我一个目标文件作为过程的一部分.
但是,如何获得编译代码的所有内容?我的意思是地址,生成的字节等等.
输出的指令gcc -S不告诉我有关指令长度或编码的任何信息,这是我想要看到的.
在x86指令集中,索引1处的位可以是指定目标和源操作数的方向位,也可以是符号扩展位.我想知道最简单的逻辑方法是什么,以确定它是哪种情况.有没有办法检查除了检查指令操作码并比较它们以找出它是什么(对于指令的符号扩展或方向位变体)?还有一些指令忽略了这一位,但由于它被设置为0,因此它并不重要.
编辑:事实证明,对于写入错误(这是我的代码所针对的),reg-> r/m始终是这种情况,因为ar/m-> reg指令永远不会触发写入错误.但是,如果其他人遇到类似的问题,任何信息仍然会很好.
如果我的方法Multiply定义为:
public static class Experiment
{
public static int Multiply(int a, int b)
{
return a * b;
}
}
Run Code Online (Sandbox Code Playgroud)
那么为什么编译器会发出这个IL:
.method public hidebysig static int32 Multiply(int32 a, int32 b) cil managed
{
.maxstack 2 //why is it not 16?
.locals init (
[0] int32 CS$1$0000) //what is this?
L_0000: nop //why this?
L_0001: ldarg.0
L_0002: ldarg.1
L_0003: mul
L_0004: stloc.0 //why this?
L_0005: br.s L_0007 //why this?
L_0007: ldloc.0 //why this?
L_0008: ret
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它还包含一些对我没有意义的额外操作码,实际上我期望以下IL:
.method public …Run Code Online (Sandbox Code Playgroud) 在.net中可以作为方法的最后一条指令存在的可能的OpCode是什么.
目前我知道它可以
但它有可能成为任何其他操作码吗?如果是这样,什么代码(更喜欢c#)会产生它们?
"最后"我指的是"方法体中定义的最终OpCode"
我有一个程序加载在内存中.现在我想直接访问内存并更改该程序内存中的OPCODE和DATA.为此,我需要编写一个Java程序.
你能告诉我这是否可行?如果是,请告诉我如何编写这样的程序.
提前致谢!
我有以下代码(在生成列表文件后,为intel 80x86编写):
1 global _start
2
3 section .data
4 00000000 03000000 x: dd 3
5
6 ;section .text
7
8 _start:
9 00000004 8B0D[00000000] mov ecx, [x]
10 0000000A 000D[16000000] r: add byte [l+6], cl
11 00000010 C605[00000000]30 l: mov byte [x], 48
12 00000017 51 push ecx
13 00000018 B804000000 mov eax, 4 ; For "Write" system call
14 0000001D BB01000000 mov ebx, 1 ; to standard output
15 00000022 B9[00000000] mov ecx, x ; "buffer"
16 00000027 …Run Code Online (Sandbox Code Playgroud) 这个问题是关于自定义C#IL代码的静态堆栈分析以及如何设计操作码来满足编译器.
我有代码通过附加我自己的代码来修改现有的C#方法.为了避免原始方法在执行代码之前返回,它将所有RET操作码替换为BR endlabel,并将该标签添加到原始代码的末尾.然后我在那里添加更多代码,最后是RET.
这一切都很好,但某些方法失败了.这是一个简单的例子:
public static string SomeMethod(int val)
{
switch (val)
{
case 0:
return "string1".convert();
case 1:
return "string2".convert();
case 2:
return "string3".convert();
// ...
}
return "";
}
Run Code Online (Sandbox Code Playgroud)
这个IL代码表示:
.method public hidebysig static string SomeMethod(int32 val) cil managed
{
.maxstack 1
.locals val ([0] int32 num)
L_0000: ldarg.0
L_0001: stloc.0
L_0002: ldloc.0
L_0003: switch (L_002e, L_004f, L_0044, ...)
L_002c: br.s L_0091
L_002e: ldstr "string1"
L_0033: call string Foo::convert(string)
L_0038: ret
L_0039: ldstr "string2" …Run Code Online (Sandbox Code Playgroud) opcode ×10
assembly ×4
c# ×4
cil ×3
x86 ×3
il ×2
.net ×1
control-flow ×1
decompiling ×1
disassembly ×1
executable ×1
gcc ×1
java ×1
machine-code ×1
masm ×1
memory ×1
mips ×1
reflector ×1
x86-64 ×1