我想要做的是制作一个带有中间函数钩子的c++ dll文件,以观察游戏中值的变化(植物大战僵尸)。现在我的问题是,当内联程序集通过头包含时,当构建.dll时会出现错误。
:-1: error: [release/PVZ_lib.o] Error 1 (PVZ_lib是cpp文件的名称,我的主要内容是)
我使用QT作为我的IDE与MinGW 4.7编译器。
程序集头
#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
}
}在这种格式中,我得到以下内容:
警告:“裸”属性指令忽略了-Wattributes,并且在此范围内没有声明一些错误:
注意:我不熟悉挂钩或内嵌装配。
我用来创建这段代码的内容:
https://www.youtube.com/watch?v=A8PGxbu4EqQ
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
发布于 2014-10-03 12:10:47
我建议您使用像cheatEngine这样的工具来查找要挂接的地址,并使用Visual C++编译器进行此操作。
#define SOME_OFFSET = 0x5560;
void __declspec(naked) _stdcall MyHack(){
__asm{
add [eax+SOME_OFFSET], ecx
//other stuff...
}
}此外,每当您测试代码时,请注意如何使用CheatEngine在内存中执行跳转。
https://stackoverflow.com/questions/25825039
复制相似问题