首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建带有内联程序集的c++ dll

创建带有内联程序集的c++ dll
EN

Stack Overflow用户
提问于 2014-09-13 16:04:31
回答 1查看 1.1K关注 0票数 3

我想要做的是制作一个带有中间函数钩子的c++ dll文件,以观察游戏中值的变化(植物大战僵尸)。现在我的问题是,当内联程序集通过头包含时,当构建.dll时会出现错误。

:-1: error: [release/PVZ_lib.o] Error 1 (PVZ_lib是cpp文件的名称,我的主要内容是)

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

程序集头

代码语言:javascript
复制
#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

函数

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
__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

EN

回答 1

Stack Overflow用户

发布于 2014-10-03 12:10:47

我建议您使用像cheatEngine这样的工具来查找要挂接的地址,并使用Visual C++编译器进行此操作。

代码语言:javascript
复制
#define SOME_OFFSET = 0x5560;

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

  }

}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25825039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档