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

【编程经验】C语言程序真正的启动函数(文末有福利,第二弹)

因为我们从学C语言开始,都会先明白这个道理,即C语言有且仅有一个main函数,main函数是C语言的入口点和出口点!...函数或者WinMain函数开始执行,这当然没错,但事实上main函数仅仅是一个C语言语法规定的入口点,而不是真正的程序入口,因为它也有函数返回值!...可以看到上一次是被mainCRTStartup函数调用,在第206行的25个字节偏移处开始调用,再之前就是KERNEL32了,它是windows系统三大主要文件之一。...控制台下则为MS-DOS的版本信息。 2._heap_inith函数:用于初始化堆空间。...在入口点出输入你想自定义的函数名,比如起名MyDotcpp,将替换掉mainCRTStartup函数,重新被KERNEL32调用,main函数作为C语言语法入口点,被MyDotcpp调用,如图: ?

1.1K120

VBA: 隐藏模块中出现编译错误:的解决对策

office365有32位和64位两个版本。通过64位office软件打开早期的excel文件,如果代码中存在早期面向32位office编写的VBA代码,可能会存在上述的编译错误。...1 此错误的原因和解决方案 此错误的原因: 当受保护(隐藏)的模块内的 VBA 代码中存在编译错误时会引发此错误。由于模块是受保护状态,因此不会公开具体的编译错误。...可能的解决方案: (1)如果您具有访问文档或项目中的 VBA 代码的权限,请先取消对该模块的保护,然后再次运行该代码以查看具体的错误。...这是因为,VBA 版本 6 和更早版本完全以 32 位平台为目标,而且通常包含 Declare 语句,这些语句调用的 Windows API 使用 32 位数据类型的指针和句柄。...3 VBA工程密码破解 当受保护(隐藏)的模块内的 VBA 代码中存在编译错误时,由于模块是受保护状态,因此不会公开具体的编译错误。此时,需要取消对该模块的保护。

14K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    1.12 进程注入ShellCode套接字

    1.12.1 读入Kernel32模块基址为了能让读者更清晰的认识功能实现细节,首先笔者先来实现一个简单的读取特定模块内函数的入口地址,并输出该模块地址的功能,需要注意的是,在之前的文章中笔者已经介绍了这种读取技术...#include Windows.h>// Kernel32 调用约定定义typedef HMODULE(WINAPI* LOADLIBRARY)(LPCTSTR lpFileName...,但需要注意的是,由于我们采用了动态生成ShellCode的功能,所以在使用此类代码是应关闭编译环境中的DEP及ASLR机制,否则由于地址的动态变化我们的代码将无法成功定位函数入口,也就无法注入Shell...ASLR可以在操作系统内核、编译器和二进制代码等多个层面实现,如在编译时生成随机堆栈和堆地址、加载时随机化内存基地址等。这两种技术都可以增强操作系统的安全性,防止恶意代码的攻击和利用。...通过 CreateRemoteThread 函数在目标进程中创建一个线程,并将线程的入口点设置为 MyShell 函数,这样就实现了进程注入。

    33740

    1.12 进程注入ShellCode套接字

    1.12.1 读入Kernel32模块基址 为了能让读者更清晰的认识功能实现细节,首先笔者先来实现一个简单的读取特定模块内函数的入口地址,并输出该模块地址的功能,需要注意的是,在之前的文章中笔者已经介绍了这种读取技术... #include Windows.h> // Kernel32 调用约定定义 typedef HMODULE(WINAPI* LOADLIBRARY)(LPCTSTR lpFileName...,但需要注意的是,由于我们采用了动态生成ShellCode的功能,所以在使用此类代码是应关闭编译环境中的DEP及ASLR机制,否则由于地址的动态变化我们的代码将无法成功定位函数入口,也就无法注入Shell...ASLR可以在操作系统内核、编译器和二进制代码等多个层面实现,如在编译时生成随机堆栈和堆地址、加载时随机化内存基地址等。 这两种技术都可以增强操作系统的安全性,防止恶意代码的攻击和利用。...通过 CreateRemoteThread 函数在目标进程中创建一个线程,并将线程的入口点设置为 MyShell 函数,这样就实现了进程注入。

    24940

    WinDbg 漏洞分析调试(一)

    需要说明一点,随着微软在自身安全上的不断改进,漏洞利用的难度也越来越大,出于学习目的这里主要关注比较经典的漏洞,虽然有些可能比较老了,但还是很有借鉴意义的。...0x02 Windows 进程 下面将通过实际例子对Windows进程做个概述,内容比较基础。 在逆向分析中,进程往往作为基本的调试单元,因此对其的理解是有必要的。...,可以看到一个进程中包含有多个线程: ?...我们可以由此技术大体了解下PE Loader的功能,首先是查找kernel32等模块中的特定函数,即获取模块基址和处理PE格式,而后申请空间写入节数据、处理输入表和重定位表等,最后跳转到执行入口,即模拟原先操作系统的加载...我们可以简单看下如何获取kernel32模块的基址,这里由查找LDR链实现,即FS:[30] -> _PEB_LDR_DATA -> _LDR_DATA_TABLE_ENTRY: ?

    1.4K40

    1.5 编写自定位ShellCode弹窗

    在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问题,由于采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统或系统重启过...为什么要查找Kernel32.dll的地址而不是User32.dll,这是因为我们最终的目的是调用MessageBoxA这个函数,而该函数位于 User32.dll这个动态链接库里,在某些程序中User32...调试器的基本使用了,本节我们将扩展一个知识点,以让读者能更好的理解WinDBG调试命令,本次我们实现枚举进程模块的功能,本案例将不在解释基本功能。...,则默认会枚举出当前模块所导入的所有模块信息,其输出效果如下图所示; 1.5.3 计算函数Hash摘要值 案例介绍了如何使用Win32汇编语言和C语言计算字符串的hash摘要值。...Hash值,其输出效果如下图所示; 在理解了C语言版本的计算流程后,那么汇编语言版本的也应该很容易理解,如下是使用Win32汇编语言的实现过程,并在MASM上正常编译,汇编版字符串转换Hash值。

    39130

    1.5 编写自定位ShellCode弹窗

    在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问题,由于采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统或系统重启过...4.最终动态调用系列函数1.5.1 动态查找Kernel32基址首先我们需要通过汇编的方式来实现动态定位Kernel32.dll中的基址,你或许会有个疑问?...为什么要查找Kernel32.dll的地址而不是User32.dll,这是因为我们最终的目的是调用MessageBoxA这个函数,而该函数位于 User32.dll这个动态链接库里,在某些程序中User32...,则默认会枚举出当前模块所导入的所有模块信息,其输出效果如下图所示;图片1.5.3 计算函数Hash摘要值案例介绍了如何使用Win32汇编语言和C语言计算字符串的hash摘要值。...Hash值,其输出效果如下图所示;图片在理解了C语言版本的计算流程后,那么汇编语言版本的也应该很容易理解,如下是使用Win32汇编语言的实现过程,并在MASM上正常编译,汇编版字符串转换Hash值。

    25620

    1.5 编写自定位ShellCode弹窗

    在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问题,由于采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统或系统重启过...4.最终动态调用系列函数1.5.1 动态查找Kernel32基址首先我们需要通过汇编的方式来实现动态定位Kernel32.dll中的基址,你或许会有个疑问?...为什么要查找Kernel32.dll的地址而不是User32.dll,这是因为我们最终的目的是调用MessageBoxA这个函数,而该函数位于 User32.dll这个动态链接库里,在某些程序中User32...,则默认会枚举出当前模块所导入的所有模块信息,其输出效果如下图所示;图片1.5.3 计算函数Hash摘要值案例介绍了如何使用Win32汇编语言和C语言计算字符串的hash摘要值。...Hash值,其输出效果如下图所示;图片在理解了C语言版本的计算流程后,那么汇编语言版本的也应该很容易理解,如下是使用Win32汇编语言的实现过程,并在MASM上正常编译,汇编版字符串转换Hash值。

    32420

    VC下提前注入进程的一些方法2——远线程带参数

    在被注入进程的地址空间中写入“需要传递”的信息不存在什么问题,因为该信息是”死的“”数据“,我们写入什么内容就是什么内容,它就是二进制数据。但是写入函数执行体就存在一定的问题。...首先我们要考虑用什么语言来写这个函数?我是VC程序员,当然优先选择C++/C。可是使用这些语言往往会存在问题,因为我们不知道编译器对我们的代码可能做了什么手脚。...这是debug环境下增量编译(incremental linking)的一种表现。这儿说说增量编译,增量编译如同在“调用”和“函数执行逻辑”之间插入一个“地址转换层”。...因为Call指令分为两步,其中第二步是jmp到A函数逻辑的入口点,jmp的偏移是需要计算的。...因为RTC检查不会在Release版本中做,所以我们可以将远线程函数本地执行一次,在函数的入口处int 3一下,然后用windbg或ollydbg启动之,断在函数入口点,然后我们把其汇编东东扒拉下来就行了

    89030

    红队技巧之F#利用

    援引微软官方的解释: F # 是一种函数编程语言,可方便编写正确且可维护的代码。F # 编程主要涉及如何定义自动推断和通用化的类型和函数。...可能是翻译的缘故,听起来总是很拗口,国内解释如下: F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言,是函数编程语言(FP,Functional Programming),函数编程语言最重要的基础是...它是基于OCaml的,而OCaml是基于ML函 数程式语言。有时F# 和 OCaml 的程式是可以交互编译的。...至于为什么要学习F#,其实也是跟C#的道理是一样的,在某些特殊情况下,我们可以利用F#来达到我们的目的,原常景如下: This customer really locked down their environment...Microsoft.Build.Utilities.Core.dll 但这也违背常见的攻击规则: 我们可以在编译是使用--standalone选项或者vs进行静态编译来打包所需的文件,但会导致我们的文件过大

    1.5K30

    十七.Windows PE病毒概念、分类及感染方式详解

    程序编译后,某些VA地址(如变量Var 004010xxh)就已经以二进制代码的形式固定,这就是需要重定位的原因。 下图展示正常情况的ImageBase,其值为400000H。...从原理上来说,这是可以实现的,但是过程非常复杂,因为在引用函数节添加内容一定会导致其他结构的变化,需要做很多的修正工作,这可能会导致原有功能被破坏。...关键点:需要使用的API函数,但无引入函数节支撑 shellcode类似:需要使用API函数自获取技术来确定注入远程系统的位置 ① 如何获取API函数地址呢?...一种方法是采用硬编码(兼容性差),另一种方法通过Kernel模块中的相应结构和特征定位 其次,通过Kernel32.dll的引出目录表结构定位具体函数的函数地址 ③ 接着,分享获取Kernel32模块基地址的典型方法...搜索目标进行感染算法如下图所示: (4) 文件感染 感染的关键是病毒代码能够得到运行,常用方法包括: 选择合适的位置放入病毒代码(已有节、新增节) 将控制权交给病毒代码,如修改程序入口点AddressofEntryPoint

    4.9K11

    Hook技术解析

    不同的是,本文要探讨的HOOK并非属于程序原有的逻辑,而是在程序已经编译成可执行文件甚至已经在运行中的时候,如何劫持和修改程序的流程。...大部分情况下,我们习惯于在函数入口处执行HOOK,但这并不是绝对的,还需要具体问题具体分析。...甚至有可能需要在函数中途某个地方介入,这个时候就需要更进一步的对函数的反编译指令进行分析,确定HOOK的点位和处理逻辑。...如果想通过HOOK IDT中的函数来搞事情的话,可能需要同时处理多个表。 ?...而接收消息的目标,是驱动程序创建的设备Device。注意,这个设备不一定是物理设备,也可能完全不存在的虚拟设备,驱动程序可以任意创建一个不存在的设备。

    3K10

    黑客用这项技术攻击你的电脑!

    不同的是,本文要探讨的HOOK并非属于程序原有的逻辑,而是在程序已经编译成可执行文件甚至已经在运行中的时候,如何劫持和修改程序的流程。...大部分情况下,我们习惯于在函数入口处执行HOOK,但这并不是绝对的,还需要具体问题具体分析。...甚至有可能需要在函数中途某个地方介入,这个时候就需要更进一步的对函数的反编译指令进行分析,确定HOOK的点位和处理逻辑。...如果想通过HOOK IDT中的函数来搞事情的话,可能需要同时处理多个表。 ?...而接收消息的目标,是驱动程序创建的设备Device。注意,这个设备不一定是物理设备,也可能完全不存在的虚拟设备,驱动程序可以任意创建一个不存在的设备。

    62530

    Windbg调试----Windbg入门

    Windbg同时也分32位和64位版本,有网友建议是使用32位Windbg调试32位程序,64位Windbg调试64位程序。...模式编译出来的程序默认是不带PDB相关信息的,而Debug模式则有。...熟悉Windows函数栈的同学应该比较清楚,ChildBEP在32位程序中表示当前调用栈的栈底指针,并且指向的内存处保存的是上一个栈帧的栈底位置。...源码调试 习惯于VS调试的同学,可能会觉得Windbg命令调试难记难用(事实上,当你熟悉了之后可能会改变看法)。虽然没有VS的强大的源码调试功能,其实Windbg也提供源码调试的功能。...现在我将测试源码拷贝到C:\source目录,然后在用Windbg 程序后,设置断点到测试程序的main函数入口处,然后继续执行程序: 0:000> bp testforme!

    2.6K32

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

    存在的疑惑: 动态链接库到底如何来使用?...函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。...Windows 使得某些特性只能为 DLL 所用。 依赖项 当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。...因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该程序可能无法运行: 依赖 DLL 升级到新版本。 修复了依赖 DLL。...入口点 在创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。

    1K70
    领券