应用程序实现方法的猜测

OpenVox 8FXO板卡驱动安装记录 OpenVox A800P和A1200P的板卡驱动安装及问题解决方法 阅读详情

日常生活和工作中,我们总会接触到各种应用程序,这些应用程序往往给我们带来的很大的便利。也许有的人对于如何实现这个应用程序的方法非常好奇,但是要分析具体的实现方法,大家可能会受到一些夸大言论的误导,导致认为要分析出结果有相当大的困难。

实际上,详细的分析的确是非常困难的,需要和逆向工程紧密联系。但是大多数情况下我们对一个应用程序的实现方法的关注可能更多在于这个应用程序是如何对操作系统进行调用的,理解了一些关键的调用以后,就能够对这个应用程序的实现方法有比较好的认识了。

在月初的时候,我曾经发布了一个增强型重命名工具:RenamePlus。这个工具的目的就是支持将任意文件、文件夹在正常文件名和非正常文件名之间进行相互转换,例如:

由于某种特殊原因,导致C:盘下出现了一个叫做 NUL 的文件夹,根据 Windows 命名规范,NUL 属于 Windows 保留关键字,因此是不应该出现这个叫做 NUL 的文件夹的,但是由于各种原因,这个限制并不是作用于文件系统层面上的(也就是文件系统是承认这个文件夹的存在的,但是Windows Shell并不承认)。因此导致了用户无法使用资源管理器打开这个目录,更别说删除这个目录了。

小知识:Windows保留文件名:Windows保留文件名指哪些被Windows API内部保留的,禁止用户创建的一些文件名,如 CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9以及文件名或者文件夹名以“.”结尾等等。因为这些文件名在久远的时代是作为设备使用的,由于各种原因,这些文件名不允许用户通过常规的方法在 Windows 里面进行使用。微软通过对 API 调用时候的检查以实现上述文件名限制。

以往碰到这种问题,大家一般会采用文件扇区修改级别的编辑工具或者利用KB320081所说的方法进行操作。问题在于文件扇区级别的编辑工具或者KB320081所说的方法在操作上都有很大的难道,特别是文件扇区级别的磁盘编辑工具,很容易导致正常数据的丢失。RenamePlus 出来以后,得益于我在 RenamePlus 里面使用的一种方法,或者技巧,成功的实现了将任意文件、文件夹在正常文件名和非正常文件名之间进行相互转换的功能。

回到正题,RenamePlus 是怎么实现这个功能的,今天我将通过此文揭开 RenamePlus 的实现之谜,同时向大家介绍如何猜测应用程序的实现方法。

  • 输入表

在 Windows 操作系统上运行的应用程序基本上都存在了一种叫做Portable Executable (PE)格式的文件格式类型。而PE格式的文件类型里面有一张表叫做输入表,输入表的用处就是告诉系统该应用程序需要哪些系统库函数或者第三方函数的支持。

关于 PE 格式的详细说明,请参考 《Microsoft Portable Executable and Common Object File Format Specification》一文。

根据输入表的信息,我们可以大致的知道该应用程序和哪些系统库函数或者第三方函数函数有关。前文说到,大多数情况下我们对一个应用程序的实现方法的关注可能更多在于这个应用程序是如何对操作系统进行调用的,而输入表就是帮助我们的一个利器。

要查看PE文件的输入表,需要一些PE相关的工具,例如:Microsoft 在 Visual Studio 里面带的 Depends 工具,或者其他的一些免费工具,如PE TOOLS等。这里使用PE TOOLS做演示。

用PE TOOLS打开RemovePlus.EXE,然后依次点击 Directory — Import Directory,就可以看到RenamePlus的输入表内容了,如图:

Snap1

在上图里面,我们看到了RenamePlus.EXE所依赖的系统DLL是Kernel32.DLL,依赖的系统函数有 MoveFileW、GetLastError等。完整的列表如下所示:

CloseHandle
CreateFileA
DeleteCriticalSection
EnterCriticalSection
ExitProcess
FlushFileBuffers
FormatMessageW
FreeEnvironmentStringsA
FreeEnvironmentStringsW
GetACP
GetCPInfo
GetCommandLineA
GetCommandLineW
GetConsoleCP
GetConsoleMode
GetConsoleOutputCP
GetCurrentProcess
GetCurrentProcessId
GetCurrentThreadId
GetEnvironmentStrings
GetEnvironmentStringsW
GetFileType
GetLastError
GetLocaleInfoA
GetModuleFileNameA
GetModuleFileNameW
GetModuleHandleA
GetOEMCP
GetProcAddress
GetProcessHeap
GetStartupInfoA
GetStdHandle
GetStringTypeA
GetStringTypeW
GetSystemTimeAsFileTime
GetTickCount
GetVersionExA
HeapAlloc
HeapCreate
HeapDestroy
HeapFree
HeapReAlloc
HeapSize
InitializeCriticalSection
InterlockedDecrement
InterlockedIncrement
IsDebuggerPresent
LCMapStringA
LCMapStringW
LeaveCriticalSection
LoadLibraryA
MoveFileW
MultiByteToWideChar
QueryPerformanceCounter
RtlUnwind
SetCurrentDirectoryW
SetFilePointer
SetHandleCount
SetLastError
SetStdHandle
SetUnhandledExceptionFilter
Sleep
TerminateProcess
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
UnhandledExceptionFilter
VirtualAlloc
VirtualFree
WideCharToMultiByte
WriteConsoleA
WriteConsoleW
WriteFile

如果对Windows API比较熟悉,会发现在上述API调用里面,大多数是一些很常见的、也就是基本上每个应用程序都会使用到的API,例如像 HeapAlloc、VirtualAlloc 等和系统内存管理相关的 API,ExitProcess等和进程相关的API,TlsAlloc 等和线程相关的API,基本上所有的应用程序都会涉及。除去这些 API 以外,RenamePlus 实现其功能的关键 API 是哪一个呢?

  • 实现方法

既然是叫做 RenamePlus,那么就和文件或者目录的改名操作相关,改名操作对于 Windows 来说,可以理解为就是一个目标的移动操作。搜索上述列表,果然有一个叫做 MoveFileW 的 API 函数和移动有点相关。查询 MSDN Library 以后,得知 MoveFile 的用处是:Moves an existing file or a directory, including its children。The MoveFile function will move (rename) either a file or a directory (including its children) either in the same directory or across directories. 根据微软的描述,MoveFile 是能够作为改名使用的。

没错,RenamePlus 功能实现的关键性API就是MoveFile。

我们继续,MoveFile 会接收2个参数:源路径和目标路径。没啥特殊的。我们现在知道了 RenamePlus 是利用 MoveFile 函数实现的改名操作,但是直接使用 MoveFile 函数对含有系统保留关键字的目录进行操作,必将导致失败。那么 RenamePlus 是怎么做到的呢?

仔细阅读MSDN会发现 Windows 对于文件命名的一个文档:Naming a File。阅读完这个文档,有一句话比较特殊:It is possible to create a path with the API that the shell UI cannot handle。这句话的大意就是说:API创建的路径,UI界面可能无法进行控制。联系前文说到的对于含有Windows保留字符的路径,UI界面的确是没法进行控制的,那么这句话的意思是不是说利用一些特殊的方法是可以进行控制的呢?

根据Windows命名文档的描述,可以使用 //?/ 前缀扩充Windows对于文件名长度的限制,实际上,RenamePlus 也正是利用了这个性质,利用 //?/ 前缀绕过了Windows API 对于保留文件名的检查,使得在下面的一些调用能够完成并最终有文件系统对在文件系统上进行实际的操作。

  • 小结
  1. 本文从一个KZTechs.COM的小工具  RenamePlus 入手,首先简单介绍了 RenamePlus 的用途。
  2. 由 RenamePlus 引出了 PE 格式和 PE 格式里面的输入表内容。
  3. 根据 PE 格式的输入表,我们知道了 RenamePlus 关键 API 是 MoveFile。
  4. 根据 MSDN 文档,我们知道了 MoveFile API的用法是移动文件和改名,并通过这份文档找到了一种绕过 Windows 对保留文件名进行检查的方法并最终实现 RenamePlus。
  5. 本文简单的介绍了一些猜测应用程序实现方法的知识,但是需要说明的是,上述介绍的方法局限于文件没有被加壳、应用程序开发者没有对关键API使用显式的调用方法,否则本文介绍的内容是不起左右的。
 
YooAsset可寻址模式避坑指南:从路径加载到Addressable的完整迁移方案 本文详细介绍了将Unity项目从传统路径加载迁移到YooAsset可寻址模式的完整方案。针对中大型项目在迁移过程中遇到的路径耦合、依赖管理、热更新等痛点,提供了从架构设计、环境配置、代码迁移到性能优化的实战指南,并分享了实际项目的改造案例与避坑经验,帮助团队高效完成资源管理系统的重构。 阅读详情

相关推荐

GEO优化内容营销策略:从规划到落地的全流程指南

GEO内容营销是通过地域化内容提升本地搜索排名、增加流量和转化率的策略。核心包括:构建本地用户画像,挖掘需求关键词;策划本地文化融合、案例研究等多样化内容;通过网站、社交媒体、本地KOL等渠道精准分发;优化本地关键词和视觉元素;监测数据并动态调整。案例显示,咖啡馆、工业企业和服装品牌通过本地化短视频、KOL合作及社群运营,显著提升了搜索排名、客流量和销售额。关键原则是内容本地化、精准分发、KOL合作、激励用户生成内容及数据驱动优化,实现高效本地市场渗透。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1331

文件/文件夹重命名工具RenamePlus

RenamePlus 是一个增强型的重命名工具,能够对常规重命名操作不能修改的文件名进行重命名操作,例如对文件名末尾是“.”或者文件名是 Windows 保留的文件名(如:CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9 等)的文件进行重

张彤的专栏 1143

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5518

【亲测免费】 推荐项目:115RenamePlus - 批量文件重命名利器

推荐项目:115RenamePlus - 批量文件重命名利器 是一个强大的批量文件重命名工具,专为需要对大量文件进行高效管理的用户设计。这款开源软件基于Python开发,功能强大且易于使用,对于开发者和日常用户来说都是一个值得尝试的选择。 技术分析 115RenamePlus 使用 Python 作为主要编程语言,这使得它具有良好的跨平台兼容性(支持Windows, macOS, Linux)。该...

gitblog_00012的博客 2085

深入剖析:NAND Flash与SD NAND(贴片式SD卡)存储扇区分配表架构差异与优化策略

本文深入探讨了NAND Flash与SD NAND(贴片式SD卡)在存储技术中的架构差异及其优化策略。NAND Flash作为非易失性存储器,依赖主控芯片进行坏块管理和磨损均衡,而SD NAND则通过内置控制器和标准文件系统(如FAT)简化了存储管理。两者在写入性能、容量扩展和可靠性方面各有优劣,NAND Flash需通过磨损均衡和写入合并优化性能,而SD NAND则通过高容量和高速传输提升效率。文章为嵌入式系统开发者和硬件工程师提供了关于如何根据需求选择并优化存储介质的参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1242

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 233

程序的实现过程(编译、链接、执行)

在ANSI C的任何一种实现中,存在两个不同的环境 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。 标准明确说明:这两种环境不必位于同一台机器上。 例如,交叉编译器就是在同一台机器上运行,但它所产生的可执行代码运行于不同类型的机器上。操作系统也是这样。 在翻译阶段,程序实现过程如下图: 翻译阶段的两个步骤:

观赏的博客 5402

Qi标准无线充学习笔记

负载调制主要通过接收端向后散射调制计数使得功率信号改变,两者通过线圈的电压和电流的变化量来传输信号。下面是要求稳定电流的变化量不得超出8ma,判断稳定的时间至少要在150us稳定电压的变化量不得超出110mv,判断稳定的时间至少要在150us高低电流变化量至少需要15mA,判断稳定的时间至少要在100us,主线圈电流采样的时间是在半桥转换的1/4周期刻测量的高低电压变化量至少需要200mV,判断稳定的时间至少要在100us。

m0_73991989的博客 1012

五种程序设计方法

1.        结构化程序设计 为了提高程序的可读性、可重用性等,逐渐出现了将程序开发中经常用到的相同的功能,比如数学函数运算、字符串操作等,独立出来编写成函数,然后按照相互关系或应用领域汇集在相同的文件里,这些文件构成了函数库。 函数库是一种对信息的封装

maikforever 的专栏 1万+

YOLO11改进 | 主干网络 | 添加Hyper-YOLO的MANet混合聚合网络

本文详细介绍了在YOLO11目标检测模型中替换C3k2模块为MANet的具体实现方法。文章首先讲解MANet模块的原理,然后分步骤指导如何在YOLO11中添加该模块,包括代码修改、文件配置和模型注册等关键环节。通过实验对比,改进后的YOLO11_MANet模型在保持8.8GFLOPs计算量的同时,参数数量达到3,820,272,网络层数增加到343层。文章还提供了完整的代码实现和网络结构图,并建议结合其他注意力机制或损失函数进一步提升检测效果。最后推荐了相关的深度学习专栏,包含更多YOLO系列改进方法。

kay_545 660

芒果YOLO11改进44:主干Backbone篇之MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换

MobileViT::结合最新 ICLR2022 顶会|轻量通用的MobileViT结构(一)Transformer,轻量级、通用且移动友好的视觉转换

包括YOLOv5、YOLOv7、YOLOv8等模型改进 373

用vbs来写sql注入等80端口的攻击脚本

  昨天晚上在机器里乱翻时无意打开一个vbs脚本,突然发现一个以前没有见过的对象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),虽然对象没有见过,但是意思很明显:发送http请求。本来以为是WMI script API的东东,但是没有找到创建对象的语句,这个脚本在Microsoft ACT里,Microsof

水族杰纶 4330

基于STM32L4XX的环境光传感器(VCNL4040M3OE)应用程序设计

• 集成模块:红外发射器(IRED)、环境光传感器(ALS)、接近传感器(PS)及信号调理IC。#define VCNL4040_I2C_ADDR (0x60 << 1) // 7位地址左移一位。// 组合成16位值。// I2C总线句柄。// 设置参数:ALS集成时间160ms,中断禁止,ALS功能开启。// 设置参数:PS工作频率80Hz,开红外二极管,PS功能开启。// 初始化I2C外设。• 输出类型:I2C总线(ALS/PS)// 2. 配置环境光传感器 (ALS) 并启动。

myron6688的博客 144

wpf xml 转化对象_c# – 将对象集合导出到XML文件

使用C#…我有一个小应用程序,它从一个类创建对象,并将它们添加到一个对象集合中,它会沿途显示一些UI内容,以显示集合中当前所选对象的某些值(使用WPF UI) .所以我想添加让用户将对象集合保存到文件的功能,这样他们就可以在下次运行应用程序时将其加载回来.我猜测XML是一种显而易见的方法,但我对如何做到这一点一无所知.那么,如何将对象集合导出或转储到xml文件中,然后,或许更重要的是,如何将该XM...

weixin_39567870的博客 331

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

nmap 猜测服务_性能调优–不要猜测

nmap 猜测服务 在我的性能调音职业中,我提供了衡量建议,而不是让我猜测的次数更多。 在查看了他们正在使用的整体式500,000 LOC旧版应用程序之后,在许多情况下,此建议的目标已放弃。 在帖子中,我们将分享一些简单的工具和概念,以设置初始测量,以便您可以使用基线来进行更细粒度的性能调整。 设定目标 几乎所有不平凡的应用程序都可以永远进行优化。 无论是坏事还是好事。 不良示例包括调...

danpu0978的博客 165

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

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

[转]WinForms GridListEditor - How to restore values in the auto filter row

http://dennisgaravsky.blogspot.hk/2016/05/winforms-gridlisteditor-how-to-restore.html using System; using DevExpress.XtraGrid; using DevExpress.ExpressApp; using DevExpress.XtraGrid.Views.Gri...

weixin_30823683的博客 75

错误猜测技术

错误猜测是一种技术,它没有用于识别错误的特定方法。它基于测试分析师的经验,测试人员使用该经验来猜测软件的有问题区域。它是一种黑盒测试技术,没有任何定义的结构来查找错误。

unber的博客 158

学习记录:python tkinter模块猜人名

#猜数字 || 代码复制粘贴即可使用 from tkinter import * import random #随机数字-开启 def start_execute(): global time num["text"] = random.randint(1,100) time = num.after(1,start_execute) #随机数字-关闭 def stop_execute(): num.after_cancel(time) #根窗口创建 root

人生苦短,何妨一试 435

用户猜测数列程序

//第一章程序 // u01.cpp : 定义控制台应用程序的入口点。 //time:2019/4/28 //初始化六个数列 //六个数列分别为 //fibonacci:1,1,2,3,5,8,13,21 元素为前两个元素之和 //lucas:1,3,4,7,11,18,29,47 //pell:1,2,5,12,29,70,169,408 //triangular:1,3,6,10,15,2...

max119xlx的博客 253

猜字谜小游戏编程

新建一个类 using System; namespace 猜数字小游戏 { public class Play { public void play() { Random r = new Random(); int i = r.Next(0, 100)...

weixin_34295316的博客 429

apm中gps的实现_简化APM:排除故障排除中的猜测

apm中gps的实现故障排除可能很困难 如今,Web应用程序非常复杂-尚无两种解决方法。 即使是相对简单的应用程序也可能会查询数据库,调用下游API并花费时间来处理数据。 这些组件中的每一个都会引入延迟,而基础架构可能会增加更多的复杂性。 让我们什至不上Kubernetes。 作为应用程序所有者,进行监视以不仅向您显示应用程序在做什么,而且还向您显示性能问题在哪里很重要。 存在应用程序性能管理...

danpob13624的博客 573

众包中真值推断的随机猜测和任务难度建模

Modeling Random Guessing and Task Difficulty for Truth Inference in Crowdsourcing作者1 摘要2 我们的方法2.1 答案建模2.2 表述2.3 推断3 实验4 结论参考文献 作者 Yi Yang Auckland University of Technology Auckland, New Zealand yi.yang@aut.ac.nz Quan Bai University of Tasmania Hobart, Aust

qq_28032693的博客 2004

猜测1-100的随机整数

1 问题编写一个Java应用程序,实现下列功能:程序随机分配给客户一个1-100之间的整数。用户输入自己的猜测。程序返回提示信息,提示信息分别是:“猜大了”、“猜小了”和“猜对了”。用户可根据提示信息再次输入猜测,直到提示信息是“猜对了”。2 方法用random引入1-100的随机整数输入猜测的值用else if来比较;大了就输出“猜大了”、小了就输出“猜小了”,相等就输出“猜对了”用while…...

算法与编程之美 1729

python数字游戏设计_如何在Pycharm应用程序中创建简单的Python数字猜测游戏

步骤1:概述这个猜谜游戏的创建是为了向用户展示一些使用python和pycharmIDE的基本编程技巧。本教程的基础将使用随机数生成器创建一个简单的猜谜游戏。最终结果可能导致某人了解如何生成随机数。例如,在以数字处理伤害的视频游戏中,通常使用随机数生成器生成这些数字,该生成器具有与我们生成的数字生成器类似的特定要求。随机数生成器可能更复杂,但是人们可以了解它如何工作的基本概念。第2步:安装Pyth...

weixin_36257615的博客 716

编写一个Java应用程序,实现下列功能: ●程序随机分配给客户一个1~100之间的整数。

编写一个Java应用程序,实现下列功能: ●程序随机分配给客户一个1~100之间的整数。 ●用户在输入对话框中输入自己的猜测。 ●程序返回提示信息,提示信息分别是:“猜大了”、“猜小了”和“猜对了”。 ●用户可根据提示信息再次输入猜测,直到提示信息是“猜对了”。 import javax.swing.JOptionPane; public class GuessNumber { public static void main (String args[ ]) { System.out.println(“给你

qq_43704340的博客 7558

远程方法猜测器(remote-method-guesser)常见问题解决方案

远程方法猜测器(remote-method-guesser)常见问题解决方案 1. 项目基础介绍 远程方法猜测器(remote-method-guesser,简称rmg)是一个Java RMI漏洞扫描器,用于识别和验证Java RMI端点上常见的 security 漏洞。该项目提供了一个工具,可以帮助安全研究人员和开发人员在Java RMI应用程序中发现潜在的安全风险。该项目主要使用Java编程语...

gitblog_00345的博客 975

Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测

功能二进制 crate 用于生成可执行文件,可以直接运行;库 crate 用于生成库文件,提供功能模块供其他 crate 使用。入口点:二进制 crate必须包含一个 main 函数作为程序的入口点;库 crate 不需要 main 函数。编译结果二进制 crate 编译后生成可执行文件;库 crate 编译后生成库文件。依赖关系:二进制 crate 可以依赖库 crate,但库 crate 不能直接运行,必须通过其他 crate 引用。

yoona333的博客 1248
上一篇: Secure Socket Tunneling Protocol
下一篇: 嵌入式系统中USB驱动程序设计
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值