吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 742|回复: 10
收起左侧

[其他求助] 如何VM常量?

[复制链接]
朱朱你堕落了 发表于 2024-1-28 13:40
200吾爱币
如果是函数,那比较容易,问,如何VM下面szBuf和dwTest这种全局常量和全局变量,因为不在函数内,不知道如何弄。
求助大佬解惑,请以VMP来VM就行。

[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include <Windows.h>

CHAR szBuf[] = "问如何vm这个szBuf和dwTest";
DWORD dwTest = 0;

int _tmain(int argc, _TCHAR* argv[])
{
        printf("szBuf = %s\n", szBuf);
        dwTest = 0x12345678;
        printf("dwTest = %d\n", dwTest);
        
        system("pause");
        return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 2024-1-28 15:34
记得vmp的sdk有个字符串加密解密的函数
花边下丶情未央 发表于 2024-1-28 16:04
StringXor就可以了

点评

你想异或加密啊,先加密出来,用到的时候再解密,是一种方法,不过如果有最简单的vm方法,就不用先加密一次,再解密一次了。还是想用vm一劳永逸。  详情 回复 发表于 2024-1-28 16:18
 楼主| 朱朱你堕落了 发表于 2024-1-28 16:18

你想异或加密啊,先加密出来,用到的时候再解密,是一种方法,不过如果有最简单的vm方法,就不用先加密一次,再解密一次了。还是想用vm一劳永逸。
花边下丶情未央 发表于 2024-1-28 17:02
朱朱你堕落了 发表于 2024-1-28 16:18
你想异或加密啊,先加密出来,用到的时候再解密,是一种方法,不过如果有最简单的vm方法,就不用先加密一 ...

不用啊,你可以找一下Xor的宏,他自动加解密的
绿雪羚羊 发表于 2024-1-28 17:51
如果想在编译时就自动加密,可以试试o-llvm:https://github.com/DreamSoule/ollvm17

然后给clang传递字符串加密标志:-mllvm -sobf

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
朱朱你堕落了 + 1 + 1 膜拜高端玩家!

查看全部评分

花边下丶情未央 发表于 2024-1-28 17:52
朱朱你堕落了 发表于 2024-1-28 16:18
你想异或加密啊,先加密出来,用到的时候再解密,是一种方法,不过如果有最简单的vm方法,就不用先加密一 ...

StringXor.h

#pragma once
#include <iostream>

namespace Crypt {

#define XSTR_SEED ((__TIME__[7] - '0') * 1ull    + (__TIME__[6] - '0') * 10ull  + \
                   (__TIME__[4] - '0') * 60ull   + (__TIME__[3] - '0') * 600ull + \
                   (__TIME__[1] - '0') * 3600ull + (__TIME__[0] - '0') * 36000ull)

    constexpr unsigned long long LinearCongruentGenerator(unsigned Rounds) 
    {
        return 1013904223ull + (1664525ull * ((Rounds > 0) ? LinearCongruentGenerator(Rounds - 1) : (XSTR_SEED))) % 0xFFFFFFFF;
    }

#define Random() LinearCongruentGenerator(10)
#define XSTR_RANDOM_NUMBER(Min, Max) (Min + (Random() % (Max - Min + 1)))

    template <unsigned size>
    class CXorString {
    public:
        const unsigned m_EndChars = (size - 1);
        char m_szCipherText[size];
        unsigned char m_key1 = XSTR_RANDOM_NUMBER(0x00, 0xA0);
        unsigned char m_key2 = XSTR_RANDOM_NUMBER(0xA1, 0xFF);

        //加密存储
        inline constexpr CXorString(const char* lpszBuffer) : m_szCipherText{}
        {
            for (unsigned i = 0u; i < size; ++i)
            {
                m_szCipherText[i] = (lpszBuffer[i] ^ m_key1) + m_key2;  
            }
        }

        //解密
        const char* Decrypt() const
        {
            char* lpszBuffer = const_cast<char*>(m_szCipherText);
            for (unsigned i = 0; i < m_EndChars; i++)
            {
                lpszBuffer[i] = (m_szCipherText[i] - m_key2) ^ m_key1;   
            }
            lpszBuffer[m_EndChars] = '\0';
            return lpszBuffer;
        }

    };
}

#define XorString(my_string) []{ constexpr Crypt::CXorString<(sizeof(my_string)/sizeof(char))> expr(my_string); return expr; }().Decrypt()
#define _Xor( string ) XorString( string )
int main()
{

    std::cout << _Xor("OKs1") << std::endl;
    std::cout << "OKs2" << std::endl;
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
LXGZJ237 + 1 + 1 谢谢@Thanks!
朱朱你堕落了 + 1 + 1 大佬威武!

查看全部评分

aonima 发表于 2024-1-28 20:25
随便写个加密算法,使用时再解密
苏紫方璇 发表于 2024-1-28 22:20
测试了一下,vm有一个VMProtectDecryptStringA/W解密函数,但是他是调用时解密,尝试将他放在全局变量区的话,会在一开始就解密完成。ps 将重要数据放在全局变量是不安全的,最好随用随销

测试代码:
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <windows.h>
#include "VMProtectSDK.h"

const char *szStr = VMProtectDecryptStringA("这段文字是加密的AAABBB");
int main()
{
	printf("main=%08X \nszStr=%08X \n按回车继续\n", main,szStr);
	getchar();
	MessageBoxA(NULL, szStr, VMProtectDecryptStringA("测试文本textAAABBB"), MB_OK);
	return 0;
}


od main函数
[Asm] 纯文本查看 复制代码
006C1070  /$  51            push ecx                                 ;  vmptest_.<ModuleEntryPoint>
006C1071  |.  FF35 B8A26D00 push dword ptr ds:[0x6DA2B8]
006C1077  |.  68 70106C00   push vmptest_.006C1070                   ;  入口地址
006C107C  |.  68 80746D00   push vmptest_.006D7480                   ;  ASCII "main=%08X \nszStr=%08X \n按回车继续\n"
006C1081  |.  E8 AAFFFFFF   call vmptest_.006C1030
006C1086  |.  83C4 0C       add esp,0xC
006C1089  |.  E8 DF2A0000   call vmptest_.006C3B6D
006C108E  |.  6A 00         push 0x0
006C1090  |.  68 A4746D00   push vmptest_.006D74A4
006C1095  |.  E8 021C0600   call vmptest_.00722C9C
006C109A  |.  90            nop                                      ; |
006C109B  |.  50            push eax                                 ; |Title = "慂0w汝q	"
006C109C  |.  FF35 B8A26D00 push dword ptr ds:[0x6DA2B8]             ; |Text = "这段文字是加密的AAABBB"
006C10A2  |.  6A 00         push 0x0                                 ; |hOwner = NULL
006C10A4  |.  FF15 10216D00 call dword ptr ds:[0x6D2110]             ; \MessageBoxA
006C10AA  |.  33C0          xor eax,eax
006C10AC  |.  59            pop ecx                                  ;  010FFA2C
006C10AD  \.  C3            retn

董督秀 发表于 2024-1-29 01:22
之前花几天写过类似的,但是有点不同。当时写的是vmp授权联合对称加密。其中关于全局变量的字符串的处理,大致步骤是默认全局变量初始值为null。之后在局部调用(在被vm的方法里)的时候,用一个临时变量以数组形式,根据密钥分步解出并赋值给全局变量,之后把临时变量销毁,用完全局变量后,也进行销毁。具体的不记得了……
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 17:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表