Teoria e prática de plug-ins e software crackeado
1 teoria
1.1 Arquivos executáveis em diferentes sistemas operacionais
- Janelas【PE】
O formato PE, Portable Executable,
é o principal formato de arquivo executável no Windows. Não se confunda com o nome, os arquivos PE devem ser arquivos do Windows.
- Linux【ELF】
No arquivo executável do sistema Linux (arquivo ELF, formato executável e vinculável, formato de link executável), o início é um cabeçalho de arquivo, que é usado para descrever o layout do programa, os atributos de todo o arquivo e outras informações, incluindo se o arquivo é executável, link estático ou dinâmico e endereço de entrada e outras informações; o arquivo gerado não é um arquivo executável binário puro, porque o cabeçalho do programa incluído não é um código executável; depois de ler este arquivo contendo o cabeçalho do programa na memória , no cabeçalho do programa Leia o endereço de entrada e pule para o endereço de entrada para execução;
- Mac【Mach-O】
Mach-O é uma abreviatura para o formato de arquivo Mach Object, que é um formato de arquivo para arquivos executáveis, código de objeto, bibliotecas dinâmicas e core dumps. Como alternativa ao formato a.out, o Mach-O oferece maior escalabilidade e acesso mais rápido às informações da tabela de símbolos.
1.2 Conhecimento de cracking de software no Windows
◼ Conhecimento necessário de cracking de software da plataforma Windows
Formato do arquivo: arquivo PE
Linguagem assembly: x86, x64 assembly
Ferramentas: Ollydbg
API do Windows
◼ Teclas de atalho OD comumente usadas
F2: Alternar pontos de interrupção
F9: Executar o programa
F7: Entrar
F8: Passar por cima
Ctrl + G: Pesquisar código
1.3 Embalagem e desembalagem
-
Ideias gerais para cracking de software
-
A ideia de quebrar o software após embalá-lo (uma camada extra no software comum)
1.4 A natureza dos plug-ins
Existem dois métodos comuns de plug-in:
-
Modificar dados na memória
-
Modifique o código na memória
Modifique o código assembly por meio do software OD e salve-o como um novo arquivo .exe
其实,数据和代码并没有本质区别,在内存中都是0和1
2 etapas práticas
Endereço do software:
链接:https://pan.baidu.com/s/1pIogCuXPR87p91og09zZZQ?pwd=zj8k
提取码:zj8k
2.1 Preparação do ambiente
visual studio 2022: desenvolvimento de desktop c++ (MFC), desenvolvimento de extensão do visual studio
Desenvolvimento de extensão:
2.2 Compilação OD (Ollydbg)
Converter arquivo .exe em assembly
2.4 motores trapaceiros
Usado para detectar alterações numéricas na memória
2.5 Etapas gerais
Aqui está
植物大战僵尸
um exemplo
- Abra o visual studio e crie um projeto MFC (semelhante ao swing em java)
- 自定义log宏,简化打印
- 事件注册(手动、自动)
- 绑定变量(手动、自动)
- 单选框状态读取(勾选、不勾选)
- Arraste o arquivo em execução (arquivo .exe) de Plants vs. Zombies para o OD e assista à compilação
- Modificar lógica de montagem
前后修改尽量不动字节数,比如:前面一行代码占字节,我们修改后的代码占2字节,
那么我们就需要使用NOP填充,相当于是空,当cpu执行到nop时,会直接跳过,nop
只起到一个占用位置的作用
Ideia:
①秒杀僵尸:直接用僵尸的原有血量 - 僵尸的血量
②无限阳光:阳光存在一个struct中,通过地址找到值,然后使用API修改内存中的值
- Exporte o arquivo exe crackeado
- Encontre janela usando spy++
O desenvolvimento de plug-in de desktop do Windows pode precisar obter o identificador (ID) do arquivo em execução e, em seguida, controlar
4. Modifique o código no visual studio [parte]
Mate zumbis instantaneamente, luz solar ilimitada
// 用来监控游戏的线程
DWORD monitorThreadFunc(LPVOID lpThreadParameter) {
while (1) {
// 获得植物大战僵尸窗口的句柄
HWND windowHandle = FindWindow(CString("MainWindow"), CString("植物大战僵尸中文版"));
if (windowHandle == NULL) {
g_dlg->m_bnKill.SetCheck(FALSE);
g_dlg->m_bnSun.SetCheck(FALSE);
g_dlg->m_bnKill.EnableWindow(FALSE);
g_dlg->m_bnSun.EnableWindow(FALSE);
g_processHandle = NULL;
} else if (g_processHandle == NULL) {
g_dlg->m_bnKill.EnableWindow(TRUE);
g_dlg->m_bnSun.EnableWindow(TRUE);
// 获得植物大战僵尸的进程ID
DWORD processPid;
GetWindowThreadProcessId(windowHandle, &processPid);
// 获得植物大战僵尸的进程句柄
g_processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processPid);
}
if (g_dlg->m_bnSun.GetCheck()) {
// 需要无限阳光
DWORD value = 9990;
WriteMemory(&value, sizeof(value), 0x6A9EC0, 0x320, 0x8, 0x0, 0x8, 0x144, 0x2c, 0x5560, -1);
}
// 休息睡眠
Sleep(1000);
}
return NULL;
}