获取程序入口点

程序不包含适用于入口点的静态Main方法 ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个,您的支持就是我坚持写作分享知识点传播技术的最大动力。「猿圈奇妙屋」; 阅读详情

入口点介绍:

一个程序从最开头往下算大致可以分为DOS头,DOS头相关数据,PE头,然后才是文件数据,我们要找的入口点地址写在了PE头里面。DOS头的长度是固定的,但其相关数据是不固定的,好在DOS头里有一个LONG类型的e_lfanew,这个变量记载了PE头相对DOS头的偏移。

IMAGE_NT_HEADERS是PE头结构体的宏,在32位和64位下分别对应_IMAGE_NT_HEADERS和_IMAGE_NT_HEADERS64。

typedef struct _IMAGE_NT_HEADERS {

    DWORD                         Signature;

    IMAGE_FILE_HEADER             FileHeader;

    IMAGE_OPTIONAL_HEADER32       OptionalHeader;

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signature是任何程序里都是固定不变的,就是ASCII的“PE”两个字

FileHeader对应的东西用不到不作说明

OptionalHeader结构体里的AddressOfEntryPoint是入口点。

获取入口点:

获取到入口点,要么你自己一层层调用得到入口点地址,要么就用API。

1. API——ImageLoad()函数

头文件ImageHlp.h

        ImageLoad(

            _In_ PCSTR DllName,

            _In_opt_ PCSTR DllPath

        );

就你填一个.exe文件地址和一个NULL,他最后返回给你一个LOADED_IMAGE结构体的指针,通过如下调用:

PLOADED_IMAGE image = ImageLoad("多字节字符集可执行文件地址",NULL);

DWORD dEnterPointer = image->FileHeader->OptionalHeader.AddressOfEntryPointer;

关于LOADED_IMAGE可以参考msdn介绍。

这个dEnterPointer就是入口点地址了。

最后记得释放image:

ImageUnLoad(Image);

因为加载文件头的本质就是把人家内存拷贝过来一份,用完了及时释放省的占地儿。

2. 不使用API的话就自己写一个ImageLoad

头文件:fstream.h

void* INJECT::ImageLoad(const wchar_t* filename){
    std::ifstream streamReader(filename, std::ios::binary);  //以二进制的形式读取文件
    streamReader.seekg(0, std::ios::end);                    //跳转到尾部
    unsigned filesize = streamReader.tellg();                //得到文件大小
    streamReader.seekg(0, std::ios::beg);                    //跳转到开始
    char* _data = new char[filesize];
    streamReader.read(_data, filesize);
    streamReader.close();
    return _data;
}

void INJECT::UnloadImage(void* _data){        
    delete[] _data;        
}

函数使用:

DWORD INJECT::GetEntryPoint(const wchar_t* filename){
void* image = ImageLoad(filename);//得到DOS头
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;//以IMAGE_DOS_HEADER解析信息
unsigned PEAddress = dosHeader->e_lfanew + (unsigned)image;//得到PE头
IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;  //以IMAGE_NT_HEADERS解析PE头
DWORD dEnterPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;//获取PE头内的入口点地址
UnloadImage(image);//关闭文件
return dEnterPoint;
}

几个结构体的关系:

LOADED_IMAGE                        包含PIMAGE_NT_HEADERS32(PE头)

IMAGE_NT_HEADERS32           包含IMAGE_OPTIONAL_HEADER32(包含入口点位置的结构体)

IMAGE_OPTIONAL_HEADER32        包含DWORD类型的AddressOfEntryPoint(入口点)

API版的ImageLoad和手写的ImageLoad的区别且不谈,就获取到数据后的操作:

API:

DWORD dEnterPointer = image->FileHeader->OptionalHeader.AddressOfEntryPointer;

手写:

IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;                //以IMAGE_DOS_HEADER的形式解析信息

unsigned PEAddress = dosHeader->e_lfanew + (unsigned)image;                //得到PE头

IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;                //以解析PE头特有的结构解析PE头

DWORD dEnterPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;        //获取PE头内的入口点地址

可以看出手写的函数,代码传回的是指向DOS头的指针而非PLOADED_IMAGE,这个LOADED_IMAGE结构体内部就有PE头的已经计算好的地址,而我们手写的话,得到了DOS头地址,需要用DOS头地址加上e_lfanew才能得到真正的PE头。

爬虫日记(73):Scrapy程序运行入口点分析 前面分析了怎么样产生scrapy.exe程序,然后通过它就会调用下一个模块,就是cmdline.py文件,它是位于目录scrapy里面,如下图: 我们可以通过修改这个文件来验证一下是否最开始调用这个文件运行,找到execute函数的位置,添加下面的代码: 然后我们到终端窗口里运行爬虫的命令: scrapy crawl quotes 这时就可以看到输出如下: 从输出的提示可见,第一行就提示了我们修改的字符串,说明是运行这个文件入口无疑了。这个过程如下图所示: 到这里,我们知道scr 阅读详情

相关推荐

SAP中常见的Debug方式

原文链接:https://mp.weixin.qq.com/s/wT4kThFKYV0PQYhCqpXRWg 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望转发关注,谢谢 导读 SAP系统在企业的应用时,都不会只使用标准功能。 通常情况下,基于特殊的行业需求,以及某些业务部门的管理需求等,都会额外开发出一些增强,报表,对话功能,接口等,从而保证系统的正常运转。 标准知识的逻辑,我们...

Kerwin-G的博客 1万+

修改pe程序入口点

固定基址-便于调试 修改入口点 程序使用x64dbg打开,可以看到程序基址为140000000 程序的入口点为11023,那么在内存中,程序入口点=基址+偏移量=140000000+11023=140011023 ctrl+G定位到140011023,然后找一个空白处,这里选择1400113B3,修改汇编代码为jmp 0x140011023 右键→补丁→修补文件,保存文件为project2.exe,然后将程序入口点修改为00113B3 现在运行project2.exe,可以发现入口点已经到了140.

qq_44657899的博客 2294

PCB 传输线教程(上):基于 Polar Si9000 与嘉立创工艺的传输线设计

理论线宽是W1,但在实际制作时,铜线顶部会有部分被刻蚀掉,表面被刻蚀后的宽度表示为W2,一般取经验值W2=W1-1,单位为 mil,Si9000 里面默认也是采用 W1,W2 相差 1 mil 的方式进行计算。表面阻抗结构就是简单的在一个平面上走信号线,以另外一个平面为地平面,信号线所在平面不进行铺铜(或铺铜间距大到可以忽略不计),这是最简单的一种结构,只需要知道介质层的厚度和介电常数、信号线厚度就可以进行阻抗计算。这个也是经验值,一般保持默认,或者可以填入 C1 相同的值(即忽略堆积)。

Surrea1的博客 1万+

C/C++ 获取函数地址

C C语言中没有类的概念,只有普通的函数。通过函数名就可以得到函数地址 #include <stdio.h> #include <stdlib.h> void fun() { } int main() { printf("%p\n", &fun); } 对于 fun 和 &fun 应该这样理解: fun 是函数的首地址,它的类型是 void () &fun 表示一个指向函数 fun 这个对象的地址, 它的类型是 void (*)() 因此 fun 和

lhh_qrsly的博客 8105

第七章-分布式搜索引擎-ES:全文查询、分词查询、精确查询、地理坐标查询、组合查询(bool、funtion_score)以及RestApi

111

weixin_36580930的博客 1635

使用C#实现Padim算法的训练和推理:智能缺陷检测的前沿技术

Padim (Patch-based Deep Image Model) 是一种用于无监督异常检测的深度学习算法。它通过提取图像中的局部特征(patch),并在这些特征上构建一个正常样本的分布模型来识别异常。无监督学习:不需要标注数据,适用于缺乏标签的情况。局部特征提取:通过卷积神经网络提取图像的局部特征(patch)。低秩近似:利用低秩近似构建正常样本的协方差矩阵,有效降低计算复杂度。鲁棒性强:能够处理多种类型的缺陷和噪声。

墨夶的博客 1015

【逆向分析】查找程序入口点

工具:OllyDBG 链接:https://pan.baidu.com/s/1ApV8xzmlI00TeokUF6cmZw?pwd=6ilp 提取码:6ilp 1、尾部跳转法 跳转指令位于代码的尾部且跳转到一个很远的位置 而且在这条指令的后面,会存在着非常多的0x00字节,也就是一大堆无意义的代码 进行跳转即可发现程序入口点 2、OD的插件法 点击:插件->OllyDump->Find OEP by setting Nop(Trace over) 会自动寻找入口点 3、利用p.

qq_45972928的博客 4455

152:vue+leaflet 判断一个点是否在一个电子围栏内

本文介绍了一个基于Vue+Leaflet的示例,演示如何判断点是否在电子围栏内。作者大剑师兰特(优快云知名博主)展示了使用polygon.getBounds().contains(latlng)方法检测点与多边形边界的关系。代码仅需80行,通过点击地图触发判断逻辑,结果显示提示信息。该技术可广泛应用于地理围栏、位置服务等场景,需要安装turf依赖。文章提供了完整源码和配置说明,适合GIS开发者学习参考。

大剑师兰特的GIS世界 759

PE执行流程

PE介绍

SXXYNHHXX的博客 914

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 571

【保姆级教程】基于UNet++&MobileNetv3的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv3作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 257

通过添加新的节来感染PE文件

所谓感染PE文件,其实就是修改PE文件,在不改变其原有功能的基础上,添加我们自己的代码,在这里我们将PE文件看作是一般的文件,只是在修改时,要根据PE文件结构 来进行update,否则的话就会破坏原有程序。这里我们不再对PE文件结构进行解释说明,请读者自行百度哈      现在我们说下添加区段的一般步骤      一.修改PE文件头部信息,需要修改的有IMAGE_FILE_HEADER的Nu

dasgk的专栏 2129

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

如何获得RVA(相对虚地址)的值,从而得到一个程序的入口点

得到RVA相对虚地址 我们用记事本为例: 首先用VS2010的命令行输入: dumpbin /headers C:\WINDOWS\system32\notepad.exe 如: 找到:OPTIONAL HEADER VALUES 中的entry point 此时739D就是所谓的RVA。 至于dumpbin 的其它参数可以参考:http://msdn.micr...

weixin_30399055的博客 598

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

servlrt程序的入口点是_微众银行we2000“备用金”入口在这!如何获取额度?教你顺利开通!...

注:本文转载自网络,不代表本平台立场,仅供读者参考,著作权属归原创者所有。我们分享此文出于传播更多资讯之目的。如有侵权,请在后台留言联系我们进行删除,谢谢! 微信备用金最近很火吧,入口的话...

weixin_39840616的博客 2856

Devexpress16.2.6破解工具

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

《Advanced .NET Debugging》 读书笔记 Listing 2-1: 找到notepad.exe的入口点

1. 安装VC,使用dumpbin.exe,执行dumpbin %windir%\notepad.exe /all /out:temp.txt 2. 打开temp.txt,可以找到入口点的RVA(Relative Virtual Address):0x73A5 3. 该RVA加上notepad载入后的绝对地址,就可以得到程序的入口点: 转载于:https://www.cnblogs....

weixin_30471561的博客 109

获取程序入口地址

// GetExeEntryPoint.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #pragma comment(lib, "Psapi.lib") int _tmain(int argc, _TCHAR* argv[]) { printf("GetCurrentProcess:0x%d \n", Ge

friendan的专栏 8837

程序入口点

关于不同的程序入口,main(), _tmain(),WinMain(),wmain()? (2012-07-01 23:15:16)转载▼ 标签: 杂谈 分类: C编程 http://topic.youkuaiyun.com/t/20010930/15/308713.html 答:main()是WINDOWS的控制台程序(32BIT)入口或DOS程序(16BIT)入口, WinMain()是WIND

H002399的专栏 1493

应用程序的主入口点应用程序的主入口点应用程序的主入口点

 ///         /// 应用程序的主入口点。        ///         [STAThread]        static void Main(string[] args)        {            Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("CapApp.

杨航的专栏 2195

Windows桌面应用开发—应用程序入口点WinMain

MSDN在线原文(英文) Windows桌面应用开发—应用程序入口点WinMain 每个Windows程序都包含一个名字为WinMain或wWinMain的入口点函数,下面是wWinMain的声明。 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

nongzhenyu的专栏 1898

MFC入口点及初始化分析

写的很随意,这是自己在学习及调试过程的随笔吧,希望能给大家带来一些益处。很多人对于MFC的入口点及初始化很迷茫,从而导致学习MFC的畏惧心理(当初和我一起学习的3~4个人基本都放弃了),但愿这篇文章给你以启示。1、程序的入口点。很多人在大学的时候,都被教会程序的入口点是main()函数。但是在main()函数之前有什么操作呢?这个问题涉及到了程序的加载流程。程序的价值流程大致如下:加载PE文件的.idata段---->加载PE文件的.data段---->加载代码段---->然后执行程序。.idata是PE程

xyls220的专栏 1445

Gdb停在链接器入口点

1.      下断点 动态链接的elf程序在内核加载完毕后,首先运行的是动态链接库的入口点,之后才是运行主程序。这里研究了下怎么在链接器入口点下断调试。   在主程序的main下断点(任意能断下来的地址即可)。 查看内存布局,知道ld.so的加载基地址: 0xb7fde000   因为程序在调试状态下,程序的aslr是关闭的,因此再次在调试器中运行程序ld.so的加载

ling 2443

c# 不包含适合于入口点的静态“Main”方法

这里写自定义目录标题项目场景:问题描述:原因分析:解决方案:新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 c# 不包含适合于入口点的静态“Main”方法 项目场景: 提示:这里简述项目相关背景: 编写自动获取周围WiF

IM_Emotion的博客 569

入口/修正信息 函数

idc GetEntryPointQty():获取入口函数个数 增加入口点AddEntryPoint(ordinal, ea, name, makecode) """ Add entry point @param ordinal: entry point number if entry point doesn't have ...

weixin_30907935的博客 105

Assembly获取程序集的几种方法

除了上述方法,还有一些其他的方法可以获取程序集,如Assembly.GetAssembly方法可以根据类型获取程序集,Assembly.ReflectionOnlyLoad方法可以以只反射的方式加载程序集等。Assembly.GetExecutingAssembly方法:获取当前执行代码的程序集。Assembly.LoadFile方法:从指定路径加载程序集,但不会加载程序集的依赖项。Assembly.LoadFrom方法:从指定路径加载程序集。Assembly.Load方法:根据程序集名称加载程序集。

tianminhjyusaf的博客 1684

点餐外卖连锁系统源码|餐饮小程序源码开发搭建

三勾餐饮点餐小程序源码是一款基于微信开发的小程序,旨在提供用户快捷、便利的餐饮点餐服务。该小程序包含点餐、支付等功能,用户可以通过扫描店内二维码、搜索店铺名称等方式进入和使用。高效流畅:该小程序采用优化的代码和快速的数据加载方式,使用户可以顺畅地浏览和使用。安全保障:所有用户的个人信息和支付信息都采取了安全措施进行保障,用户可以放心使用。快速入口:用户可以通过扫描店内二维码或搜索店铺名称快速进入点餐页面。简单易用:用户可以通过简单的操作即可选择商品、定制口味、支付购买等。

Javashop_jjj的博客 654
上一篇: 无辅助空间交换值的三种方式【所有语言通用】
下一篇: 命令行参数传递
hx___y
博客等级 码龄6年 5粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值