一个反汇编的例子

学习16位DOS汇编笔记 ax       //是16位的寄存器,最大可以存65535 ah,al  //是8位的寄存器,最大可以存255 cs:ip  //指向程序下一条执行的指令 ds     //数据段寄存器 ss     //栈段寄存器 sp     //栈顶指针 物理地址=段地址*16(十进制)+偏移地址 物理地址=段地址*10(十六进制)+偏移地址 物理地址20030 段地址2000 偏 阅读详情
这是一个反汇编的例子,反汇编的代码是使用Bochs 中的反汇编的代码,由于Bochs 反汇编模块做的比较独立,所以可以直接把反汇编模块包含到程序,不过为了使用这个反汇编的代码,需要自己写一小段对PE 进行简单解析的代码,下面是这个代码:

#include "stdafx.h"
#include "windows.h"
#include "disasm.h"

DWORD RVA2FileOffset(PIMAGE_SECTION_HEADER ntHead, int nSection , DWORD RVA);

int main(int argc, char* argv[])
{
    IMAGE_DOS_HEADER dos;
    IMAGE_NT_HEADERS  fileHeader ;
    DWORD cbRead ;
 //printf("Hello World!/n");
    if(argc != 2)
    {
        printf("Uage : %s PE file Name , ex : %s a.exe /r/n",argv[0],argv[0]);
        return 0;
    }
    disassembler obj;
    HANDLE hFile = CreateFile(argv[1],GENERIC_READ , FILE_SHARE_READ , NULL,OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL,  NULL);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        printf("can not open file : %s",argv[1]);
        return 0;
    }
    printf("Begin Reading File ... .../r/n");
    //read the file dos header
    ReadFile(hFile,&dos,sizeof(IMAGE_DOS_HEADER), &cbRead, NULL );
    SetFilePointer(hFile,dos.e_lfanew , NULL,  FILE_BEGIN);

    //read the file pe header
    ReadFile(hFile,&fileHeader, sizeof(IMAGE_NT_HEADERS), &cbRead, NULL );
    int nEntryAddress = fileHeader.OptionalHeader.AddressOfEntryPoint ;
    int nSectionNumber = fileHeader.FileHeader.NumberOfSections ;
    PIMAGE_SECTION_HEADER pSection = new IMAGE_SECTION_HEADER [nSectionNumber];
    
    ReadFile(hFile,pSection, sizeof(IMAGE_SECTION_HEADER ) * nSectionNumber, &cbRead, NULL);
    printf("The Address of Entry is : %.8x/r/n", nEntryAddress);
    printf("The Section number is : %d/r/n", nSectionNumber);

    int nEntryAddressOffFile = RVA2FileOffset(pSection, nSectionNumber, nEntryAddress);
    
    SetFilePointer(hFile,nEntryAddressOffFile,NULL,FILE_BEGIN);
    unsigned char szInBuf[1024];
    char szoutBuf[4096];
    ReadFile(hFile,szInBuf,1024,&cbRead,NULL);
    unsigned char *pStart = (unsigned char *)&szInBuf[0] ;
    int nTotalLen = 0;
    for(int i  = 0  ; nTotalLen < 1024  ; i ++)
    {
        int nLen =  obj.disasm(TRUE,
        fileHeader.OptionalHeader.ImageBase,
        nEntryAddress,
        pStart,
        ( char *)&szoutBuf[0]);
    pStart += nLen ;
    nTotalLen += nLen ;
    printf(szoutBuf );
    printf("/r/n");
    }


    
    CloseHandle(hFile);
 return 0;
}
DWORD RVA2FileOffset(PIMAGE_SECTION_HEADER ntHead, int nSection , DWORD RVA)
{
    PIMAGE_SECTION_HEADER pSection = (PIMAGE_SECTION_HEADER) ntHead ;
    int nTotalSection = nSection;
    for(int i = 0 ; i < nTotalSection ; i ++)
    {
        if ((pSection->VirtualAddress <= RVA)  && (pSection->VirtualAddress + pSection->Misc.VirtualSize >= RVA))
        {
            break;
        }
    }
    if(i >= nTotalSection ){
        return 0;
    }
    return pSection->PointerToRawData + RVA - pSection->VirtualAddress ;
}
看了上面的代码,你就会知道disassembler  这个类不是我自己写的,这个类就是来自Bochs 中的反汇编模块  。 这个模块的代码可以从Bochs 的源代码中获得。
反汇编工具objdump的使用以及反汇编文件的解读 什么是反汇编 为什么要反汇编 反汇编文件的生成和解读 阅读详情

相关推荐

反汇编一个c程序

方式一:使用gccgcc编译有四步走,预编译,编译,汇编,连接使用-S编译选项 gcc  -S  test.c会在当前目录下生成test.s的文件,该文件即是相应的汇编程序方式二:使用gdb首先编译时要是用-g编译选项 gcc -g ./test.c  -o ./test接着运行gdb gdb ./test--(可执行文件)在gdb中使用 disassemble + frame(帧),即可查看相应代码段的汇编代码frame通常为一个函数名。方式三:使用objdump命令为 objdump -d test.o

彦东 – yandong.org 5551

DOS汇编DEBUG基本命令及其功能详解

使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。(逐条执行,每条指令执行结果截图)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。 mov ax,1(从2000:0开始的内存单元) add ax,ax jmp 2000:0003PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。使用Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况

timerring的博客 3万+

gdb反汇编disassemble

GDB Command Reference - disassemble command gdb反汇编可用disassemble/disass命令。用法如下:disassemble disassemble [Function] 指定要反汇编的函数。如果指定,反汇编命令将产生整个函数的反汇编输出。 (gdb) disassemble main disassemble [Address] 指定要反汇编的地址。请注意,当仅指定一个地址时,此命令将反汇编包含给定地址的...

qq_28499879的博客 1万+

DEBUG 使用完全指南:DOS 下最强大的汇编调试工具(命令详解 + 实战案例)

在没有 GDB、IDA、Visual Studio 的年代,DEBUG.exe是每一位 DOS 程序员的“瑞士军刀”。反汇编、内存查看、寄存器修改、单步执行、程序读写一应俱全。即使在今天,学习DEBUG依然是理解x86 实模式编程、程序加载机制、机器码执行流程的最佳途径。本文将带你全面掌握 DEBUG 的所有命令、参数规则、地址格式、实战技巧,并结合真实案例,打造你的第一个汇编调试能力。类型命令口诀退出Q“Quit” 最简单寄存器R“Register” 查状态内存查看D“Dump” 看数据。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1510

Capstone反汇编引擎实战:从零搭建一个简易反汇编工具(附完整代码)

本文详细介绍了如何使用Capstone反汇编引擎从零构建一个简易反汇编工具。通过核心API解析、开发环境搭建和完整代码示例,帮助开发者快速掌握反汇编技术,适用于逆向工程和二进制分析领域。文章还提供了高级技巧与优化建议,提升工具性能和实用性。

nginx7reverse的博客 709

sourcer651 DOS_反汇编调试工具

sourcer651 DOS_反汇编工具,dos下的反汇编工具,在windows流行的今天作为调试C或者解密的有一定的作用

dosbox反汇编和devc++反汇编程序对比

写一个1+1=2的程序,用gcc编译成可执行的e.exe文件,然后用dosbox反汇编和devc++反汇编程序,对比如下: 我们发现:在执行main()函数的时候,cpu先将当前正在运行的指令的基址bp入栈,再将当前正在运行的指令的栈顶指针sp赋给bp,作为要执行的main()的基址, 这是加上了printf()打印函数的反汇编图: ...

远行的博客 2994

极空间NAS小白也能搞定的Gitea部署:Docker+MySQL避坑全记录

本文为极空间NAS用户提供了一份详尽的Gitea私有代码仓库部署指南。针对极空间ARM架构和图形化Docker管理的特殊性,文章重点讲解了如何通过Docker和MySQL容器进行部署,并提供了三种获取兼容镜像的实战策略,特别是利用第三方镜像站转录的方法,帮助小白用户成功搭建并初始化Gitea服务,实现私有Git托管。

weixin_28318011的博客 365

Dos系统的Debug工具简单使用(2023.9.7)

上面我首先展示了一下各个寄存器的值,我们可以看到,DS寄存器存的值是0740,DS寄存器存的是默认的段地址,不指定另外的段地址的时候默认的段地址,IP寄存器则是默认的偏移地址,然后我用a指令,吧ax,3f20写入内存,注意,存的时候是按字节低位在前。-g首先指定一个程序的开始地址,后面指定断点,如果不指定断点的话,会运行到程序结束。补充说明:在8086CPU有20根地址总线,所以物理地址是20位的,但是寄存器是16位的,所以物理地址是这样表示的,段地址:偏移地址,物理地址是段地址X16+偏移地址。

gfyy_bkj的博客 694

机器学习——Anaconda下载安装教程

Anaconda详细下载安装教程

2401_83693485的博客 3065

PyGPT:桌面AI助手整合大模型与本地知识库,打造高效工作流

大语言模型(LLM)通过理解和生成自然语言,正深刻改变人机交互方式。其核心原理是基于海量数据训练的Transformer架构,能够根据上下文进行预测和生成。这一技术价值在于将强大的AI能力平民化,广泛应用于代码生成、文档分析、创意写作和智能问答等场景。通过API调用云端模型或本地部署开源模型,开发者可以构建个性化的AI应用。本文聚焦于PyGPT这一桌面AI助手,它巧妙地将ChatGPT、Claude、Gemini等主流大模型与LlamaIndex、Ollama等本地化工具整合,实现了聊天、文件分析、代码解释

weixin_28679635的博客 436

一个ARM简单反汇编例子

下面是一个简单的函数调用ARM反汇编例子/*C语言源代码*/static int d = 13;char e = 1;char* fun(char a, int b){    char *p = "anhu";    *p = a;    *(p+3) = b;    return p;}int main(void){     char* f = fun(100,200);     *f=c

彪悍的人生不需要解释 9100

Win10更新后黑屏只剩鼠标?火绒误杀explorer.exe的5种自救方案(附详细步骤)

本文详细介绍了Win10更新后出现黑屏只剩鼠标的5种专业修复方案,重点解决火绒误杀explorer.exe的问题。从基础的任务管理器操作到安全模式下的系统修复,再到注册表编辑和系统还原,提供了全面的解决方案,帮助用户快速恢复系统正常运行。

weixin_29306571的博客 636

C语言代码反汇编例子,一个ARM简单反汇编例子

下面是一个简单的函数调用ARM反汇编例子/*C语言源代码*/static int d = 13;char e = 1;char* fun(char a, int b){char *p = "anhu";*p = a;*(p+3) = b;return p;}int main(void){char* f = fun(100,200);*f='c';return 0;}以下是上述C语言的ARM核心反汇...

weixin_39624097的博客 387

coze 怎么读取excel文件,使用循环,数据库完成LLM问答并存储

本文介绍了如何在Coze平台实现"Excel读取+循环处理+LLM问答+数据库存储"的工作流。主要分为三个步骤:1)使用代码节点解析Excel文件为问答对数组;2)通过循环节点遍历问答对,调用LLM节点生成回答;3)利用数据库节点将问答结果存储到Coze内置数据库中。文中提供了代码示例和节点配置说明,并强调了注意事项如Excel格式要求、LLM调用频率控制等。该工作流适用于批量构建知识库问答系统并持久化存储结果。

ZhangJiqun&191cm&85kg 1787

基于Matlab生成并可视化多架飞机轨迹仿真(附源码)

这使我们可以轻松地对直线和恒定转弯进行建模,并具有额外的自由度,可以在直线段和曲线段之间平滑过渡。同样,空气中的物体会经历重力的影响,遵循抛物线(二次)路径。需要更多的航点来适应这些变化,但是轨迹的其余部分需要更少的点。第三个轨迹,如下所示,代表了一架速度更高的飞机。它由两个恒定的转弯组成,飞机在第二个转弯的中间减速。一旦知道(并设置了)物体穿过空间的物理路径,物体的速度作为行进距离的函数就通过三次埃尔米特插值来确定。在此示例中,学习了内部使用的插值符背后的概念,并展示了如何使用少量航点重现场景。

珞瑜的博客 5464

一个源代码与反汇编代码对照的例子

如下的C++代码,对应的汇编代码会是什么样子呢?   #include int Addemup(int,int); void main(void) { int x = 5; int y = 10; int z = 0; z = Addemup(x,y); printf("z= %i\n",z); } int Addemu

happylife1527的专栏 1551

华为MetaERP的交易计税模块(即“税务引擎”)在设计上确实受到Oracle E-Business Tax(EBTax)等国际先进税务架构理念的影响,但结合了华为自身全球化运营、多准则合规、高并发处

华为MetaERP税务引擎在借鉴Oracle EBTax三层架构基础上,创新升级为五层智能税务架构,实现从"税码驱动"到"场景+规则+AI驱动"的转变。该模块采用云原生微服务架构,支持全球190+国家税务规则动态加载,具备实时计税、多准则并行处理、AI风险预警等核心能力,深度适配金税工程等国内合规要求。通过税务数字孪生、RPA机器人等创新,形成自主可控的智能税务中枢,为跨国企业提供全栈国产化税务解决方案,重新定义ERP税务管理范式。

金牌架构师 114

linux objdump 反汇编命令

objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。 参数选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如...

whatday的专栏 1万+

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 180

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汇编语言基础之五- 一个源代码与反汇编代码对照的例子

如下的C++代码,对应的汇编代码会是什么样子呢?   #include &lt;stdio.h&gt; int Addemup(int,int); void main(void) { int x = 5; int y = 10; int z = 0; z = Addemup(x,y); printf("z= %i\n",z); ...

weixin_34275734的博客 323

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

vs2010查看程序反汇编后的指令

在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息。如下图所示。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(...

weixin_33744141的博客 107

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cpp反汇编之继承之基类

先分析一个例子。 #include class CBase { public: CBase() { printf("CBase\n"); } ~CBase() { printf("~CBase\n"); } void SetNumber(int nInt) { this->m_nNumber = nInt; } int GetNumber() { retu

jinya 655

第十八章:语言工具-dis:Python字节码反汇编工具-类

18.3.3 类 可以把类传递到dis(),在这种情况下,会依序反汇编类的所有方法。 #!/usr/bin/env python3 # encoding: utf-8 import dis class MyObject: """Example for dis.""" CLASS_ATTRIBUTE = 'some value' def __str__(self):...

编程菜鸟iglesias的博客 291

ollydbg使用——反汇编入门

反汇编需要汇编语言的基础,感觉可以同时学, ollydbg快捷键: F2——下断点,也就是指定断点的地址; F3——加载一个可执行程序,进行调试分析; F4——程序执行到光标处; F5——缩小还原当前窗口; F7——单步步入; F8——单步步过;(Ctrl+F8可以自动步过并设置断点) F9——直接运行程序,遇到断点处,程序暂停; Ctrl+F2——重新运行程序到起始处,一般用于...

无 7481
上一篇: DRDoS软件的C源代码
下一篇: 29A杂志编译迷你Win32可执行文件
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值