在.NET中使用反汇编器的对象布局结构
我有兴趣看到对象布局结构,并试图在Visual Studio中使用拆卸. 以下是我的代码: class myclass { public int m_a; } myclass myc = new myclass(); myc.m_a = 23; //I am setting a breakpoint after this line 我打开了Memory1窗口,然后在地址字段中键入MYC.我在输出窗口(使用Intel编译器的使用Windows XP PC 32bit)中获取以下详细信息: 0x0148B7BC 1c 93 a7 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 看来,在对象数据的前面添加了一个其他指针00A7931C,该指针将对象大小增加4个字节.我的困惑是文档说,由于每个对象的标头,对象大小增加了8个字节.有人可以将我指向其他4个字节的位置吗? 解决方案 来自 对象的CLR内部结构
16 2024-04-21
编程技术问答社区
我可以调试一个Exe吗?
我需要比较我的应用程序和工作应用程序之间的几个函数调用和签名.在这里,我并不是说逆向工程师或访问其他应用程序的源代码的任何方法,而是真正需要知道工作应用程序使用的方法,接口. 我尝试将我的应用程序附加到Visual Studio,然后Start>Debug,但这并不能提供任何有用的信息.任何帮助. 解决方案 反射器pro can Visual Studio debug in Can只有您写的,但是任何其他组件;) 其他解决方案 您可以调试代码,但是一旦编译,它的机器语言和Visual Studio中的调试器根本不会做任何事情. 为了了解编译可执行文件正在做的事情,您可以使用这样的程序: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx 其他解决方案
4 2024-04-20
编程技术问答社区
ILDASM和ILASM,如何使用它们?
我很难使用Visual Studio命令提示(不要看起来那么简单),就像我看到在Microsoft Page中. 我正在使用这些方式: ildasm myLibrary.dll output:MyLibrary.il 我得到:无法打开" mylibrary.il"以进行输出. 我也尝试了完整的路径: ildasm directory\myLibrary.dll output:directory\MyLibrary.il 我得到:指定的多个输入文件 使用Ildasm Gui实际上有效,但是当我使用ilasm时: ilasm myLibrary.il /dll 我得到:无法打开'mylibrary.il',当我使用完整的路径时,我会遇到相同的错误. 这里怎么了? 解决方案 简单,让我们以这一代码行: using System; public class sample { static void Mai
10 2024-04-18
编程技术问答社区
从.NET DLL文件生成PDB?
我需要可以从dll文件(c#.net代码)生成PDB的东西,是否有任何免费程序? 解决方案 您需要源代码才能生成PDB. 其他解决方案 实际上,您也可以使用1.2版本的Dotpeek进行操作. 右键单击"汇编资源管理器"中的组件,然后选择"生成PDB".它还可以一次选择为引用的汇编生成文件. 其他解决方案 即使您没有来源,并且代码混淆,也可以通过iLdasm和ilasm重新编译来创建PDB: iLDASM 的反编译组件:iLDASM/out = assembly_name.il assembly_name.dll 用 ilasm :ilasm assembly_name.il/dll/pdb
26 2024-04-17
编程技术问答社区
解构视图中,C# 64位发布代码比32位调试代码长75%?
编辑 我在32位测试了释放,并且代码紧凑.因此,以下是一个64位问题. 我正在使用vs 2012 RC.调试是32位,发布为64位.以下是调试,然后发布一系列代码的拆卸: crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff]; 0000006f mov eax,dword ptr [ebp-40h] 00000072 shr eax,8 00000075 mov edx,dword ptr [ebp-3Ch] 00000078 mov ecx,0FF00h 0000007d and edx,ecx 0000007f shr edx,8 00000082 mov ecx,dword ptr [ebp-40h] 00000085 mov
12 2024-04-13
编程技术问答社区
在C#编译器中修改Emded的字符串
我有一个问题,我需要能够进行编译的EXE(.NET 3.5 C#),我将副本进行分发,以便在发送EXE之前需要更改键. 我每次都需要新的EXE时都无法编译.这是一个稀薄的客户,将用作注册过程的一部分. 是否可以将条目添加到带有空白值的资源文件中,然后当请求进入时,另一个应用程序抓住空白默认薄端客户端,将其复制,用所需的数据填充空白值. 如果是如何?如果没有,您有任何想法吗?我已经挠头了几天,这是由于我需要工作的界限所致. 我的另一个想法是将值注入一种方法,我不知道该如何尝试. 谢谢. 解决方案 将组件转换为IL,进行文本搜索并替换,将IL重新编译为组件.使用 .net sdk 的标准工具. 其他解决方案 而不是将密钥嵌入汇编中,而是将其放入app.config文件(或应用程序传递的另一个文件)中,并防止您的应用程序在不存在且有效的情况下运行.为了保护它免受用户的修改,还可以添加RSA签名. 此代码可用于生成包含密钥的XML. pu
4 2024-04-11
编程技术问答社区
Math.Pow(等等)的实际工作原理
所以我已经谷歌搜索了很长时间,但我几乎没有发现.我找到了一些有关Math.pow的可能实现的信息. " nofollow noreferrer">此url ,但是它们不准确,例如此代码 public static double PowerA(double a, double b) { int tmp = (int)(BitConverter.DoubleToInt64Bits(a) >> 32); int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447); return BitConverter.Int64BitsToDouble(((long)tmp2)
22 2024-04-10
编程技术问答社区
在Linux中是否有可能解散正在运行的进程?
要拆卸我正在使用objdump -d工具的程序.是否可以在没有条件的情况下使用exe文件的运行过程获得与objdump相同的输出?我该如何用其他程序中的语言C进行操作?我知道存在像GDB这样的调试者,但是我需要在C中使用该功能.由于程序的结果,我想获得具有拆卸功能的输出文件以进行运行.我有一个过程.我正在与Ubuntu合作. 解决方案 是否有可能在没有条件的情况下进行运行过程与OBJDUMP相同的输出? 是的,因为我有PID,并且我需要的文件位于/proc//exe 要在C中称呼它,我会尝试这样的东西: char *comp = "objdump -d /proc/1234/exe"; fflush(NULL); // always useful before system(3) int nok = system(comp); if (nok) { fprintf(stderr, "compilation %s failed wi
12 2024-04-10
编程技术问答社区
我在汇编中处理一个可能的数组,但我无法弄清启动值是什么。
大小包含数字86. var_10= dword ptr -10h var_C= dword ptr -0Ch size= dword ptr 8 push ebp mov ebp, esp sub esp, 28h mov eax, [ebp+size] mov [esp], eax ; size call _malloc mov ds:x, eax mov [ebp+var_C], 0 jmp short loc_804889E loc_804889E: ~~~~~~~~~~~~~~~~~~~~~ mov eax, [ebp+size] sub eax, 1 cmp eax, [ebp+var_C] jg short loc_8048887 loc_8048887: ~~~
16 2024-04-09
编程技术问答社区
gcc/mingw中的'启动文件'的源代码
im使用mingw32 在GCC中有一个选项 " -nostartfiles Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. " 如果我在我本身中不使用它几乎是空的C源,则我在1000-Lines中获得了包含此类功能的代码的灾难性长根 00401000 : 00401110 : 00401280 : 004012a0 : 004012c0 : 004012d0 : 004012e0
12 2024-04-09
编程技术问答社区
ndisasm手册中提到的二进制文件和可执行文件之间有什么区别?
我想用clang编译我的c文件,然后用ndisasm(出于教育目的)对其进行编译.但是,ndisasm在手册中说它仅与 binary 一起使用,而不是可执行文件文件: ndisasm only disassembles binary files: it has no understanding of the header information present in object or executable files. If you want to disassemble an object file, you should probably be using objdump(1). 到底有什么区别?当我使用简单的C文件,可执行文件或二进制文件运行时,clang输出是什么? 解决方案 对象文件包含机器语言代码,和其他各种信息.听起来像ndisasm只需要机器代码,而不是其他内容.因此,该消息告诉您使用objdump实用程
18 2024-04-09
编程技术问答社区
你如何解释这个拆卸清单?
我在C语言中具有简单的功能,在单独的文件字符串中: void var_init(){ char *hello = "Hello"; } 编译: gcc -ffreestanding -c string.c -o string.o 然后我使用命令 objdump -d string.o 查看拆卸清单.我得到的是: string.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 : 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b
12 2024-04-09
编程技术问答社区
GCC和Borland的反汇编C代码的差异?
最近,我对拆卸C代码(非常简单的C代码)感兴趣,并遵循了一个使用Borland C ++编译器v 5.5(恰好编译C代码)的教程,并且一切正常.然后,我决定尝试自己的C代码,然后在Dev C ++(使用GCC)中编译它们.在IDA Pro打开它后,我感到惊讶,与Borland的ASM相比,GCC的ASM确实不同.我期望有一些区别,但是C代码非常简单,因此GCC不会优化那么多,还是使用不同的默认编译器设置? ? C代码 int main(int argc, char **argv) { int a; a = 1; } Borland ASM .text:00401150 ; int __cdecl main(int argc,const char **argv,const char *envp) .text:00401150 _main proc near ; DATA XREF: .data:004090D0
6 2024-04-09
编程技术问答社区
为什么每次构建 +拆卸GDB中的功能时,我都会获得相同的地址?
每次我拆卸功能时,为什么我总是得到相同的说明地址和常数的地址? 例如,执行以下命令后, gcc -o hello hello.c -ggdb gdb hello (gdb) disassemble main 转储代码将是: 当我退出GDB并重新分配主要功能时,我将获得与以前相同的结果. GDB中每个拆卸命令的指令地址甚至常数的地址始终相同.这是为什么?编译的文件hello是否包含有关每个汇编指令地址以及常数地址的某些信息? 解决方案 如果您制作了一个独立于位置的可执行文件(例如,使用 gcc -fpie -pie,这是GCC在许多最近的Linux发行版中的默认值),内核将随机将其映射您可执行文件映射的地址随机. (除了在GDB下运行:共享库,适用于PIE的可执行文件.) 但是,您正在制作一个位置 - 依赖性可执行文件,它可以利用静态地址为链接时间常数(通过将其用作即时等等,而无需运行时重置修复程序).例如您或编译器可以使用mov $msg, %edi(
20 2024-04-08
编程技术问答社区
反汇编微软Visual Studio 2003的编译器输出
我认为Microsoft Visual Studio 2003工具输出的对象文件中我认为是奇怪的行为. file实用程序告诉我: asmfile.obj: 80386 COFF executable not stripped - version 30821 对于由汇编程序创建的对象,但对于来自C文件的对象,我只能得到: cfile.obj: data 使用Microsoft的dumpbin实用程序和objdump我从Cygwin获得的objdump我可以拆卸汇编构造的文件,但是我没有从任何一个实用程序中获得C构建文件的有用结果. 我有几个与此差异有关的问题: MSVC2003编译器生成的对象文件格式是什么? 如何拆卸该对象文件? 我对在AT&T语法中的拆卸特别感兴趣 - 我正在做一个庞大的源基础以使其与GCC一起使用,我想将此方法用作某些内线组件的快捷方式项目中的例程. 编辑:添加更多信息. 当我在其中一个文件上运行dumpbin时,我
10 2024-04-08
编程技术问答社区
printf@plt和puts@plt的区别
我一直通过拆卸一些C代码来学习汇编语言.当我用GDB拆卸此基本C代码时: #include void main(void) { printf("Hello World\n"); } 在汇编代码中,它给出了此行: 0x08048424 : call 0x80482e0 但是,当我在下面的代码下拆卸时,该代码中的整数在printf函数中: #include void main(void) { int a = 1; printf("Hello Word %d\n", a); } 它给出了这一行: 0x0804842e : call 0x80482e0 printf@plt和put@plt? 有什么区别 为什么如果没有整数参数,拆卸器不识别printf函数? 解决方案 在GCC printf和put
8 2024-04-08
编程技术问答社区
砸碎堆栈 example3.c的困惑
可以找到文章在这里. 我正在阅读粉碎堆栈的读书,发现自己在示例上被卡住了. 0x80004a3 : call 0x8000470 0x80004a8 : addl $0xc,%esp 0x80004ab : movl $0x1,0xfffffffc(%ebp) 0x80004b2 : movl 0xfffffffc(%ebp),%eax 作者指出我们要跳过0x80004a8到0x80004b2,并且此跳跃为8个字节;作者如何确定这是8个字节?我已经重新创建了代码并通过objdump发送了该代码,发现它不是8个字节(我在64位机器上,但我确保使用32位编译): 8048452: e8 b5 ff ff ff call 804840c 8048457: c7 44 24 1c 01
6 2024-04-08
编程技术问答社区
理解一个简单的C程序所产生的汇编代码
我试图通过使用GDB的拆卸器进行检查来了解简单C程序的汇编级别代码. 以下是C代码: #include void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { function(1,2,3); } 以下是main和function> 的拆卸代码 gdb) disass main Dump of assembler code for function main: 0x08048428 : push %ebp 0x08048429 : mov %esp,%ebp 0x0804842b : and $0xfffffff0,%esp 0x0804842e : sub $0x10,%esp 0x08048431
8 2024-04-08
编程技术问答社区
编译器。理解由小程序生成的汇编代码
我正在自我研究编译器的工作原理.我通过阅读 gcc 从小型64位Linux程序生成的代码的拆卸来学习. 我写了这篇 c 程序: #include int main() { for(int i=0;i: 4004d6: 55 push rbp 4004d7: 48 89 e5 mov rbp,rsp 4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0 4004e1: eb 0b jmp 4004ee 400
12 2024-04-08
编程技术问答社区
如何拆解一个被剥离的应用程序的主要功能?
假设我编译了下面的应用程序并剥离了它的符号. #include int main() { printf("Hello\n"); } 构建过程: gcc -o hello hello.c strip --strip-unneeded hello 如果未剥离应用程序,则拆卸主功能将很容易.但是,我不知道如何拆卸剥离应用程序的 main 功能. (gdb) disas main No symbol table is loaded. Use the "file" command. (gdb) info line main Function "main" not defined. 我该怎么做?甚至可能吗? 注释:必须仅使用GDB完成.忘记 objdump .假设我无法访问代码. 将不胜感激. 解决方案 好吧,这里是我以前答案的重要版本.我想我现在找到了一种方法. 您(仍然::)有一个具体问题: (gdb
24 2024-04-07
编程技术问答社区