我是新手拆解和逆向工程二进制文件,所以请原谅我这个问题是荒谬的还是不可能的.
过去当我尝试逆向工程macOS二进制文件时,分析用Objective-C编写的文件会产生很多有用的信息,因为通常所有的Objective-C类及其方法名都很容易检索,这使得它变得容易多了找出任何特定方法的作用.
我正在尝试分析用Swift编写的二进制文件(技术上是Swift和Objective-C的组合),现在大多数函数都没有符号.我可以像往常一样检索一些Objective-C方法,以及一些具有Swift风格的错位名称的函数,但几乎所有其他函数都没有符号.我知道很多都必须是Swift方法.
无论如何都要弄清楚这个二进制文件的Swift类是什么以及它们与Objective-C一样的相关方法?
使用像Hopper Disassembler这样的工具可以显示一些Swift类的名称(通常是符号_TtC4Something25SomethingElse),我可以得到它的实例变量名称及其偏移量的列表,但没有方法名称.
注意:有问题的二进制文件是x64 macOS二进制文件,而不是iOS二进制文件.
我正在使用 Qt 5 用 C++ 开发一个项目,它有一个包含大量 UI 元素的复杂窗口。此窗口是使用 Qt Designer 设计的,并从 UI 文件加载。
我发现 Qt 的典型模式是在其主要的包含类中编写窗口 UI 的所有逻辑;即他们文档中的“单一继承方法”。例如,您有一个名为 QMyWindow 的类和一个定义布局的相应 qmywindow.ui 文件,其中 QMyWindow 包含 UI 的所有逻辑,主要在利用自动连接的槽方法内部(即命名为 on_objectName_signalName 之类的方法)。对于没有太多复杂性的简单窗口,这很好。然而,对于大型、复杂的窗口,将所有内容放在一个类中的模式开始崩溃,因为文件变得太大且杂乱无章。
我的大而复杂的窗口的源文件现在已经超过 3000 行了。我已经将窗口的所有实际功能分解到其他类中,所以这 3000 行代码主要只是做 UI 的繁重工作。从本质上讲,所有的东西都可以放在窗口类的权限之下。实在是太多了。
使用其他语言和 GUI 工具包,我可以非常有效地将窗口分解为逻辑部分。例如,在 iOS 或 OS X 应用程序中,我可以在故事板文件中使用嵌入式控制器,允许我以逻辑方式分解多个控制器之间的逻辑,并且仍然可以对 UI 本身进行很好的 WYSIWYG 编辑。
但我不知道使用 Qt 做到这一点的好方法。我在 Qt Designer 中没有发现任何东西可以让您将单个 UI 文件分解为由多个类处理的多个部分。如果我自己编写用于创建和布置 UI 的代码,我当然可以这样做,但是 qmake 从设计器文件生成的结果代码会创建一个 ui 命名空间和一个 setupUI 函数,该函数在包含的窗口中创建所有内容。我不知道您如何分解并继续使用自动连接。
Qt 中有一些机制可以动态加载多个设计器文件,然后将它们嵌入到一个小部件中,但是如果我要使用它,我将 a) 显着增加我的代码的复杂性,并且 b) 失去了很好的 WYSIWYG 编辑,这我不想做。
这里有什么好的选择吗?我不想保留一个难以导航的 3000 多行文件,但我不知道如何分解它并仍然使用 Qt 的工具,尤其是 Qt Designer,它们的预期方式。
我的情况是我有一个QWidget派生类MyWidget,它将创建一个QThread派生类(WorkerThread)来在其run()方法中执行一些不间断的阻塞工作.结果是一个QObject派生类(DataClass)的堆分配实例,然后由MyWidget接收和处理.但是,MyWidget是一个暂时的小部件,当WorkerThread由于用户操作而仍在运行时可能会被删除.
这里有一些伪代码来说明这一点:
#include <QThread>
#include <QWidget>
class DataClass : public QObject {
Q_OBJECT
public:
// contains some complex data
};
class WorkerThread : public QThread {
Q_OBJECT
public:
virtual void run() {
DataClass *result = new DataClass;
doSomeReallyLongUninterruptibleWork(result);
emit workComplete(result);
}
signals:
void workComplete(DataClass *);
};
class MyWidget : public QWidget {
Q_OBJECT
public:
void doBlockingWork() {
WorkerThread *worker = new WorkerThread;
connect(worker, &WorkerThread::finished, worker, &WorkerThread::deleteLater);
connect(worker, &WorkerThread::workComplete, this, &MyWidget::processData);
worker->start();
}
public slots:
void processData(DataClass *result) {
// Do …Run Code Online (Sandbox Code Playgroud) 我想修改VS Code的缩进行为,这样如果我在输入这样的行后按Enter键:
variable = function(param1,
Run Code Online (Sandbox Code Playgroud)
它将缩进到左括号的级别,以便我可以轻松地格式化这样的代码:
variable = function(param1,
param2)
Run Code Online (Sandbox Code Playgroud)
我希望它适用于开放方括号和大括号:
variable = function([1, 2, 3, 4
5, 6, 7, 8],
param2,
{'a': 1, 'b': 2,
'c': 3, 'd': 4},
param4)
Run Code Online (Sandbox Code Playgroud)
我更喜欢它对我使用的几乎所有语言都有这种行为,尽管在C++或C#中工作时,花括号行为不是必需的(甚至可能是不可取的).
这与Sublime Text的indent_to_bracket设置非常相似.
有没有办法实现这个目标?如果没有设置,我愿意修补任何必要的东西.我也对可以做到这一点的扩展开放,或者甚至在必要时编写扩展,并且这样做是有道理的.
我正在开发一个项目,我希望最终在 GitHub 或 BitBucket 等网站上公开该项目。
然而,我的项目本地存储库目前只有一个master分支,其中只包含实验性提交,仅供我查看。这些提交包含诸如混乱的代码、不相关的文件、仅供我自己阅读的草率注释等内容。
项目的实验部分结束后,我的目的是清理所有内容:使我的代码变得漂亮且有组织,删除任何垃圾,并基本上使其处于准备共享的状态。但是,我不想拆分我的 git 存储库或删除我迄今为止建立的任何历史记录。
我可以通过哪些方法继续使用此 git 存储库并仅发布包含已清理代码的提交?基本上,最终会有一个我希望成为第一个公开提交的提交,在那之后,所有未来的提交也将是公开的。
我正在开发一个软件包,需要在所有用户帐户都可以访问的某个地方安装一个 dylib。我实际上不确定把它放在哪里最好。
通常我认为/usr/local/lib是正确的,但偶尔我们会遇到用户对该文件夹做奇怪的事情,包括更改其权限,以便只有一个用户可以访问其中的文件,从而破坏了该系统上其他用户帐户的软件。从技术上讲,macOS 不允许这种事情——/usr/local旨在成为用户可以随意使用的地方。
另一种解决方案可能是/Library/Frameworks或/Library/Application Support/<my app name>。这些文件夹肯定会更安全,因为用户不应该随意使用它们,也不应该修改他们的权限。然而,这两个地方都没有让我觉得动态库是正确的。/Library/Frameworks最接近,我想我遇到了其他将 dylib 放在那里的应用程序,但它显然是用于框架的。
那么放置它的正确位置在哪里?
通常,XInput 控制器仅使用与控制器的玩家编号相对应的索引来识别。有没有办法获取有关具有特定索引的控制器的更多信息,例如其供应商 ID、产品 ID 或设备名称?
更好的是唯一且一致地对应于该控制器的标识符,以便可以将其与所有其他 XInput 设备区分开来,无论其索引如何,包括具有相同型号(即相同产品和供应商 ID)的另一个控制器,类似于使用 DirectInput 可获得实例 GUID。
这可以使用 XInput 或其他 Microsoft API 来完成吗?如果需要的话,我也愿意使用未记录的函数。
考虑以下使用Qt容器类的C++代码QMap:
#include <QMap>
#include <iostream>
QMap<int, int> myMap;
int count() {
return myMap.size();
}
int main() {
myMap[0] = count();
std::cout << myMap[0] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据在执行myMap之前或之后是否创建了新条目count(),此代码的输出将分别为1或者0分别为.
这段代码的输出是否依赖于实现QMap?或者C++规范是否对count()将要执行的时间做出任何保证QMap::operator[]?或者结果是否未定义,这是最好避免的情况?
我问,因为我在一个正在进行的计划中有一个基本相同的情况.当我在Windows中编译程序并使用库存Qt 5.5.1 DLL运行它时,结果是0.但是,当我使用从源代码编译的另一组Qt 5.5.1 DLL运行它时,结果是1.这是一个非常令人困惑的错误,我花了一些时间来追踪,特别是因为我得到了不同的结果取决于我运行可执行文件的位置!
我希望我能理解同一个程序有两种不同的行为,以便我将来能够避免这样的错误.
在 Visual Studio Code 中,如果我更改窗口布局以包含多个窗格(例如两列),如果我关闭在该窗格中打开的最后一个文件,则整个窗格将关闭并更改窗口布局。这很烦人!我总是希望有两列,或者我设置的任何窗口布局。
有没有办法改变这种行为?
在处理具有以下签名的函数时:
bool getValue(int parameter, int *out)
Run Code Online (Sandbox Code Playgroud)
他们将结果写入由寻址的内存*out并返回一个指示函数是否成功的布尔值,我正在考虑使用以下模式按优先级顺序将这些函数中的几个链接在一起:
int result = 0;
bool success = getValue(param1, &result) || getValue(param2, &result) ||
getAnotherValue(param3, &result);
if (success) {
// do something with result
} else {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
我认为这将是一个更简洁、更漂亮的版本:
int result = 0;
bool success = getValue(param1, &result);
if (!success) {
success = getValue(param2, &result);
if (!success) {
success = getAnotherValue(param3, &result);
}
}
if (success) {
// do something with result
} else {
// handle error
} …Run Code Online (Sandbox Code Playgroud) 像这样声明和初始化类实例有什么区别:
MyClass var(param1, param2);
Run Code Online (Sandbox Code Playgroud)
...和这个?
MyClass var = MyClass(param1, param2);
Run Code Online (Sandbox Code Playgroud)
我隐约记得听说它们在某些时候是等效的,但现在我想知道后一种情况是否也可能调用类的赋值运算符、移动构造函数或复制构造函数,而不仅仅是显式使用的特定构造函数。
c++ ×5
qt ×3
constructor ×1
disassembly ×1
dylib ×1
git ×1
indentation ×1
initializer ×1
macos ×1
memory-leaks ×1
objective-c ×1
qt5 ×1
refactoring ×1
swift ×1
windows ×1
xinput ×1