首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我绝对不能将"程序入口点放在dll中"?

在云计算领域,将程序入口点放在DLL(动态链接库)中可能会导致一些问题,因为DLL是一种在多个应用程序之间共享代码的方式。以下是一些可能的原因和解决方案:

  1. 启动性能:将程序入口点放在DLL中可能会导致启动性能下降,因为加载DLL需要额外的时间和资源。为了提高启动性能,最好将程序入口点放在可执行文件中。
  2. 依赖管理:将程序入口点放在DLL中可能会导致依赖管理问题,因为DLL可能会依赖其他DLL,这可能导致复杂的依赖关系和版本冲突。为了避免这些问题,最好将程序入口点放在可执行文件中,并使用适当的依赖管理工具。
  3. 安全性:将程序入口点放在DLL中可能会导致安全性问题,因为DLL可以被多个应用程序共享,这可能会导致安全漏洞。为了提高安全性,最好将程序入口点放在可执行文件中,并使用适当的安全措施。

总之,将程序入口点放在DLL中可能会导致一些问题,因此最好将程序入口点放在可执行文件中。这可以提高启动性能、依赖管理和安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

dotnet core 应用是如何跑起来的 通过AppHost理解运行过程

在 corehost.cpp 构建出来的 AppHost.exe 文件,是不知道开发者的最终输出包含入口dll 是哪个的,需要在构建过程传入给 AppHost.exe 文件。...,将这些内容放入到 AppHost.exe 里面,这就是实际的输出文件了 利用这个机制,咱可以更改可执行程序的内容,让可执行程序文件,寻找其他路径下的 dll 文件作为 dotnet 程序入口,大概就可以实现将...exe 放在文件夹外面,而将 dll 放在文件夹里面的效果。...而将入口 exe 文件放在 dll 所在文件夹的外面,可以让整个应用文件夹看起来更加清真 ?...Application\Foo.dll 作为入口程序集,因此就能将整个文件夹的内容,除了 exe 之外的其他文件放在其他文件夹里面 更多细节请看 Write a custom .NET Core runtime

82920

dotnet 桌面端基于 AppHost 的配置式自动切换更新后的应用程序路径

多次更新时入口程序的路径没有变更,有变更的是 dotnet 应用程序,不同的版本的 dotnet 应用程序放在不同的版本号文件夹里面,同时更改配置文件里面的路径即可 本文提供的方法实现了以下功能。...为了支持配置式的方式运行,咱需要让自己编写的 Native 程序支持读取配置文件,在配置文件里面里面获取业务端的应用路径,以及 CLR 引擎路径。在本文的例子里面,入口进程的文件存放布局如下。...这个例子的代码放在 github 还请大家自行下载使用。大概只需要加上图标和程序清单,以及设置为窗口启动,那么就可以放在你的项目里面跑起来。...为什么我会考虑将 CLR 引擎和业务端的应用分为不同的文件夹?...但是在考虑到一个团队里面如果有很多个软件,那么多个软件之前共用相同的 CLR 引擎,也许可以提升用户端的性能,如减少一内存的占用。那为什么不使用默认的公共的 CLR 引擎文件夹路径?

65020

CC++:std::thread构造函数死锁问题:WIN32下不可以在DllMain创建线程

A { A(){ // 启动线程 std::thread t([]{ std::cout << "thread runing." << std::endl;}); } } 动态库源码 dll.cpp...类的构造函数创建了线程,a对象被定义为全局变量,不论是作为exe还是dll执行a都会在程序启动初始化阶段被执行初始化。...当在动态库执行时,这个a对象的初始化是在动态库入口(DllMain entry point),也就是DllMain函数完成的。...创建新线程时,在开始执行线程过程之前,会以DLL_THREAD_ATTACH方式调用动态库 的入口(DllMain)1。为此,新线程必须获取加载程序锁。但是当前线程已经持有加载程序锁。...在stackoverflow上,找到了同款问题:2 文中给出的建议就是绝对不要在DllMain创建线程.

86030

C#DllImport用法汇总

大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows的一些功能,C++已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢...其功能是提供从非托管DLL导出的函数进行调用所必需的信息。DllImport属性应用于方法,要求最少要提供包含入口dll的名称。...b、CharSet参数指定用在入口的字符集。如果未指定CharSet,则使用默认值CharSet.Auto。 c、EntryPoint参数给出dll入口的名称。...web的,同时也是应用程序的 后来发现用[DllImport(@"C:\OJ\Bin\Judge.dll")]这样指定DLL的绝对路径就可以正常装载。...实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了。

1.7K10

Dll注入技术之劫持注入「建议收藏」

大家好,又见面了,是你们的朋友全栈君。...引用网络的原理讲解 ●背景知识● 首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的资源共享机制。...为了尽可能多得安排资源共享,微软建议多个应用程序共享的任何模块应该放在Windows的系统目录,如kernel32.dll,这样能够方便找到。...放在程序同目录下(这样会首先加载我们伪造的DLL) 注:可能需要修改注册表,使得程序从执行文件所在目录加载DLL(修改完可能需要重启) 有些高版本系统和程序已经不能劫持lpk.dll了,这里用了”...如图: 查看我们伪造的LPK.DLL导出表,与系统原来的一样 运行程序后先加载了我们伪造的LPK.DLL,程序被劫持 从模块列表也可以看到,既加载了我们伪造的LPK.DLL,也加载了系统的lpk.dll

1.7K30

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

本文将告诉大家这个过程里,踩到的坑,以及学到的知识,和为什么会如此做 前文 准确来说,在这个过程里的工作其实算是升级到 dotnet 6 最后一公里的工作。...然而 dotnet core 当前没有一个最佳实践可以让多个 Exe 之间完美共享运行时且不受系统所安装的全局 dotnet 运行时影响,同时照顾到安装完成之后的文件夹体积 列出的问题如下 多个 Exe...为什么如此做,请参阅下文的原因 修改项目文件 在入口程序集里面,加上对 定制部分的程序集 的引用逻辑,例如对定制的 WPF 的程序集,也就是放在 Build\dotnet runtime\WpfLibraries...在外层的入口 Exe 启动里程文件夹的 Exe 的时候,通过环境变量告知里程文件夹的 Exe 的 dotnet 机制去使用到最外层称为 Main 入口应用文件夹的运行时内容 然而第二个方案在本次迁移过程没有被我选择...这就是为什么当前不使用第一个方法的原因 尝试第二个方法: 在 入口程序集 里面,引用 WPF 定制版本的程序集,此时将会在开发构建被输出,在开发运行被引用。

1.5K10

PE文件和COFF文件格式分析——导出表的应用——一种插件模型

一开始还不能理解为什么要在Exe搞导出函数。后来查了相关资料,发现这样做是为了方便开发插件,这让一下焕然大悟。        ...现在思考一个过程,我们的Exe程序的逻辑可能需要若干Dll函数来辅助。如下图 ?         A.exe需要B.dll、C.dll和D.dll辅助。...),该DLL就导出B.dllB1()、C.dllC1()和D.dllD1()的入口地址。...经过考虑,PluginHelper.dll的功能放在哪个DLL文件中都不合适。那只能放在A.exe中了。是的!...至于插件的调用,这儿不准备搞复杂的设计,这儿将直接Load插件DLL,并调用DLL的导出方法(该方法的调用约定是提前确定好的)。

60150

在Windows劫持DLL

DLL搜索顺序劫持:在不带路径的应用程序指定的DLL,以特定顺序在固定位置搜索,通过将恶意的DLL放在实际DLL之前的搜索位置,劫持了搜索顺序,有时包括目标应用程序的工作目录 Phantom DLL劫持...编译现有DLL的自定义版本比听起来更具挑战性,因为如果缺少过程或入口,许多可执行文件将不会加载此类DLL,诸如DLL Export Viewer之类的工具可用于枚举所有外部函数名和合法DLL的序号,确保我们编译的...有些应用程序附带了一个GUI,或者其他一些可视化元素,这些元素显示了执行的二进制文件,这还包括错误消息:所需的DLL可能丢失,而被劫持的DLL显然缺少原始功能,攻击者不太可能将此类应用程序作为DLL劫持的目标...防御措施 防止DLL劫持发生的一种简单方法是使应用程序始终使用绝对路径而不是相对路径,尽管某些应用程序(尤其是可移植的应用程序)并非总是能够做到这一,但是位于\system32\同一文件夹并依赖于这些...因此,让我们把重点放在检测上,您可以从意外路径搜寻前面提到的任何DLL的创建或加载,特别是在临时位置(如:%appdata%),毕竟加载DLL的(合法)应用程序的名称可以更改,但DLL的文件名始终是固定的

2K10

模块已加载,但找不到入口DLLRegisterServer

大家好,是架构君,一个会写代码吟诗的架构师。今天说一说模块已加载,但找不到入口DLLRegisterServer[通俗易懂],希望能够帮助大家进步!!!...模块已加载,但找不到入口DLLRegisterServer 通常在运行中注册动态库文件:regsvr32 xxx.dll (按回车键执行命令)都能顺利通过。...但有时也会报出异常: ​ 模块“xxx.dll”已加载,但找不到入口DLLRegisterServer。请确保xxx.dll为有效的DLL或OCX文件,然后重试。...首先确保dll文件放在正确的位置: 32位系统将dll文件放在C:\Windows\System32 文件夹内。...解决方案: 1、方法一:win+r,打开运行菜单,输入regsvr32 xxx.dll 2、方法二:在开始菜单中找到cmd命令行窗口,以管理员身份运行,在命令行输入regsvr32 xxx.dll

35.5K151

dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能

由于 AOT 是生产静态逻辑,只取平台最小集,而无法和 JIT 一样,根据所运行设备进行动态优化,这就是为什么运行过程的性能,在 JIT 进入 Tier 2 优化之后的性能要远远超过 AOT 的方式。...嗯,能加一。如果配合上混淆的话,感觉上是差不多了。如果要说防破解能力的话,两个的打分,一个是 60 分,一个是 70 分,满分是 100 分。...只是优化了入口程序集而已 真的想要有比较大的优化,是需要将除了入口程序集之外的其他程序集也通过 Crossgen2 工具进行 ReadyToRun 才可以有比较大的提升的。...这个应用的入口程序集占比太小了,如果使用官方的方法,只是对入口程序集进行 ReadyToRun 那么性能上还真被 .NET Framework 完虐 为了让 dotnet 6 应用的启动性能能媲美 .NET...工具在准备 AOT 过程,需要找到所引用的程序集。这些参数就是告诉工具对应的程序放在哪。可以多加入很多程序集,因为只是给工具使用的参考引用,工具会根据自己的需求,去找到对应的程序集文件。

65920

【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解

但是由于的难度极高,修复难度极大,以至于在原帖没有人能及时提供一个明确的解决方案。那么现在请大家跟我一起来解密。 老办法,运行程序,用先在内存抓。为什么要从内存抓?...这个工具除了可以解决DNGuard的乱码问题外,还可以修复入口,是的,可以修复任意.net程序被破坏的掉的入口已经考虑到4种被破坏入口的情况,所以通用性应该还是不错的。...这时候留心观察寄存器里EIP的值(为什么要观察EIP,因为EIP标志着程序将执行的下一句指令),我们可以很清楚地看到,程序下一句将要执行的是mscoree.dll这个模块的_CorExeMain函数。...以上文字如果你完全看懂了,足够用来解决SE壳+DNGuard壳脱壳时候报错,需要修复入口的问题。 你没看懂也没关系,用了这个工具你再也不用为无法修复.net入口而苦恼了。...运行再次修复的程序看看。 乱码问题解决了,入口问题也解决了。但是,别忘了,我们才刚刚把第一层壳脱完。

8.5K40

不能定义声明dllimport_不允许 dllimport 静态数据成员

留意一下STL代码你会发现,所有模板代码全 都放在一个.h文件为什么不分开放在.cpp文件,因为放在.cpp文件即成为一个编译单元,一个单元就是一个PE结构,是实在的二进制代码文 件,但这个单元没有调用这个模板又哪来的编译单元...为什么能将这2个函数的定义放在.cpp文件中上面已经有解释了。 上面说的不太完美:添加以下说明: __declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出。...要给别人用。一般用于dll 省掉在DEF文件手工定义导出哪些函数的一个方法。...// 相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件手工定义导 出哪些 函数的一个方法。...明明已经定义了,为什么又没有了?? 肯定是因为把m_nValue定义为static的原因。

1.8K20

dotnet core 和 dotnet Framework 启动可执行文件的差别

而使用 .NET Core 构建出来的应用,将会包含一个 Exe 可执行文件,和对应的 Dll 文件,而 IL 代码将放在 Dll 文件里面。...在用户双击运行此 Exe 可执行文件的时候,将会运行起来这个 Win32 应用,在这里面将调用起 CLR 引擎,执行放在 Dll 的 IL 代码。...其中在 _CorValidateImage 中将执行确保该代码是有效的托管代码以及将映像入口更改为运行时中的入口。...而在 x64 ,还会在 _CorValidateImage 通过在内存修改映像的 PE32 为 PE32+ 格式。...包含 IL 逻辑的放在额外的 Dll 文件 .NET Framework: 稍微特殊的 Win32 的 PE 格式文件,包含了特殊 COFF 头内容用来标识这是 .NET Framework 文件。

69220

【专业技术第五讲】动态链接库及其用法

例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库,您无需重新生成或安装整个程序就可以应用更新...Windows 提供的DLL文件包含了允许基于 Windows 的程序在 Windows 环境下操作的许多函数和资源。一般被存放在 "C:\Windows\System32" 目录下。...它们向运行于 Windows操作系统下的程序提供代码、数据或函数。程序可根据 DLL 文件的指令打开、启用、查询、禁用和关闭驱动程序。...入口 在创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。...您可以使用入口点函数根据 DLL 的需要来初始化数据结构或者销毁数据结构。此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储(TLS) 来分配各个线程专用的内存。

97670

让vc编译出的程序减小体积

属性看下,咦!没走眼吧,就一Hello World就160kb真是要人命啊! 呵呵!上面的情况是笔者所遭遇的情况.不过后来了解vc可以通过设置参数来自定义编译方式.为什么文件那么大!...二,设置自己的入口点函数 C或C++程序默认的入口函数是main()或WinMain(),但我们现在不用什么Main,WinMain.因为这些都不是直接的入口,编译器在产生exe文件的时候,将为我们生成真正的入口...(分类)"下拉列表中选"output",在" Entry-Point symbol(输入项-符号)"输入我们刚才定义的入口函数(MyFun),在源程序也要做相应修改,然后再编译.现在是16k了:)...// 子系统为windows的默认入口WinMain和console的默认入口main,都会引入 #pragma comment(linker, "/ENTRY:main") //int WinMain...(忽略所有其他可能的入口) (缩写: /m) /fullpaths 编译器生成完全限定路径 /filealign: 指定用于输出文件节的对齐方式 /nostdlib[+|-] 不引用标准库 (mscorlib.dll

1.9K10

如何实现一款 shellcodeLoader

本工具旨在解决shellcode载荷生成过程多数重复性工作,降低免杀的工作时间,将更多的精力放在渗透或者发现新的免杀利用方式上。...为了对线程的APC队列的项进行处理,线程必须 将自己设置为可提醒状态,只不过意味着我们的线程在执行的时候已经到达了一个,在这个上它能够处理被中断的情况,下边的六个函数能将线程设置为可提醒状态:SleepEx...入口劫持注入 众所周知,PE存在一个入口,这个入口正是进程开始执行的地方,所以我们可以通过更改内存入口的内容来运行我们的shellcode。...由于存在ALSR,入口还需要加上映像基址,所以我们可以找到内存入口,再将其入口的位置写入shellcode,即可获取进程的执行权限。 1.首先以挂起的形式创建要注入的进程。...2.从进程基本信息获取映像基址。 3.从映像基址读取PE头信息,再从NT头中获取入口(该入口也可以直接从文件获取),加上获取的映像基址得到真的入口

1.5K10

C# DllImport的用法

大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows的一些功能,C++已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢...DllImportAttribute 属性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口DLL 的名称。...3、DllImport具有五个命名参数:    a、CallingConvention 参数指示入口的调用约定。...b、CharSet 参数指示用在入口点中的字符集。如果未指定 CharSet,则使用默认值 CharSet.Auto。    c、EntryPoint 参数给出 dll 入口的名称。...d、ExactSpelling 参数指示 EntryPoint 是否必须与指示的入口的拼写完全匹配。如果未指定 ExactSpelling,则使用默认值 false。

89910

Cobalt Strike已死?如何真正意义上的入门免杀

(摇撼数据+云分析),的虚拟机沙箱里面可以上线,可能是因为在这个里面没有太多的规则和联动,所以这种上线方法在实战参考的意义并不大。...目前来讲,卡巴不会再把查杀重点放在静态,甚至放任某些行为操作,也就是说cs上线相对较为容易,但是上线之后的内存规避查杀很困难,对于这种情况,建议换c2,也可以二开havoc,或者完全二开cs使用。...略显费劲— bitdefender、麦卡菲、诺顿、eset 为什么cs上线过bit和诺顿甚至麦卡菲会感觉比较费劲,这在于它们的侧重查杀和卡巴不一样,论动态检测能力来说,bit应该是远高于其它类型的杀软...你甚至可以夸张一的说,卡巴在静态查杀上是放弃的状态。对于eset这种的杀软来说,如果bypass的话,一般常使用白加黑进行加载,再配合一些dll注入技术,其中也包括unhook。...第二就是,在木马上线之后,是绝对不会依赖于shell命令来创建cmd的,这样的操作对于杀软来说是非常敏感的,可以采用模块化插件的方法,比如cna加载的形式进行操作。 5.

1.1K10
领券