refactoring; GetOpenFileNameA; QFileDialog::getOpenFileName
This commit is contained in:
parent
2c08f1ba04
commit
56cb018a0f
6
.gitignore
vendored
6
.gitignore
vendored
@ -7,9 +7,15 @@
|
||||
*.ilk
|
||||
*.log
|
||||
|
||||
*.Debug
|
||||
*.Release
|
||||
*.stash
|
||||
|
||||
build/
|
||||
plugins_install/
|
||||
|
||||
.sconsign.dblite
|
||||
|
||||
peasoup_executable*/
|
||||
|
||||
/programs/Makefile*
|
32
README.md
32
README.md
@ -1,24 +1,36 @@
|
||||
# windows-binary-fuzzing
|
||||
|
||||
## API methods
|
||||
## DLL methods
|
||||
|
||||
- [ ] `GetOpenFileNameA`
|
||||
- [ ] `IFileOpenDialog`
|
||||
- [ ] `QFileDialog::getOpenFileName`
|
||||
- [x] `GetOpenFileNameA`
|
||||
- [x] `QFileDialog::getOpenFileName`
|
||||
- [ ] `QFileDialog::getOpenFileNames`
|
||||
- [ ] `QFileDialog::getOpenFileUrl`
|
||||
- [ ] `QFileDialog::getOpenFileUrls`
|
||||
- [ ] `QFileDialog::getOpenFileContent`
|
||||
- [ ] `wxFileDialog`
|
||||
- [ ] `IFileOpenDialog`
|
||||
|
||||
## Build commands (client)
|
||||
## Build scripts
|
||||
|
||||
```bash
|
||||
mkdir build
|
||||
cmake -DDynamoRIO_DIR=C:\Users\vboxuser\DynamoRIO-Windows\cmake ..
|
||||
cmake --build .
|
||||
# Client(s)
|
||||
clients/build_all.ps1
|
||||
|
||||
# Programs
|
||||
programs/build.bat
|
||||
```
|
||||
|
||||
## Execution commands (drrun)
|
||||
|
||||
e.g.
|
||||
### `GetOpenFileNameA.exe`
|
||||
|
||||
```bash
|
||||
drrun -c ..\..\clients\mov_to_nop\build\Debug\mov_to_nop.dll -c C:\Users\vboxuser\git\winafl\build64\bin\Release\winafl.dll -debug -target_offset 0x8530 -fuzz_iterations 1 -nargs 2 -target_module Twice.exe -- .\Twice.exe
|
||||
drrun -c ..\..\clients\CustomClient\build\Debug\CustomClient.dll -c C:\Users\vboxuser\git\winafl\build64\bin\Release\winafl.dll -debug -target_offset 0x8530 -fuzz_iterations 1 -nargs 2 -target_module .\GetOpenFileNameA.exe -- .\GetOpenFileNameA.exe
|
||||
```
|
||||
|
||||
### `\QT_getOpenFileName.exe`
|
||||
|
||||
```bash
|
||||
drrun -c ..\..\clients\CustomClient\build\Debug\CustomClient.dll -c C:\Users\vboxuser\git\winafl\build64\bin\Release\winafl.dll -debug -target_offset 0x1320 -fuzz_iterations 1 -nargs 2 -target_module .\QT_getOpenFileName.exe -- .\QT_getOpenFileName.exe
|
||||
```
|
7
clients/CustomClient/CMakeLists.txt
Normal file
7
clients/CustomClient/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.7)
|
||||
project(CustomClient)
|
||||
|
||||
find_package(DynamoRIO REQUIRED)
|
||||
add_library(CustomClient SHARED client.c)
|
||||
target_link_libraries(CustomClient drwrap drmgr)
|
||||
configure_DynamoRIO_client(CustomClient)
|
@ -13,16 +13,16 @@ char *CUSTOM_FILE = "C:\\Users\\vboxuser\\Downloads\\spoofed_number.txt";
|
||||
|
||||
static app_pc pc_GetOpenFileNameA = NULL;
|
||||
|
||||
static void intercept_GetOpenFileNameA() {
|
||||
// dr_printf("intercept_GetOpenFileNameA(...)\n");
|
||||
static app_pc pc_QString_QString = NULL;
|
||||
static app_pc pc_QFileDialog_getOpenFileName = NULL;
|
||||
|
||||
static void intercept_GetOpenFileNameA() {
|
||||
void *drcontext = dr_get_current_drcontext();
|
||||
|
||||
dr_mcontext_t mcontext = { sizeof(mcontext), DR_MC_ALL };
|
||||
dr_get_mcontext(drcontext, &mcontext);
|
||||
|
||||
OPENFILENAME *ofn = (OPENFILENAME *)mcontext.rcx;
|
||||
// dr_printf("OPENFILENAME at %p\n", ofn);
|
||||
|
||||
for (int i = 0; i < strlen(CUSTOM_FILE); i++) ofn->lpstrFile[i] = CUSTOM_FILE[i];
|
||||
ofn->lpstrFile[strlen(CUSTOM_FILE)] = 0;
|
||||
@ -32,8 +32,19 @@ static void intercept_GetOpenFileNameA() {
|
||||
dr_set_mcontext(drcontext, &mcontext);
|
||||
}
|
||||
|
||||
static void intercept_QFileDialog_getOpenFileName() {
|
||||
void *drcontext = dr_get_current_drcontext();
|
||||
|
||||
dr_mcontext_t mcontext = { sizeof(mcontext), DR_MC_ALL };
|
||||
dr_get_mcontext(drcontext, &mcontext);
|
||||
|
||||
// make use of QString constructor to construct return value
|
||||
void *QString = (void *)mcontext.rcx;
|
||||
void(*QString_QString)(void *, char *) = (void(*)(void *, char *))pc_QString_QString;
|
||||
QString_QString(QString, CUSTOM_FILE);
|
||||
}
|
||||
|
||||
static void event_exit(void) {
|
||||
// dr_printf("Exiting custom DynamoRIO client...\n");
|
||||
}
|
||||
|
||||
static void event_module_load(void *drcontext, const module_data_t *mod, bool loaded) {
|
||||
@ -43,6 +54,16 @@ static void event_module_load(void *drcontext, const module_data_t *mod, bool lo
|
||||
lowerpath[i] = tolower(lowerpath[i]);
|
||||
}
|
||||
|
||||
if (strstr(lowerpath, "qt6core.dll")) {
|
||||
pc_QString_QString = (app_pc)dr_get_proc_address(mod->handle, "??0QString@@QEAA@PEBD@Z");
|
||||
// if (pc_QString_QString) dr_printf("Found QString::QString at %p\n", pc_QString_QString);
|
||||
}
|
||||
|
||||
if (strstr(lowerpath, "qt6widgets.dll")) {
|
||||
pc_QFileDialog_getOpenFileName = (app_pc)dr_get_proc_address(mod->handle, "?getOpenFileName@QFileDialog@@SA?AVQString@@PEAVQWidget@@AEBV2@11PEAV2@V?$QFlags@W4Option@QFileDialog@@@@@Z");
|
||||
// if (pc_QFileDialog_getOpenFileName) dr_printf("Found QFileDialog::getOpenFileName at %p\n", pc_QFileDialog_getOpenFileName);
|
||||
}
|
||||
|
||||
if (strstr(lowerpath, "comdlg32.dll")) {
|
||||
pc_GetOpenFileNameA = (app_pc)dr_get_proc_address(mod->handle, "GetOpenFileNameA");
|
||||
// if (pc_GetOpenFileNameA) dr_printf("Found GetOpenFileNameA at %p\n", pc_GetOpenFileNameA);
|
||||
@ -67,14 +88,22 @@ static dr_emit_flags_t event_basic_block(void *drcontext, void *tag, instrlist_t
|
||||
}
|
||||
}
|
||||
|
||||
if (!target) {
|
||||
instr = next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (target == pc_GetOpenFileNameA) {
|
||||
// dr_printf("Call to GetOpenFileNameA detected at %p\n", instr_get_app_pc(instr));
|
||||
|
||||
dr_insert_clean_call(drcontext, bb, instr, (void *)intercept_GetOpenFileNameA, false, 0);
|
||||
|
||||
instrlist_remove(bb, instr);
|
||||
instr_destroy(drcontext, instr);
|
||||
instr = next;
|
||||
}
|
||||
else if (target == pc_QFileDialog_getOpenFileName) {
|
||||
// dr_printf("Call to QFileDialog::getOpenFileName detected at %p\n", instr_get_app_pc(instr));
|
||||
dr_insert_clean_call(drcontext, bb, instr, (void *)intercept_QFileDialog_getOpenFileName, false, 0);
|
||||
instrlist_remove(bb, instr);
|
||||
instr_destroy(drcontext, instr);
|
||||
}
|
||||
|
||||
instr = next;
|
||||
@ -84,11 +113,9 @@ static dr_emit_flags_t event_basic_block(void *drcontext, void *tag, instrlist_t
|
||||
}
|
||||
|
||||
DR_EXPORT void dr_client_main(client_id_t id, int argc, const char *argv[]) {
|
||||
// dr_printf("Loading custom DynamoRIO client...\n");
|
||||
dr_set_client_name("Custom DynamoRIO client", "https://gitea.cloud.lehnert.dev/ludwig/windows-binary-fuzzing");
|
||||
dr_register_exit_event(event_exit);
|
||||
dr_register_module_load_event(event_module_load);
|
||||
dr_register_bb_event(event_basic_block);
|
||||
// dr_printf("Custom DynamoRIO client loaded.\n");
|
||||
}
|
||||
|
@ -1,7 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.7)
|
||||
project(GetOpenFileNameA)
|
||||
|
||||
find_package(DynamoRIO REQUIRED)
|
||||
add_library(GetOpenFileNameA SHARED main.c)
|
||||
target_link_libraries(GetOpenFileNameA drwrap drmgr)
|
||||
configure_DynamoRIO_client(GetOpenFileNameA)
|
6
programs/build.bat
Normal file
6
programs/build.bat
Normal file
@ -0,0 +1,6 @@
|
||||
cl /Fe:compiled\Foo.exe source\Foo.c /Zi /Od /link /MACHINE:X64
|
||||
|
||||
cl /Fe:compiled\GetOpenFileNameA.exe comdlg32.lib source\GetOpenFileNameA.c /Zi /Od /link /MACHINE:X64
|
||||
|
||||
qmake source\QT_getOpenFileName.pro
|
||||
nmake
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
programs/compiled/QT_getOpenFileName.exe
Normal file
BIN
programs/compiled/QT_getOpenFileName.exe
Normal file
Binary file not shown.
@ -1,22 +0,0 @@
|
||||
#include <windows.h>
|
||||
#include <commdlg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
char file[MAX_PATH] = {0};
|
||||
|
||||
OPENFILENAME ofn = {
|
||||
.lStructSize = sizeof(ofn),
|
||||
.lpstrFilter = "All Files\0*.*\0",
|
||||
.lpstrFile = file,
|
||||
.nMaxFile = MAX_PATH,
|
||||
.lpstrTitle = "Select File",
|
||||
.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST
|
||||
};
|
||||
|
||||
int res = GetOpenFileName(&ofn);
|
||||
|
||||
if (res) printf("%s\n", file);
|
||||
|
||||
return res != 0;
|
||||
}
|
32
programs/source/QT_getOpenFileName.cpp
Normal file
32
programs/source/QT_getOpenFileName.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include <QApplication>
|
||||
#include <QFileDialog>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QString fileName = QFileDialog::getOpenFileName(nullptr, "Select File", "", "All Files (*.*)");
|
||||
if (fileName.isEmpty()) return 0;
|
||||
|
||||
QFile file(fileName);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
std::cerr << "Failed to open file" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
QTextStream in(&file);
|
||||
QString line = in.readLine();
|
||||
bool ok;
|
||||
int number = line.toInt(&ok);
|
||||
|
||||
if (!ok) {
|
||||
std::cerr << "Failed to read integer from file" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << number * 2 << std::endl;
|
||||
return 0;
|
||||
}
|
5
programs/source/QT_getOpenFileName.pro
Normal file
5
programs/source/QT_getOpenFileName.pro
Normal file
@ -0,0 +1,5 @@
|
||||
QT += core widgets
|
||||
CONFIG += console
|
||||
SOURCES += QT_getOpenFileName.cpp
|
||||
TARGET = QT_getOpenFileName
|
||||
DESTDIR = compiled
|
Loading…
x
Reference in New Issue
Block a user