小编kar*_*son的帖子

在编译时加密/混淆字符串文字

我想在编译时加密/编码一个字符串,以便原始字符串不会出现在已编译的可执行文件中.

我已经看过几个例子,但他们不能把字符串文字作为参数.请参阅以下示例:

template<char c> struct add_three {
    enum { value = c+3 };
};

template <char... Chars> struct EncryptCharsA {
    static const char value[sizeof...(Chars) + 1];
};

template<char... Chars>
char const EncryptCharsA<Chars...>::value[sizeof...(Chars) + 1] = {
    add_three<Chars>::value...
};

int main() {   
    std::cout << EncryptCharsA<'A','B','C'>::value << std::endl;
    // prints "DEF"
}
Run Code Online (Sandbox Code Playgroud)

我不想像它那样单独提供每个角色.我的目标是传递一个字符串文字,如下所示:

EncryptString<"String to encrypt">::value
Run Code Online (Sandbox Code Playgroud)

还有一些像这样的例子:

#define CRYPT8(str) { CRYPT8_(str "\0\0\0\0\0\0\0\0") }
#define CRYPT8_(str) (str)[0] + 1, (str)[1] + 2, (str)[2] + 3, (str)[3] + 4, (str)[4] + 5, (str)[5] + …
Run Code Online (Sandbox Code Playgroud)

c++ string templates metaprogramming compile-time

15
推荐指数
2
解决办法
6007
查看次数

Delphi XE6 DLL:不需要的导出:TMethodImplementationIntercept

在Delphi XE6中编译DLL时,它会自动TMethodImplementationIntercept从中导出函数System.Rtti.pas.我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令.

System.Rtti单元几乎无法避免,因为它几乎被delphi中的所有内容间接使用.

在XE6中构建DLL时,有没有办法避免导出此函数?

delphi dll rtti delphi-xe6

12
推荐指数
1
解决办法
2404
查看次数

LzmaLib:C中的压缩/解压缩缓冲区

我试图用LzmaLibLzmaCompress()LzmaDecompress()与缓冲,适应提供的例子在这里.

我正在使用~3MB缓冲区进行测试,并且压缩函数似乎工作正常(产生~1.2MB的压缩缓冲区),但是当我尝试解压缩时,它只提取~300字节并返回SZ_ERROR_DATA.

提取的少数字节是正确的,但我不知道为什么它会停在那里.

我的代码:

#include <stdio.h>
#include <stdlib.h>

#include "LzmaLib.h"

void compress(
    unsigned char **outBuf, size_t *dstLen,
    unsigned char *inBuf, size_t srcLen)
{
    unsigned propsSize = LZMA_PROPS_SIZE;
    *dstLen = srcLen + srcLen / 3 + 128;

    *outBuf = (unsigned char*)malloc(propsSize + *dstLen);

    int res = LzmaCompress(
        (unsigned char*)(*outBuf + LZMA_PROPS_SIZE), dstLen,
        inBuf, srcLen,
        *outBuf, &propsSize,
        -1, 0, -1, -1, -1, -1, -1);

    assert(res == SZ_OK);

    *dstLen = *dstLen + LZMA_PROPS_SIZE; …
Run Code Online (Sandbox Code Playgroud)

c compression 7zip lzma

8
推荐指数
1
解决办法
921
查看次数

奇怪的函数调用约定

我正在调试windbg中的x86 DLL,特别是一个假定具有以下签名的函数:

bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)
Run Code Online (Sandbox Code Playgroud)

该功能未导出.AFAIK __cdecl应该接收堆栈上的所有参数,并且调用者应该清除堆栈.

但事情并非如此.WinDBG的说,调用约定__cdecl,但第2个参数的传递ecxedx,就像一个__fastcall功能.函数本身也正在清理堆栈,我认为不应该由__cdecl函数完成.

我试图挂钩该功能但没有成功.我试图做一个绕行功能__cdecl,__fastcall并且都会导致崩溃.

有什么建议?

c++ hook windbg

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

从 x64 进程中获取另一个进程的 32 位 PEB

我有一个 64 位进程需要读取 Wow64 进程的 32 位 PEB。

我可以使用NtQueryInformationProcess,但我意识到 Wow64 进程有两个 PEB(64 位和 32 位)并NtQueryInformationProcess返回与调用者的位数(在我的情况下为64 位)相对应的 PEB,正如@Anders 在此解决方案中所评论的:

如何从外部进程获取进程环境块 (PEB)?

这就是我的场景:我试图从 x64 进程内部获取 Wow64 进程的 32 位 PEB。任何涉及改变该场景的建议都是无用的。我也知道这种解决方案不推荐用于生产,这不是我的意图。

有任何想法吗?

提前致谢。

c++ winapi

3
推荐指数
1
解决办法
4224
查看次数

在调试器中创建 std::string

我正在 WinDbg 中调试一个 x86 程序(用 C++/VS2012/静态链接编写),我有它的目标文件。我的兴趣点是这个功能:

static bool isValidToken(const std::string& token)
Run Code Online (Sandbox Code Playgroud)

此函数接收字符串令牌以验证客户端。

我希望能够在调试器中测试它,但要这样做,我必须创建一个std::string这样我才能执行命令:.call isValidToken(<addr_of_string>).

std::string在 WinDbg 中转储和操作相对容易,但是否可以创建它?

我能够劫持其他字符串并更改它以便我可以测试,但它显然有时会使程序崩溃。我正在尝试为该类找到一个静态构造函数,但这真的很难,因为它在很大程度上基于模板。

c++ windbg

3
推荐指数
1
解决办法
277
查看次数

GitLab runner只执行一个命令

我有以下配置.gitlab-ci.yml:

stages:
- build

build:
  stage: build
  script:
    - npm install -g gulp
    - npm install
    - gulp
Run Code Online (Sandbox Code Playgroud)

但是跑步者只执行第一个命令(npm install -g gulp).它运行第一个命令并报告成功,而不执行其他命令.

构建日志:

Running with gitlab-ci-multi-runner 1.6.1 (c52ad4f)
Using Shell executor...
Running on WINBUILDER...

Fetching changes...

HEAD is now at 2df18c5 Update .gitlab-ci.yml
From https://.../client
   2df18c5..b4efae8  master     -> origin/master
Checking out b4efae85 as master...

$ npm install -g gulp

C:\Users\Administrator\AppData\Roaming\npm\gulp -> C:\Users\Administrator\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js
C:\Users\Administrator\AppData\Roaming\npm
`-- gulp@3.9.1 

Build succeeded
Run Code Online (Sandbox Code Playgroud)

我在阶段中看到了几个使用多个命令的配置示例.我不明白为什么其他命令没有运行.

windows gitlab gitlab-ci gitlab-ci-runner

3
推荐指数
1
解决办法
898
查看次数

C++ lambda生命周期

在下面的代码中,运行时会发生什么?

while ( ([]()->bool { return something(); })() ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)
  1. lambda实例只创建一次,并在后续迭代中重用.
  2. 每次迭代都会创建一个新实例,只使用一次.
  3. 以上都不是(请解释).

最初对我来说很明显,它是在每次迭代中重新创建的,但我想知道编译器是否进行了某种优化.

c++ lambda

3
推荐指数
1
解决办法
92
查看次数

使用 PowerShell 将整数作为二进制写入文件

我正在尝试使用 PowerShell 将无符号整数(其 4 字节 DWORD 二进制表示形式)写入文件,但我尝试过的所有替代方案都只写入文本。

假设我有这个号码:

$number = [Int] 255

文件内容应该是FF000000(二进制),而不是255(文本)。

我不是 PowerShell 专家,因此非常感谢您的帮助。

powershell binaryfiles

2
推荐指数
1
解决办法
3663
查看次数

使用MySQL/MariaDB数据库创建Docker容器

我打算将我的应用程序堆栈迁移到Docker.让我来描述我目前使用的服务:

  • HAProxy,用于在所有服务的连接(HTTP和原始TCP连接)上进行SSL终止,并将流量转发到下面的服务.
  • Nginx,提供静态文件,如更新和一些信息页面.
  • Node.js,运行主应用程序.
  • MySQL(MariaDB),所有应用程序使用和共享的数据库.

我的问题是关于数据库.

在这种情况下运行MariaDB的正确方法是什么?

  1. 在我的容器内安装并运行它以及其他服务?
  2. 在一个单独的容器中运行官方映像,并使用--linkDocker run命令选项将我的容器链接到它?

第一种选择有任何不利之处吗?

TeamSpeak docker容器使用了第二个选项,这就是让我自己质疑在我的情况下运行数据库的正确方法的原因,但我特别感觉更倾向于将所有服务打包在我自己的图像中.

mysql mariadb docker

0
推荐指数
1
解决办法
488
查看次数