Disasm 示例程序改写和适配

IDA 9.x插件开发避坑指南:如何快速适配inf_structure和BWN_* API变更 本文详细解析了IDA 9.x版本中IDAPython API的重大变更,特别是inf_structure和BWN_* API的适配方法。通过对比新旧API使用方式,提供实用的代码示例和迁移策略,帮助开发者快速解决插件兼容性问题,确保在逆向工程中的高效开发。 阅读详情

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
    {
        pushad
        mov edi,MemPtr         
        mov eax,dword ptr[edi] // 从MemPtr处获取4个字节,小端存储
        mov MirroredDword,eax  // 15141312
        bswap eax              // 镜像bytes
        mov 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
    {
        pushad
        xor eax,eax
        mov edi,MemPtr
        mov ax,word ptr[edi]
        mov MirroredWord,ax  // 1312
        bswap eax
        shr eax,16
        mov OriginalWord,ax  // 1213 
        popad
    }
#endif

    *Original = OriginalWord;
    *Mirrored = MirroredWord;
}
StringToWord函数
  • 作用:从汇编代码来看,就是把ascii形式的16进制的hex字符串变成单字的hex二进制数字
WORD StringToWord(char *Text)
{
    /*
    this function will convert and return
    an Hexadecimel String into a real
    WORD hex number using assembly directive.
       */
#ifndef __GNUC__
    DWORD   AsmDwordNum = (DWORD) Text;
#endif
    WORD    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~9
                number = one - 0x30;
            }else{
                number = one - 0x37;
            }
        }else{
            number = one;
        }
        DwordNum += number;
        if (i < edi - 1){
            DwordNum = (DwordNum << 4);
        }
    }
#else
    _asm
    {
        PUSHAD
        PUSHF
        XOR ECX,ECX
        XOR EAX,EAX
        XOR EDI,EDI
        MOV EDI,4H
        MOV ESI,AsmDwordNum
        _start:
        MOV CL,[ESI]
        CMP CL,30H
        JL _lower
        CMP CL,39H
        JG _upper
        SUB CL,30H
        JMP _jmp1
        _upper:
        SUB CL,37H
        JMP _jmp1
        _lower:
        _jmp1:
        ADD EAX,ECX
        CMP EDI,1
        JZ _out
        SHL EAX,4H
        _out:
        INC ESI
        DEC EDI
        JNZ _start
        MOV DwordNum,AX
        POPF
        POPAD
    }
#endif
    return 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 00
		0x68,0x00,0x30,0x40,0x00,	// PUSH 00403000
		0x50,						// PUSH EAX
		0x51,						// PUSH ECX
		0x52,						// PUSH EDX
		0x53						// 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

整个工程下载

IDAPython插件升级实战:从IDA 8.x到9.x的API适配与最佳实践 本文详细解析了IDAPython插件从IDA 8.x迁移至9.x版本的核心挑战与实战解决方案。针对API模块化重构,重点阐述了数据库信息访问(inf_structure)与窗口类型判断(BWN_*)两大关键变更的适配方法,提供了清晰的API对照表、代码示例及系统化的迁移策略,帮助开发者高效完成插件升级。 阅读详情

相关推荐

反汇编引擎Disasm:实用教程及示例分享

本文还有配套的精品资源,点击获取 简介:反汇编是逆向工程的一个关键步骤,它帮助开发者深入理解二进制代码,对于软件调试、病毒分析和系统优化等领域至关重要。本文档提供了一个反汇编引擎Disasm的使用教程,包括示例代码和相关文件,以供学习和实践。Disasm引擎能够将机器语言代码转换成易于理解的汇编语言。通过阅读示例代码和文件,用户可以学习如何操作Disasm引擎进行反汇编,并...

weixin_29781865的博客 2098

OD Disasm.dll 实现反汇编器和汇编器

在网络上找了好久的 反汇编器和汇编器,终于在 http://www.ollydbg.de/ 发现了原代码, 但它又上Borland C++编译的, 不爽啊, 又下了一下Borland C++,兄弟俺又没有用过BC 没法子,网络上找. 好不容易编译了一个Dll出来, 测试OK! 以下给出测试代码: 1.一个.h文件 2.测试代码 3.disasm.dl...

weixin_33804582的博客 647

C++反汇编与逆向分析实战:Disasm-Push工具详解

Disasm-Push 的设计初衷是为安全研究人员和逆向工程师提供一个高效、灵活、可扩展的二进制解析工具。其核心功能包括:支持 x86/x86_64 架构下的 PE 与 ELF 文件解析;提供反汇编引擎,支持多种输出格式(如 Intel 和 AT&T 汇编风格);支持插件扩展机制,便于集成 IDA Pro、Ghidra 等第三方分析工具;提供命令行接口与配置文件管理,便于自动化脚本调用;支持符号提取、重定位分析、节区解析等关键逆向分析功能。

weixin_29009401的博客 1933

XenonRecomp第三方库依赖解析:TinySHA1、SIMD Everywhere等库的核心作用

在Xbox 360游戏重编译领域,**XenonRecomp**作为一个强大的工具,能够将Xbox 360可执行文件转换为C++代码,然后重新编译到任何平台。这个项目的成功很大程度上依赖于其精心选择的第三方库生态系统。本文将深入解析这些关键依赖库的作用和重要性。 ## 🔍 第三方库概览 XenonRecomp项目集成了多个高质量的第三方库,每个库都承担着特定的关键功能: | 库名称 | 主

gitblog_00411的博客 1060

disasm:Oleh Yuschuk(Olly,OllyDbg 的创建者)用 C 语言编写的反汇编程序,我修复了 makefile 以使用 Embarcadero 提供的 BCC55 免费命令行工具运行

解散 来自 Oleh Yuschuk(Olly,OllyDbg 的创建者)的 disasm,修复为使用 Embarcadero 提供的 BCC55 免费命令行工具运行。

disasm_反汇编——逆向

转,自己写的反汇编引擎——intel编码学习报告

为什么选择wagon?Go开发者必知的WebAssembly解释器优势

wagon是一款基于WebAssembly的Go解释器,专为Go开发者设计。它提供了构建Go代码解释器的核心组件,可轻松嵌入Jupyter或任何Go程序中,为开发者带来前所未有的灵活性与便利性。 ## 🚀 专为Go生态打造的WebAssembly解释器 wagon作为用Go语言实现的WebAssembly解释器,深度融合了Go生态系统的优势。开发者可以直接使用熟悉的Go语言工具链和库,无需学

gitblog_00097的博客 323

命令行工具disasm反汇编由命令行参数给出的起始地址和字节序列内容

命令行工具disasm反汇编由命令行参数给出的起始地址和字节序列内容。

解决Binwalk兼容性痛点:Capstone库适配指南

你是否在使用Binwalk分析固件时遇到过"Capstone disassembly failed"错误?是否因依赖库版本问题导致反汇编功能异常?本文将从兼容性问题根源出发,提供3种实用解决方案,帮助你快速恢复固件分析工作流。 ## 问题现象与影响范围 在执行固件反汇编任务时,Binwalk可能出现以下兼容性问题表现: - 命令行报错"capstone::Error: Invalid mode"...

gitblog_00707的博客 467

单片机反汇编软件汇总

以上软件为网上收集来的反汇编专用软件 PIC16FDisAsm.exe 为pic16fxxx单片机反汇编软件 u51V12.rar为mcs51单片机反汇编软件 EMCdasm.exe为emc单片机反汇编软件 reavr.rar为AVR单片机反汇编软件 STM8反汇编.rar为stm8单片机反汇编软件 HT单片机反汇编.rar为合泰单片机反汇编软件 能成功反汇编以下单片机,并有成功案例: PIC、51、AVR、EMC ST7 NEC HT SONIX MSP430 MDT PIC18F MOTOROLA DSP INTEL STM32 STM8 z80等

cortex M3反汇编

CORTEX M3 disassembler 反汇编 工具 DESCRIPTION mdisasm is basic disassembler for Cortex M0/M3 cores, which can be found in STM32, LPC 1xxx and other microcontrollers. It can quickly disassemble binary file to a readable assembly listing. USAGE mdisasm [-a address] [-o offset] [-s size] [-p] input-file OPTIONS -a address Set disassemble address to specified. Default address is 0x00000000. -o offset Set disassemble start offset inside input file. Default is 0. -s size Set nunber of halfwords to disassemble. If not specified, whole input file will be disassembled. -p Show address in [pc, imm] format in ldr instructions

Capstone Windows CE 交叉编译实战:为 VmwareHardenedLoader 构建 ARMv7 嵌入式反汇编引擎

本文基于仓库中 [COMPILE.md](https://link.gitcode.com/i/a624f4dd6fb5e274d8cb15a898867cd1) 的完整编译文档展开,讲解如何在 Windows 构建机上为 Windows CE 7(Windows Embedded Compact 7)与 Windows CE 8(Windows Embedded Compact 2013)、AR

gitblog_00440的博客 221

DAT文件修改器

解加密客服端dat文件文本教程 首先把我们需要的客服端的dat文件复制出来 比如:weapongrp.dat 这个文件为例 把他们复制出去喔 现在来解压缩 首先用l2encdec_292进行解密 方法是先把weapongrp.dat放到l2encdec_292文件夹里面去 编辑解加密.bat 把l2encdec.exe -s weapongrp.dat 的weapongrp.dat改成你要解的dat文件名字 好的.现在来修改一下 保存.然后运行就可以了 现在得到dec-weapongrp.dat 把他们复制到l2asm-disasm_1093 文件夹里面去 现在进行dat转txt操作 直接运行就好了 好了.到这里解加密就完成了 会得到一个文本文档和ACD数据库数据文件,直接打开文本文档进行修改就可以了 另外说一下..官方和私服的dat文件有经过特殊加密.所以是没办法这样解的喔!! 好了 现在说下修改完毕后怎么还原 其实也很简单 直接运行txt转dat 就又得到dec-weapongrp.dat(前提是把原来的删掉) 再把dec-weapongrp.dat复制到l2encdec_292(前提是把原来的删掉) 直接运行 加密 就得到原来的weapongrp.dat(覆盖到客服端system里就好了) 现在整个过程就全部结束了 可以进游戏咯! 祝大家游戏愉快!!!!!!

lensm 源码查看器完全解析:从安装到高级使用技巧

lensm 是一款功能强大的 Go 汇编和源码查看工具,专为开发者设计,帮助你轻松浏览和分析 Go 语言编译后的二进制文件及源代码。无论你是 Go 语言新手还是资深开发者,lensm 都能提供直观的界面和丰富的功能,让源码分析变得简单高效。 ## 🚀 快速安装 lensm:三步轻松上手 ### 1. 克隆仓库获取源码 首先,通过以下命令将项目克隆到本地: ```bash git clone

gitblog_00698的博客 428

看懂反汇编基础

通俗易懂的反汇编基础讲解,入门最佳选择,中英文对照理解

反汇编软件 将一个软件反汇编,生成汇编代码

主要功能:可以打开任意语言编写的软件,反汇编代码包括代码段,数据段,堆栈段

如何快速上手Fossilize:从安装到基础使用的完整教程

Fossilize是一个专门为Vulkan图形API设计的序列化库和层,它能够捕获和重放各种持久性Vulkan对象。这个强大的工具可以帮助开发者优化Vulkan应用程序的性能,特别是在处理着色器编译和管线创建方面。通过Fossilize,您可以创建可重用的缓存,显著减少应用程序启动时间和运行时的管线编译开销。 ## 🔧 什么是Fossilize? Fossilize是一个开源库,由Valve

gitblog_00328的博客 1018

游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析

本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。

u8v9w0x1y的博客 443
上一篇: [PTQ]均匀量化和非均匀量化
下一篇: [Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(1)
慷仔
博客等级 码龄9年 88粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值