汇编取得函数地址

使用汇编代码获取GetProcAddress函数地址的大致步骤(面试题系列) 1、首先通过FS寄存器获取到TEB的地址 2、在TEB偏移为0x30处的成员是PEB 3、PEB偏移为0xC处的成员是PEB_LDR_DATA结构体指针 4、PEB_LDR_DATA结构体偏移为0x1C处成员为InInitializationOrderModuleList,初始化模块链表,这个成员保存的是模块链表的头部地址。 5、通过InInitializationOrderModuleL 阅读详情

// 1.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <iostream>

using namespace std;

#define     array_size 10

int a[array_size]={42, 73, 65, 97, 23, 59, 18, 84, 36, 6};

int _tmain(int argc, _TCHAR* argv[])

{

 

     int *p;

     p=&a[0];

     p--;

 

     __asm

     {

         mov esi,p;

         mov ecx,array_size;

_outloop:

         mov edx,ecx;

_inloop:

        mov eax, [ esi+ecx*4 ]; //一个int占4字节

        mov ebx, [ esi+edx*4 ];

        cmp eax, ebx;

         jnb _noxchg; //不交换

         mov [ esi+ecx*4 ], ebx;

         mov [ esi+edx*4 ], eax;

_noxchg:

              dec edx;

         jnz _inloop;

         loop _outloop;

     }

 

         for (int i=0;i<10;i++)

              cout<<a[i]<<" ";

cin>>a[0];

     return 0;

}

 

 

int RemoteThread()

{

_asm

{

     call @Delta                   //编译的时候产生文件基址地址

          @Delta:

     pop ebp                       //取得加载基址

sub ebp,offset @Delta         //call函数的情况下地址不会变,但是涉及到引用变量,

//PE Loader不会“重定位”引用变量的地址,所以需要自己

//在文件偏移上加上装载基址

     mov eax, fs:[0]

     @FindSEHEnding:

     cmp Dword ptr [eax],$ffffffff

    je @FoundSEHEnding

     mov eax,[eax]

     jmp @FindSEHEnding

     @FoundSEHEnding:

    mov eax, [eax+4]             //根据SEH的结构,其+4为异常函数地址,该异常函数地址在K.Dll内部

    xor ax,ax

     @FindKnlHead:

    sub eax,$10000

    cmp word ptr [eax],$5A4D

    jne @FindKnlHead

     mov ebx,eax

     mov eax, [eax+$3c]

     add eax,ebx

    mov edx, [eax+$78]

     add edx,ebx

    mov edi, [edx+$1c]

     add edi,ebx

    mov esi, [edx+$20]

     add esi,ebx

     xor ecx,ecx

     @Find_ocAd:

     mov eax, [esi]

     add eax,ebx

    cmp dword ptr [eax+5],$6441636f  //"ocAd"的ASC码

    je @Found_ocAd

     @Find_ocAd2:

     add ecx,4

     add esi,4

     jmp @Find_ocAd

     @Found_ocAd:

     cmp word ptr [eax+$0d], $73

    jne @Find_ocAd2

    mov esi,edi

     add esi,ecx

     mov esi,[esi]

     add esi,ebx            //典型的基址加上偏移地址

    call @StrGetModuleHandle

     db 'GetModuleHandleA',0

     @StrGetModuleHandle:   //push字符串,原因是调用CALL的时候,堆栈里先压入了下一条地址

//(如果是调用函数,应该在"另一个"堆栈中压入了参数和EIP,EBP,

//退出时会自动平衡)

    push ebx

     call esi

     mov edi,eax

     call @StrFreeLibrary

     db 'StrFreeLibrary',0

     @StrFreeLibrary:

     push ebx

    call esi

     mov esi,eax

     lea ecx, [ebp+@DLLName]  

    push ecx

    call edi

     push eax

    call esi

     rtn

     @DLLName DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

}

 

 

}

 

通过函数地址从符号名中反汇编函数名 经过上面的命令,脚本已经编译成功,生成的elf在D:\TBOX\SDK\QSR01A01_C_SDK_LTE_E_BETA20251225\qos_build\release\EC800ZCNLFR01A01M04_BETA0403_OCPU\DBG下,继续执行反汇编。PS D:\TBOX\SDK\QSR01A01_C_SDK_LTE_E_BETA20251225\qos_build\release\EC800ZCNLFR01A01M04_BETA0403_OCPU\DBG> # 示。 阅读详情

相关推荐

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置1.打开ESXI的SSH2.找到不能添加的硬盘路径3.用SSH操作 1.打开ESXI的SSH 2.找到不能添加的硬盘路径 我的是第一个,找到你要添加但是不能添加的那个硬盘,点进去。 完整的路劲为:1/2 比如我的: /vmfs/devices/disks/t10.ATA_____ST500LT0122D1DG142___________________________________S3PHRNHQ (比较长哈!) 3.用SSH

AI_DOG的博客 2万+

汇编api函数地址的获取

api函数地址的获取 by Hume/冷雨飘心 这是一个老题目了,如果我们不用任何引入库,能否在程序中调用api函数?当然可以!方法有很多,你可能早就知道了,如果你已经了解了,就此打住,这是为还不了解这一技术而写.另外这也是病毒必用的技巧之一,如果你对病毒技术感兴趣,接着看下去. 这里假设...

weixin_34109408的博客 1351

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

ESP32S连接JY61P并通过WIFI把姿态数据发送给电脑1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;2.电脑接受数据是基于python的;

Doudou_Nai的博客 1135

纯汇编语言(无哈希值)获取任意函数地址

纯汇编语言无哈希值获取任意函数地址,使用FASM汇编器

LukeO的博客 414

医疗设备安规入门:一张图搞懂BF型设备的MOOP/MOPP绝缘路径(附GB 9706.1附录解析)

本文深入解析了BF型医疗设备的MOOP/MOPP绝缘路径设计,结合GB 9706.1标准附录J的实战应用,帮助工程师快速掌握医疗设备安规要点。通过典型绝缘路径图分析,详细对比了MOOP与MOPP的防护差异,并提供了海拔修正、漏电流测试等关键设计指南,助力医疗设备安全合规。

weixin_30633405的博客 393

从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构

本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。

weixin_29294975的博客 628

函数指针及其使用

一、函数指针的定义 函数指针是持有函数地址的指针。在汇编语言中,使用CALL、JMP、LOOP等跳转指令时,后面需要接一个跳转地址(对应C语言中的指针),如16位CPU中,地址为4位16进制数,为了程序编写方便,我们一般在需要跳转到的段前加一个段标记,这个段标记会被编译器翻译为该行程序在内存中的地址,我们使用CALL、JMP、LOOP等指令时,只需要在指令后加上代表该段地址的段标记,而无需填写实际的地址。例如下段汇编程序: assume cs:code//汇编伪代码 code segment//code

xinzhi1992的博客 593

【事件相机实战】噪声识别与智能滤波技术解析

本文深入解析了事件相机应用中关键的噪声识别与智能滤波技术。针对背景活动噪声、阈值波动噪声、热点噪声及运动边缘尾迹等核心噪声类型,文章剖析了其成因与特征,并详细介绍了从经典的时空相关性滤波、热点像素滤除到前沿的深度学习(如EDnCNN)等实战滤波方法,旨在帮助开发者在保证低延迟的前提下,有效提升事件流数据质量。

weixin_29169899的博客 441

从汇编角度看函数

函数1. 函数简介2. 从汇编中看函数 1. 函数简介 在代码开发过程中,函数是一个必然存在的,它是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序。 函数主要需要关注两个方向问题:函数参数,函数返回值 2. 从汇编中看函数 函数功能的实现部分 PUSH EBP 提升堆栈

深耕安全技术研究 671

Voronoi算法构建多晶

孪晶多晶 采用孪晶的原子链作为种子通过voronoi算法可以得到孪晶多晶结构。 孪晶种子: txt文件不需要特殊设置 box 150 150 150 random 8 得到孪晶多晶: 通过改变孪晶种子的长度可以得到不同孪晶片层厚度的多晶。 准二维柱晶 所有晶粒在某一维度的晶向一致,晶粒仅在平面内具有旋转关系,所有晶界为旋转对称晶界,这种结构的多晶其位错滑移在某些方向受限,但是能极大的提高晶粒...

yamatachi的博客 5280

图解转置卷积原理

声明:本文大部分搬运自【机器学习】详解 转置卷积 (Transpose Convolution) 感谢博主花与人间事同,本人只是在博主原创文章上做补充以及添加一些自己的理解。 1 转置卷积的背景 通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,称为上采样 (Upsample),如下图所示: 上采样方法有很多,详见【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

laonafahaodange的博客 5686

linux反汇编如何得到各个函数的地址,Linux下反汇编指定的函数

在debug二进制程序的时候,偶尔会用到反汇编,有时候也想反汇编指定的函数,那么以下有两种方法可以试试:用objdump的-d参数或者gdb的disassemble命令:一、用objdump的-d参数,但不能指定函数名,objdump还有另外两个参数--start-address和--stop-address,我们只要指定反汇编的起始地址和结束地址那应该就可以了,那怎么得到函数的起止地址呢,这就需...

weixin_35600177的博客 1883

在群辉(NAS)中安装虚拟机套件(Virtual Machine Manager)

一、在群辉中下载虚拟机套件Virtual Machine Manager ①启用Open vSwitch(网络-->管理--启用Open vSwitch) ②打开“套件中心” ③查找到Virtual Machine Manager套件点击“安装套件” 二、安装虚拟机套件(Virtual Machine Manager) ①打开虚拟机套件运行设置向导 ②选择存储空间...

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

汇编之原始EBP与函数返回地址

本文深入解析了函数调用中的原始EBP和返回地址机制。原始EBP是调用者的栈帧基址,用于维护栈帧边界和恢复调用环境;返回地址是调用指令后的下一条指令地址,控制程序执行流。通过图书馆借书类比和32位x86汇编案例分析,阐述了它们在栈帧创建、函数调用及返回过程中的核心作用。文章还指出了常见误区,并提供了调试建议,强调这些概念对理解函数调用机制和栈溢出攻击原理的重要性。

盾悟 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

32k通过地址跳转到函数_汇编层面分析函数调用

​我们自己的写的代码在电脑上运行的时候,是怎么运行的呢。一般会有这么几个问题?程序是顺序执行的,CPU 是怎么进行实现的呢?程序是如何调用函数的,如何传递参数的?当调用函数完成后,CPU 是怎么确定下一条指令的地址的?基本概念介绍1. 栈栈在内存中是一块特殊的存储空间,它的存储原则是“先进后出”,即最先被存储的数据,最后被释放。汇编过程通常使用 PUSH 和 POP 指令对栈进行压入和弹出的操作。...

weixin_34188576的博客 162

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【汇编程序】实现修改函数返回地址改变程序执行流程

程序需求:编写一函数,该函数执行结束后返回,返回后原有程序的执行流程发生改变。编程思路:函数的调用是通过堆栈进行的,在函数开始执行之前会将此函数位置的下一条指令地址压入栈中,函数执行结束后会返回到这个地址处继续执行指令。我们可以通过在函数体内部修改栈中的函数返回地址,从而达到修改程序的执行流程。在C语言中可以使用混编的方式来达到修改函数返回地址(因为C语言无法直接修改寄存器的值,只能使用汇编实现)...

yiftss 2838

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

线性汇编问题:找不到_main函数的入口地址

  线性汇编问题:找不到_main函数的入口地址 我将线性汇编的函数写到.sa文件中,然后在.c中的main()调用该函数,但是编译报错,如下:undefinedfirst referencedsymbolin file-------------------------_mainc:/ti/c6000/cgtools/lib/rts640

ciompmq的专栏 1834

【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

本篇文章主要是为了解答有关多态的那篇文章那块的一个奇怪现象,大家还记得这张图片么?你有没有发现:多继承子类重写的func1函数地址竟然是不同的?按常理讲:我们知道函数地址存储的是函数的指令的位置,这里『 应该是相同』的,才能保证对象在调用时都调用『 子类重写后的』func1方法 ,否则就失去了重写的意义了。所以这里一定存在某些底层设计,那接下来就让我们转到『反汇编 』,来查看以下vs在这里是如何设计的吧。

℉f的博客 2053

C++成员函数地址的黑魔法:从联合体到汇编的实战避坑指南

本文深入探讨了C++中获取成员函数地址的两种底层技术:联合体转换法和汇编偏移法。文章剖析了成员函数指针在不同编译器下的内存布局差异,揭示了其复杂性源于this指针调整和继承体系。通过实战代码和反汇编分析,为开发者提供了在构建高性能回调系统时的技术选型指南和避坑策略。

gold的博客 976

exe 汇编代码中是如何确定函数的地址的呢?

问:对于dll中的函数地址在运行前是不知道的,那在文件代码中是如何编写 “call 函数地址” 之类的指令的呢? 答:虽然不知道函数的地址是什么,但是知道函数的地址写在哪里。可以[函数地址的指针]来读取函数的地址 比如: GetStartupInfoW函数的地址不是01220100(上面蓝色笔圈出的地址是小端序) 而是01220100地址是处存放着GetStartupInfoW函数的地址 见下图 如此一来,当PE装载器把...

qq_39921539的博客 812

反汇编 之C 用指针和目标地址运算调用函数

#include <stdio.h> /* * 用指针和复杂的目标地址运算来调用函数 */ int func1() { return 1; } int func2() { return 2; } int func3() { return 3; } void main() { int x; long a[3] = {(long)func1, (long)(func2), (long)func3}; int (*f)(); fo...

xiaozhi 1200

C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址

讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接:  http://blog.youkuaiyun.com/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,熟悉内存模型) 1.复习开发知识 首先:强调一个概念 定义一个函数为虚函数,不代表函数为...

weixin_30849403的博客 188

从.NET函数栈中利用汇编推断JIT/STUB存根的委托(delegate)地址

【代码】从.NET函数栈中利用汇编推断JIT/STUB存根的委托(delegate)地址。

liulilittle的博客 150

C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址

      C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接:  http://blog.youkuaiyun.com/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,...

weixin_30510153的博客 156

汇编语言_探索C语言的main函数的入口地址

探索C语言的main()函数的入口地址,首先要编译连接。 在xp系统中,如下操作: ** 按f3,test.c文件的路径,将test.c中的源代码读入到tc.exe中; 接着,按下f10,将option中的directory全部删掉,如下图所示; 进入链接阶段:在compile中,选择link exe开始链接,如下图所示,这一步需要很多.obj文件,放入相同的路径下。 最后成功生成test.exe文件 编译一个程序需要前人写好的很多文件,如下图所示,最终才能生成.exe文件。 现在,寻找Main

weixin_43916755的博客 3153
下一篇: 读Net Programming on WIN2K 2nd 后记---关于I/O Model
ForTopLevel
博客等级 码龄22年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值