我希望能够通过查看 PE 标头找出出现在入口点的代码的来源。
比如这段代码就是我的程序的起始代码(401000h)
00401000 >/$ 58 POP EAX ; kernel32.76E93677
00401001 |. 2D 77360100 SUB EAX,13677
00401006 |. BB 4A184000 MOV EBX,<JMP.&kernel32.VirtualProtect>
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码是从哪里来的。如何在不手动扫描我的文件的情况下找到它?(为了完成这个例子,这里有一个来自同一个文件的 hexdump,代码现在位于 200h)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000200 58 2D 77 36 01 00 BB 4A 18 40 00
Run Code Online (Sandbox Code Playgroud)
如何从虚拟入口点 (401000h) 到达原始入口点 (200h)?我当然尝试自己解决。但我错过了一些东西。一开始我是这么想的:
.text[ Entrypoint (1000h) - VirtualOffset (1000d) ] = 原始入口点,因为文件对齐 = 200,原始入口点位于我的 .text 部分的最开始,我想我可以将它用于所有可执行文件。
解决了,我在计算原始入口点时犯了愚蠢的错误
.text[ 入口点 - 虚拟偏移量 ] + 文件对齐 …
我也第一次尝试构建一个简单的 --onefile exe,其中包含数据文件,但 Pyinstaller 在构建 .exe 时似乎没有找到它们。--onedir 构建似乎工作正常。
我此时也在使用 --debug 开关。我能够运行 onefile 可执行文件,并且可以看到它似乎开始工作。该程序可以正常找到 (sys._MEIPASS) 临时目录(按照指示打印所需的目录名称),但在从临时目录查找第一个数据文件时报告“没有此类文件或目录”错误。我在 .exe 上使用 archiveviewer.py 并没有在那里找到所需的数据文件 - 这似乎是问题所在,但我不明白为什么。构建的数据文件位于规范文件描述的目录中。我的完整规格文件是
# -*- mode: python -*-
a = Analysis(['develop6.py'],
pathex=['C:\\PYINST20'],
hiddenimports=[],
hookspath=None)
a.datas += [ ('conlist.txt', 'C:\\pyinst20\\conlist.txt', 'DATA'), ('imageblank.gif', 'C:\\pyinst20\\imageblank.gif', 'DATA')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'develop6.exe'),
debug=True,
strip=None,
upx=True,
console=True )
Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法更改 VS2012 在编译我的应用程序时生成的默认图标。对于那些想知道的人,我正在尝试更改 .exe 程序的图标,而不是窗口左上角和开始菜单上的窗口图标。我已经知道该怎么做了。我一直在谷歌搜索这个,它总是显示如何更改窗口图标,而不是实际文件的图标。提前致谢!!!
编辑:这就是我想做的...
我想换这个...

有了这个...
]
谢谢,希望这能澄清。
在 Python 脚本中,我尝试执行以下事件序列:
这是我到目前为止所拥有的:
subprocess.popen(['cmd','/c',r'programThatRuns.exe'])
subprocess.wait() # ? subprocess.check_call()? kill?
subprocess.popen(['cmd','/c',r'otherProgramThatRuns.exe'])
Run Code Online (Sandbox Code Playgroud)
所以我想我真的被困在第二行了
我只想将我的脚本制作为应用程序。双击运行而不是在终端中运行。我以前用 automator 完成过,但现在,在 el capitalan 上它不起作用。它只给出错误而没有解释。
当我尝试使用 automator 时,出现此错误:
"The action “Run Shell Script” encountered an error."
Run Code Online (Sandbox Code Playgroud)
我也尝试了下面的技巧,但我仍然无法做到这一点。
#!/usr/bin/env python
chmod +x script.py
Run Code Online (Sandbox Code Playgroud)
解决了:
经过这两个步骤。我将“打开方式”更改为仅此文件的终端并更改了
#!/usr/bin/env python,它可以工作。但是如果没有下面的两个步骤,它就不起作用,您需要按照所有步骤进行操作。添加
#!/usr/local/bin/python在代码的开头。然后chmod +x myscript.py在终端运行 。之后,将打开的应用程序更改为终端。它对我有用。
我想抑制运行可执行文件的函数产生的所有终端输出。
我试图通过使用每次调用函数时临时重新定义 stdout 和 stderr 的上下文管理器来抑制 Python 函数的输出。这会抑制print函数调用产生的终端输出,但当函数调用产生终端输出的可执行文件时,它似乎不起作用。
那么,如何抑制 Python 函数调用的可执行文件的输出呢?
我的代码如下。我已经包含了一个示例函数,该函数调用ls试图说明我想要抑制的终端输出类型(尽管我正在处理的函数是不同的)。
#!/usr/bin/env python
import os
import subprocess
import sys
def main():
print("hello")
with silence():
print("there")
print("world")
with silence():
engage_command(command = "ls")
class silence(object):
def __init__(
self,
stdout = None,
stderr = None
):
if stdout == None and stderr == None:
devnull = open(os.devnull, "w")
stdout = devnull
stderr = devnull
self._stdout = stdout or sys.stdout
self._stderr = stderr or sys.stderr
def __enter__(
self
): …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为a.py的 python 脚本,如下所示:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author : Bhishan Poudel
# Date : Jul 13, 2016
# Imports
# Script
print("hello")
Run Code Online (Sandbox Code Playgroud)
我可以通过两种方式运行这个脚本:
使用 python 解释器:
python3 a.py
Run Code Online (Sandbox Code Playgroud)
更改权限
chmod a+x a.py; ./a.py
Run Code Online (Sandbox Code Playgroud)
问题
如何在不一直使用chmod a+x script_name的情况下运行任何新的或旧的 python 脚本。
我对我的计算机具有 root 访问权限和用户访问权限。
基本上我想要所有 .py 文件的可执行权限,我们该怎么做?
我尝试了不同的shebangs,例如:
#!/usr/bin/python3
#!/usr/bin/env python3
#!/usr/local/bin/python3
#!/usr/local/bin/env python3
Run Code Online (Sandbox Code Playgroud)
python 解释器也在 $PATH 中。echo $PATH 的输出如下:
/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/opt/local/bin:/Users/poudel/phosim:/Users/poudel/Applications:/usr/local/octave/3.8.0/bin:/Users/poudel/Applications/Geany.app/Contents/MacOS/:/opt/local/bin:/Users/poudel/phosim:/Users/poudel/Applications:/usr/local/octave/3.8.0/bin:/Applications/Geany.app/Contents/MacOS/:/opt/local/bin:/Users/poudel/phosim:/Users/poudel/Applications:/usr/local/octave/3.8.0/bin:/Applications/Geany.app/Contents/MacOS/
Run Code Online (Sandbox Code Playgroud)
此外, ls /usr/bin/py* 具有:
/usr/bin/pydoc* /usr/bin/python2.5@ /usr/bin/pythonw*
/usr/bin/pydoc2.5@ /usr/bin/python2.5-config@ /usr/bin/pythonw2.5@
/usr/bin/pydoc2.6@ /usr/bin/python2.6@ /usr/bin/pythonw2.6@ …Run Code Online (Sandbox Code Playgroud) 在这篇文章https://www.geeksforgeeks.org/inline-functions-cpp/ 中,它指出内联的缺点是:
3) 太多的内联也会降低你的指令缓存命中率,从而降低从缓存内存到主内存的指令提取速度。
内联如何影响指令缓存命中率?
6) 内联函数可能会导致抖动,因为内联可能会增加二进制可执行文件的大小。内存抖动会导致计算机性能下降。
内联如何增加二进制可执行文件的大小?仅仅是因为它增加了代码库长度吗?此外,我不清楚为什么拥有更大的二进制可执行文件会导致抖动,因为两者似乎没有联系。
情况:我的 Python 脚本有一行代码将自身复制到另一个目录
shutil.copyfile(os.path.abspath(__file__), newPath)
Run Code Online (Sandbox Code Playgroud)
问题:脚本然后被编译成一个 EXE 并运行。给出的错误如下:
FileNotFoundError: No such file or Directory: "C:\Path\To\EXE\script.py"
Run Code Online (Sandbox Code Playgroud)
如您所见,EXE 正在寻找.py自己的版本(即未编译版本)
问题:是否还有另一个 Python 命令仍然可以让可执行文件找到自己而不是自己的.py版本?
附加信息:我将尝试仅替换.py为.exe并查看它是否有效——如果我更改可执行文件的名称,程序就会失败。
C:\ > script.exe
#Works as expected
C:\ > ren script.exe program.exe
C:\ > program.exe
FileNotFoundError: No such file or directory: "C:\script.py"
Run Code Online (Sandbox Code Playgroud) 我想了解可执行文件的工作原理。我希望详细了解一个非常具体的示例将使我能够做到这一点。我的最终目标(可能过于雄心勃勃)是获取一个 hello-world .exe 文件(使用 C 编译器编译并链接)并详细了解它是如何加载到内存中并由 x86 处理器执行的。如果我成功了,我想写一篇文章和/或制作关于它的视频,因为我还没有在互联网上找到这样的东西。
我想问的具体问题用粗体标出。当然,非常欢迎任何进一步的建议和来源做类似的事情。非常感谢您的帮助!
此答案概述了 C 代码在作为程序进入物理内存之前所经历的过程。我还不确定我有多想研究 C 代码是如何编译的。有没有办法在汇编之前查看 C 编译器生成的汇编代码?我可能会认为了解加载和链接过程是值得的。与此同时,我需要了解的最重要的部分是
我对 PA 格式有一个非常基本的了解(这种理解将在“到目前为止我学到的东西”一节中概述)并且我认为那里提供的资料应该足够了,我只需要再研究一下,直到我足够了解基本的 Hello-World 程序。当然,非常欢迎有关此主题的更多来源。
对于 x86 来说,将字节码转换为汇编代码(反汇编)似乎相当困难。尽管如此,我很想了解更多关于它的信息。您将如何反汇编一个短字节代码段?
我仍在寻找一种查看进程内存(分配给它的虚拟内存)内容的方法。我已经研究过 windows-kernel32.dll 函数,例如ReadProcessMemory但还不能让它工作。我也很奇怪似乎没有(免费)工具可用于此目的。再加上对加载的理解,我也许就能理解进程是如何从 RAM 运行的。此外,我正在寻找允许查看整个进程虚拟内存内容的汇编程序员的调试工具。我目前搜索的起点是这个问题。您对我如何查看和理解从 RAM 加载和进程执行有进一步的建议吗?
这个 StackOverflow 问题的其余部分详细描述了我到目前为止所学到的知识并提供了各种来源。它旨在可复制并帮助任何试图理解这一点的人。但是,我对目前看到的示例仍然有一些疑问。
在 Windows 中,可执行文件遵循PA 格式。在官方文件和这篇文章给出的格式的一个很好的概述。该格式描述了 .exe 文件中各个字节的含义。开头是我不会担心的 DOS 程序(出于遗留原因包括在内)。然后是一堆标头,它们提供有关可执行文件的信息。实际的文件内容被分成具有名称的部分,例如“.rdata”。在文件头之后,还有段头,它告诉您文件的哪些部分是哪个段以及每个段的作用(例如,如果它包含可执行代码)。
可以使用诸如 dumpbin(用于查看二进制文件的微软工具)之类的工具来解析标题和部分。为了与 dumpbin 输出进行比较,可以使用十六进制编辑器甚至使用 Powershell(命令Format-Hex -Path <Path …
executable ×10
python ×6
windows ×3
pyinstaller ×2
assembly ×1
bash ×1
c++ ×1
caching ×1
chmod ×1
console ×1
disassembly ×1
double-click ×1
exe ×1
file ×1
icons ×1
inline ×1
macos ×1
memory ×1
path ×1
popen ×1
pyaudio ×1
python-3.x ×1
shell ×1
silent ×1
subprocess ×1