Disasm 示例程序改写和适配

Disasm 示例程序改写和适配

简介

用途

可用于反汇编x86的二进制汇编文件,展示出来内部的反汇编原理和流程。

原由

最近在看<<C++ 反汇编与逆向分析技术揭秘>>这本书籍,在第一张的简介中我们可以看到ProViem这个反汇编开源工具的内容,内部介绍了反汇编的基本原理,我们可以看到详细的开源代码。但是从网址下载后的代码无法直接使用VS2019或者是GNUC工具进行编译构建。主要原因是如下所示:

无法直接构建运行的原因:

  • 汇编函数需要用C改写

    • 代码中存在__asm关键字,该关键字只能在VS2013前的编译器上编译和识别
    • gnuc的gcc/g++是支持asm内建汇编编译的,但是和__asm{}的形式不兼容,需要改写代码。
    • 因此为了兼容性,最好是用汇编代码去取代汇编代码部分
  • 主函数逻辑存在问题,需要改写

  • 本书的随书文件下载网址

改写和适配工具

使用的编译工具

  • cmake
  • cygwin64(也可用mingw64代替)
    • make
    • gcc
    • g++
  • windows平台

汇编代码改写

公用函数和宏定义
#ifdef __GNUC__
// #define _asm __asm__ __volatile__()
#define uint16 unsigned short
#define uint32 unsigned int
#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8))
#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8) | \(((uint32)(A) & 0x0000ff00) << 8) | (((uint32)(A) & 0x000000ff) << 24))#define LittletoBig16(A) BigtoLittle16(A)
#define LittletoBig32(A) BigtoLittle32(A)
#endif
SwapDword函数
  • 作用:从汇编代码来看,就是进行双字在小端/大端序之间的转换
void SwapDword(BYTE *MemPtr,DWORD *Original,DWORD *Mirrored)
{DWORD   OriginalDword;DWORD   MirroredDword;
#ifdef __GNUC__MirroredDword = *((DWORD*)MemPtr);OriginalDword = LittletoBig32(MirroredDword);
#else_asm{pushadmov edi,MemPtr         mov eax,dword ptr[edi] // 从MemPtr处获取4个字节,小端存储mov MirroredDword,eax  // 15141312bswap eax              // 镜像bytesmov OriginalDword,eax  // 12131415 popad}
#endif*Original = OriginalDword;*Mirrored = MirroredDword;return;
}
SwapWord函数
  • 作用:从汇编代码来看,就是进行字在小端/大端序之间的转换
void SwapWord(BYTE *MemPtr,WORD *Original,WORD *Mirrored)
{WORD    OriginalWord;WORD    MirroredWord;
#ifdef __GNUC__MirroredWord = *((WORD*)MemPtr);OriginalWord = LittletoBig16(MirroredWord);
#else_asm{pushadxor eax,eaxmov edi,MemPtrmov ax,word ptr[edi]mov MirroredWord,ax  // 1312bswap eaxshr eax,16mov OriginalWord,ax  // 1213 popad}
#endif*Original = OriginalWord;*Mirrored = MirroredWord;
}
StringToWord函数
  • 作用:从汇编代码来看,就是把ascii形式的16进制的hex字符串变成单字的hex二进制数字
WORD StringToWord(char *Text)
{/*this function will convert and returnan Hexadecimel String into a realWORD hex number using assembly directive.*/
#ifndef __GNUC__DWORD   AsmDwordNum = (DWORD) Text;
#endifWORD    DwordNum    = 0;
#ifdef __GNUC__DWORD edi = 4;for (DWORD i = 0; i < edi; i++){char one = Text[i];char number = 0;if (one >= 0x30){if ( one <= 0x39){// 0~9number = one - 0x30;}else{number = one - 0x37;}}else{number = one;}DwordNum += number;if (i < edi - 1){DwordNum = (DwordNum << 4);}}
#else_asm{PUSHADPUSHFXOR ECX,ECXXOR EAX,EAXXOR EDI,EDIMOV EDI,4HMOV ESI,AsmDwordNum_start:MOV CL,[ESI]CMP CL,30HJL _lowerCMP CL,39HJG _upperSUB CL,30HJMP _jmp1_upper:SUB CL,37HJMP _jmp1_lower:_jmp1:ADD EAX,ECXCMP EDI,1JZ _outSHL EAX,4H_out:INC ESIDEC EDIJNZ _startMOV DwordNum,AXPOPFPOPAD}
#endifreturn DwordNum;
}
StringToDword函数
  • 作用:从汇编代码来看,就是把ascii形式的16进制的hex字符串变成双字的hex二进制数字

  • 代码同StringToWord函数差不多,唯一区别就是"DWORD edi = 8;"

main函数
// Disasm_Push.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <string.h>
#include "Decode2Asm.h"int main()
{// 假设此字符数组为机器指令编码unsigned char szAsmData[] = {0x6A, 0x00,					// PUSH 000x68,0x00,0x30,0x40,0x00,	// PUSH 004030000x50,						// PUSH EAX0x51,						// PUSH ECX0x52,						// PUSH EDX0x53						// PUSH EBX};char szCode[256] = {0};			// 存放汇编指令信息unsigned int nIndex = 0;		// 每条机器指令长度,用于地址偏移unsigned int nLen = 0;			// 分析数据总长度unsigned char *pCode = szAsmData;		nLen = sizeof(szAsmData);while (nLen){	if (nLen <= (unsigned int)(pCode - szAsmData)) // 跳出逻辑修改,之前会死循环{break;}int nAddr = 0 ;// 解析机器码Decode2Asm(pCode, szCode, &nIndex, 0);// 修改pCode偏移pCode +=  nIndex; // 跳出逻辑修改,之前会死循环// 显示汇编指令puts(szCode);memset(szCode, 0, sizeof(szCode));}return 0;}

适配cmake和编译工程

cmakelist.txt编写

cmake_minimum_required(VERSION 3.4.1)
project("disasm_exe")set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(MY_BIN_FILE_NAE "disasm_exe")
set(SRC "${CMAKE_SOURCE_DIR}/source")string(REPLACE "-Os" "-O3" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -g") #-Wnon-virtual-dtor 检查虚析构函数set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lm -Wextra -flto -fuse-ld=gold")include_directories(${CMAKE_SOURCE_DIR}/include)include_directories(${SRC})aux_source_directory(${SRC} SRC_LIST)ADD_EXECUTABLE(${MY_BIN_FILE_NAE}${SRC_LIST})target_link_libraries(${MY_BIN_FILE_NAE}${dl-lib})
windows上使用cmake调用gcc/g++工具编译
rd /s /q build
mkdir build
cd build
cmake .. -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=D:/Program/cygwin64/bin/g++.exe -D CMAKE_C_COMPILER=D:/Program/cygwin64/bin/gcc.exe -D CMAKE_MAKE_PROGRAM=D:/Program/cygwin64/bin/make.exe
make -j32

整个工程下载

  • 具体可见下载地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线收发器芯片Si24R1 兼容替代NRF24L01

Si24R1是一款工作在2.4-2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、集成嵌入式ARQ基带协议引擎、功率放大器、晶体振荡器调制器、解调器。输出功率频道选择和协议的设置可以通过SPI接口进行设置。是目前2.4G无线射频芯片中&#xff0c…

Java 文件处理工具类详解

在软件开发中,文件处理是一个常见的任务,我们经常需要读取、写入和管理文件。为了更便捷地处理文件相关操作,我们编写了一个 FileUtils 工具类,提供了一些有用的文件处理方法。 工具类介绍 FileUtils 工具类包含了一些常用的文件处理方法,主要功能如下: 获取统一的文件…

Git本地库操作

对本地库的操作很少&#xff0c;我们学习1~6节即可&#xff0c;其他了解下。我们可以在idea中完成对本地库还有远程库的操作&#xff0c;可视化界面用起来更加舒适而且也不会混淆。 1. Git概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小…

[个人笔记] Windows配置OpenSSH免密连接

Windows - 运维篇 第七章 Windows配置OpenSSH免密连接 Windows - 运维篇系列文章回顾Windows配置OpenSSH免密连接参考来源 系列文章回顾 第一章 迁移WinSrv系统到虚拟机 第二章 本地安全策略xcopy实现实时备份文件夹内容 第三章 利用cmd自带的icacls命令导出文件的ACL权限 第四…

JavaScript启动本地应用程序

JavaScript调起本地应用程序 以下内容&#xff0c;自定义部分我也还未经过实际验证&#xff0c;酌情查看。 文章目录 JavaScript调起本地应用程序确定协议调用协议传参自定义写入协议获取参数 在浏览器中通过 JavaScript调起本地应用程序的一个可行方法就是 通过协议调起。 …

git 文件被莫名其妙的或略且无论如何都查不到哪个.gitignore文件忽略的

先说解决办法&#xff1a;git check-ignore -v [文件路径] 这个命令会返回一个忽略规则&#xff0c;以及该规则在哪个文件中定义的&#xff0c;该规则使得指定的文件被忽略。 1.遇到的问题 同项目组&#xff0c;其他同学都可以正常的提交.meta文件&#xff0c;我的提交就出现以…

Oracle通过MyBatis执行批量插入与更新问题

最近看一个老项目&#xff0c;使用的Oracle数据库&#xff0c;发现要使用MyBatis执行批量操作还是不太一样。 下面我们来看一下&#xff0c;Oracle数据库&#xff0c;如何使用MyBatis来批量插入和更新。 批量插入 因为Oracle和MySQL的insert还不太一样&#xff0c;Oracle不能…

canal本地安装和使用

1、组件版本 canal.deployer-1.1.7 kafka_2.13-2.6.0 jdk8 apache-zookeeper-3.6.0-bin mysql5.7 2、解压canal.deployer-1.1.7 2.1、修改canal.properties配置文件 ##改为kafka canal.serverModekafka## 改为instance canal.destinations instance## 改为true&#x…

STM32——独立看门狗

文章目录 一、看门狗基础介绍&#xff08;一&#xff09;看门狗概述&#xff1a;&#xff08;二&#xff09;看门狗的作用&#xff1a;&#xff08;三&#xff09;看门狗的原理&#xff1a;&#xff08;四&#xff09;为什么需要使用看门狗来提高系统的可靠性&#xff1a;&…

Linux 中的 rm 命令及示例

Linux 中的 rm 命令及示例 rm命令是Linux中最常见、最基础的命令之一。即使您对 Linux 的使用经验有限&#xff0c;您也很可能听说过它。该命令的主要目的是删除文件和目录。使用此命令删除文件和目录无法撤消。 这意味着您应该谨慎使用此命令&#xff0c;因为如果没有备份&am…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(5)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关 于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护…

Colmap三维重建详解与使用方法

图片捕获过程&#xff0c;请遵循以下指导方针以获得最佳重建结果: 1 捕捉具有良好纹理的图像。避免使用完全没有质感的图片(例如&#xff0c;白色的墙或空桌子)。如果场景本身没有足够的纹理&#xff0c;你可以放置额外的背景对象&#xff0c;如海报等。 2 在相似的照明条件下…

@Value和@Scheduled注解简介

&#xff08;1&#xff09;SpringBoot读取配置文件&#xff0c;使用Value注解获取数据&#xff0c;中文乱码问题解决办法 new String(xxx.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) &#xff08;2&#xff09;Scheduled注解 例如&#xff0c;Scheduled(…

前端处理返回数据为数组对象且对象嵌套数组并重名的数据,合并名称并叠加数据

前端处理返回数据为数组对象且对象嵌套数组并重名的数据&#xff0c;合并名称并叠加数据 var newList[]; var table{}; var dataObj{}; var finalList[]; var tableData[{brName:营业部,dateStr:2023-11-23,tacheArr:[{dealCnt:20,tacheName:奔驰}]},{brName:营业部,dateStr:2…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题&#xff0c;定义let that this 解决

大宽带服务器有什么优势?

大宽带服务器有什么优势&#xff1f; 什么是大带宽服务器&#xff1f;从属性上看&#xff0c;大宽带可以分为G口大带宽、万兆大带宽等&#xff0c;从线路上看&#xff0c;可以分为电信、移动、联通等&#xff0c;从地域属性看&#xff0c;可以分为国内宽带、国际宽带。大宽带是…

如何活跃谷歌开发者账号,增加账号的权重和真实性,从而延长应用在线时长?

众所周知&#xff0c;每个谷歌开发者账号都有一个初始权重&#xff0c;而权重的高低会影响到账号的稳定性和真实性&#xff0c;从而影响应用上架的成功率和应用在线时长。 关于提高谷歌账号权重、活跃度及稳定性&#xff0c;以下的方法和建议可供参考&#xff1a; 1、社区活动…

外设——CAN总线收发器TJA1043

目录 1. 引脚 2. 工作模式 3. 5种模式和7种状态标识的理解和使用 1. 引脚 2. 工作模式 该收发器相较于普通收发器&#xff0c;引脚多了几个&#xff0c;就是功能等多了。TJA1043支持五种操作模式&#xff0c;就是通过控制引脚STB_N和EN来原则。五种模式&#xff1a; 正常模式…

OpenCV滑块验证码图像缺口位置识别

OpenCV图像缺口位置识别 1、背景2、图像缺口位置识别原理3、图像缺口位置识别实现4、滑块验证码HTTP图像需要保存到本地吗1、背景 在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…