小编use*_*275的帖子

没有绕道的API挂钩

介绍信息: Windows 7 64位.C++.64位应用程序和DLL.没有MS Detours挂钩.

问题:我一直在努力解决一个可以证明在Windows中挂钩的工作示例的问题.在32位Windows XP是唯一的操作系统的时候,似乎已经编写了大部分内容......我已经克服了理解的64位障碍并成功注入了DLL.这个知识之旅的下一步是挂钩.为了与主题的怀旧情绪保持一致,MS的Detours不支持64位(免费),我当然不会支付10,000美元.所以我在本教程中采用了传统方法.

这个啧啧很棒,但我在理解这个细分时遇到了一些麻烦:

void BeginRedirect(LPVOID newFunction)
{
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
    memcpy(JMP, tempJMP, SIZE);
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
                PAGE_EXECUTE_READWRITE, &oldProtect);
    memcpy(oldBytes, pOrigMBAddress, SIZE);
    memcpy(&JMP[1], &JMPSize, 4);
    memcpy(pOrigMBAddress, JMP, SIZE);
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
}
Run Code Online (Sandbox Code Playgroud)

特别是,我正在努力使用tempJMP字节和所有memcpy.我有一个记事本的InsertDate()函数的地址,我想劫持,但我不知道在哪里瞄准它...这是新函数的地址吗?或者它不是相对的?Idk,我只是在寻找一些指针.

c++ dll 64-bit hook

6
推荐指数
1
解决办法
5513
查看次数

在 Win 7 中从远程进程获取 PEB

规格:Windows 7 x64,Visual C++

目标:我正在尝试从示例程序(例如 calc.exe)中获取远程PEB。我已经找到了 proc ID,并且我已经打开了具有所有良好权限的进程句柄。我现在继续编写一个类来使用 PROCESS_BASIC_INFORMATION 从进程中检索 PEB 的位置。

问题:我在其他地方发现了几篇帖子,似乎表明NtQueryInformationProcess在 MS 上变成了垃圾。一篇文章提出了一种从 ntdll.dll 动态运行时链接 NtQueryInformationProcess 的方法。但是,我认为从长远来看,如果没有大量的错误处理,这将是不稳定的(MS 明天可能会删除 NtQueryInformationProcess)。

这个想法后来在这个线程中实现,然后 Mike2343 建议人们应该“使用其他方法”。

问题: 定位不涉及 NtQueryInformationProcess 的远程进程的 PEB 的另一种方法是什么?

感谢任何花时间看这个的人。

c++ dll visual-c++ windows-7 dll-injection

5
推荐指数
1
解决办法
2532
查看次数

QT:没有这样的插槽

问题是我每次从主窗口启动'设置'窗口时都会在Qt Creator中收到'No Such Slot'运行时错误.到目前为止,我发现Qt是非常反直觉的,这个插槽信号概念似乎只是通过简单传递变量或函数调用.基本上,我有一个带有设置选项的菜单,当点击它时,会打开一个设置窗口,需要从用户手中获取一个双精度并更新主窗口中的var.

SettingsWindow.h

class SettingsWindow : public QWidget
{
      Q_OBJECT
  public:
      SettingsWindow(QWidget *parent = 0);
  signals:
      void ValChanged(double newVal);
  public slots:
      void Accept();
  private:
      QLineEdit *le1;
};
Run Code Online (Sandbox Code Playgroud)

设置窗口有一个接受按钮,它调用Accept(),它发出ValChanged信号,newVal设置为le1中的用户输入为double.

SettingsWindow.cpp

void SettingsWindow::Accept(){
    emit ValChanged(le1->text().toDouble());
    this->close();
}
Run Code Online (Sandbox Code Playgroud)

该设置窗口由应用程序的主窗口调用:MainWindow

MainWindow.cpp

class MainWindow : public QMainWindow
{
      Q_OBJECT  
  public:
      MainWindow(QWidget *parent = 0);
  public slots:
      void SetVal(double x);
  private slots:
      void NewWindow();
  private:
      double theVal;
};
Run Code Online (Sandbox Code Playgroud)

这个主窗口有一个菜单,可以从中选择设置.这将创建一个新窗口,其中包含一个输入数字的字段.

MainWindow.cpp

void MainWindow::NewWindow()
{
    SettingsWindow *MySettings=new SettingsWindow(this);
    QObject::connect(MySettings, SIGNAL(ValChanged(double)), this, SLOT(SetVal(double)));
    MySettings->show();
    MySettings->raise();
}

void …
Run Code Online (Sandbox Code Playgroud)

user-interface qt signals-slots qt-creator

4
推荐指数
1
解决办法
1万
查看次数

CreateProcess和命令行参数

背景信息: Windows 7,Visual C++ 2010 Express

问题: CreateProcess()通过'无效的命令行参数'继续返回

说明:我正在编写一段使用Windows API的CreateProcess调用外部程序的代码.到目前为止,我已接到使用一个外部程序的电话:

if( !CreateProcess( "C:\\Temp\\convert.exe",
    t_str,        // Arguments
    ...
}
//where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering). 
Run Code Online (Sandbox Code Playgroud)

即使我将所有数据都推送到Windows字符串和指针中,我也可以完美地工作.所以我复制了CreateProcess()的所有修改,以便对另一个外部程序进行另一次调用:

 if( !CreateProcess( "C:\\Temp\\sift.exe",
     t_str2,        // Arguments
     ...
 }
 //where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`
Run Code Online (Sandbox Code Playgroud)

基本上,一些非常相似,但所有变量名称都已更改(因为我有两个调用运行串行).这就是问题所在; 这不会运行,而是打印出"无效的命令行参数:<C:\ img1.pgm".当然,这个命令在命令提示符下工作正常,但在我的代码中没有.

我将t_str2切换到其他一些不太复杂的东西(因为我知道sift.exe如何工作),我得到了相同的结果.当我只进行筛选而不是转换时,会发生同样的事情.

问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏.我可以提供进一步的代码,但它非常直接,并没有太多可能出错.

c++ windows createprocess command-line-arguments

4
推荐指数
1
解决办法
1万
查看次数