gpt4 book ai didi

c++ - 使用内联汇编创建一个 c++ dll

转载 作者:太空狗 更新时间:2023-10-29 23:16:09 25 4
gpt4 key购买 nike

我想做的是制作一个带有中间函数 Hook 的 c++ dll 文件,以观察游戏(植物大战僵尸)中的值何时更改。现在我的问题是,当通过 header 包含内联程序集时,构建 .dll 时会出现错误
:-1: error: [release/PVZ_lib.o] Error 1(PVZ_lib是我的main所在的cpp文件的名字)

我使用 QT Creator 作为我的 IDE 和 MinGW 4.7 编译器。

程序集 header

#ifndef ASM_H
#define ASM_H
#include "addr.h"

DWORD scan =0;
DWORD scanreg =0;
DWORD scanptr;

void code(void){

asm("ADD [EAX+0x5560],ECX");

asm("MOV scanreg,ECX");

asm("MOV ECX,[EAX+0x5560]");
asm("CMP ECX,2706");
asm("JLE SHORT PlantsVs.00430A9D");

asm("jmp[scan]");


}

#endif // ASM_H

函数

#include "addr.h"    

void addr::PlaceJMP(BYTE *Address,DWORD jumpto,DWORD lenght){
DWORD dwoldprotect, dwbkup, dwreladdr;

VirtualProtect(Address,lenght,PAGE_EXECUTE_READWRITE,&dwoldprotect);
dwreladdr = (DWORD) (jumpto -(DWORD)Address) - 5;
*Address = 0xE9l;
*((DWORD*)(Address+0x1))= dwreladdr;

for(DWORD x=0x5;x<lenght;x++){
*(Address+x)=0x90;
}

VirtualProtect(Address,lenght,dwoldprotect,&dwbkup);
}

MODULEINFO addr::GetModuleInfo(char *name){
MODULEINFO modinfo={0};
HMODULE hModule =GetModuleHandle(name);
if(hModule == 0){
return modinfo;
}

GetModuleInformation(GetCurrentProcess(),hModule, &modinfo,sizeof(MODULEINFO));
return modinfo;
}

DWORD addr::FindPat(char *module,char *pattern,char *mask){
MODULEINFO mInfo = GetModuleInfo(module);
DWORD base =(DWORD)mInfo.lpBaseOfDll;
DWORD size =(DWORD)mInfo.SizeOfImage;
DWORD i;
bool found = true;
DWORD PatternLenght = (DWORD)strlen(mask);
for(i=0;i<size-PatternLenght;i++){

for(DWORD j=0;j<PatternLenght;j++){
found &=mask[j] == '?' || pattern[j] == *(char*)(base+i+j);
}
}
if(found){
return base+i;
}
return NULL;
}

主要

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#include "addr.h"
#include "ASM.h"
addr stuff;

void initHooks(){

DWORD find = stuff.FindPat("PlantsVsZombies.exe",
"\x01\x88\x00\x00\x00\x00\x8B\x88\x00\x00\x00\x00\x81\xF9\x00\x00\x00\x00\x7E\x78",
"xx????xx????xx????xx"
);
}

DWORD WINAPI watch(){
scanptr= scanreg;//+0x3C
DWORD test=scanptr;

for(;;Sleep(150)){
if(scanptr!=test){
test=scanptr;
//addr.MsgBoxAddr(1);
}
}
}

BOOL WINAPI DLLMain(HINSTANCE hinstDLL,DWORD ftwReason,LPVOID lpReserved){
initHooks();
switch(ftwReason){
case DLL_PROCESS_ATTACH:
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)watch(),NULL,NULL,NULL);
break;
}

return TRUE;
}

我试过像这样格式化汇编程序。

__declspec(naked) void code(void){

__asm{
//assembler
}
}

以这种格式我得到以下内容:

warning: 'naked' attribute directive ignored [-Wattributes] and a few error: was not declared in this scope

注意:我不熟悉 Hook 或内联汇编。

我用来创建这段代码的内容:

https://www.youtube.com/watch?v=A8PGxbu4EqQ

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

最佳答案

我建议您使用像 cheatEngine 这样的工具来找到您想要 Hook 的地址,并使用 Visual Studio C++ 编译器来执行此操作。

#define SOME_OFFSET = 0x5560;

void __declspec(naked) _stdcall MyHack(){
__asm{
add [eax+SOME_OFFSET], ecx
//other stuff...

}

}

此外,每当您测试代码时,请使用 CheatEngine 观察跳转是如何在内存中执行的。

关于c++ - 使用内联汇编创建一个 c++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com