我想用delphi反汇编更改仙剑的游戏。
   其中有一个值是这样 510bed  mov [ecx+66],eax  我用CE可以把eax改成1或者其它数字。
但是我用delphi  这样写就不对了。为什么。能不能教教我怎么写。我想更改这段汇编代码   .而且我如何能把eax改成我需要的数。比如。我填1   ecx+66的值就是1  输入4就把4传给他。
procedure TForm_main.Bu tton15Click(Sender: TObject);
var
      Address:pointer;
begin    Address:=Pointer($510bed  );
    asm
      pushad 
      mov [ecx+00000066],1
      popad
      end;end

解决方案 »

  1.   

       顺便说一下。我是用的让游戏调用我的DLL。请问下如何来改变这段汇编代码
      

  2.   

    首先,很显然的是
    mov [reg32+imm32], reg32
    mov [reg32+imm32], imm8/imm32
    肯定不是同一个指令码,你前面说的改汇编不知道你是怎么改的
    如果改完之后长度不长于原来的代码,那算你走运,填充无用代码总比长了好办你那段代码不实在是莫名其妙,我还想问你为什么觉得它会对呢?
    Address是个没有使用的局部变量,编译器不会为它生成任何代码,你写不写它都不产生影响。你觉得进入asm之后ecx里应该是什么,[ecx+66]指向的内容是哪?你那句就相当于往一个野指针写数,直接出错了只能说你走运,能及时发现问题
      

  3.   

        我那个是用CE查找到数字。然后 是谁读了这个地址。 结果就找到了这段代码。
    510bed  mov [ecx+66],eax 我用CE在里面直接修改。是绝对没问题的。所以我在想。如果用DELPHI写个程序开修改它。会是怎么样子。
    因为以前没接触过汇编。所以不是太明白。在网上查了一些资料。
    就照着写了。
    楼上的大哥能说明一下。如果要改这段。应该如何去写。需要有哪些准备工作?
      

  4.   

    先大概了解一下汇编,搞清楚win32下几个通用寄存器都该怎么用,至少 mov/lea/jump/call 系列指令和基本逻辑运算、加减法指令知道怎么用
    然后了解一下register(delphi中的默认调用约定)/stdcall/cdecl都是怎么传参数的
    接着读《windows核心编程》中关于进程、虚拟内存的知识,再了解一下pe文件结构和映射
    就差不多知道如果想自己实现的话应该怎么动手了
      

  5.   

    register传参不一样的……
    没用过asm内联改游戏,不过倒是见过一牛人直接数组写的
    const
      pOldHPCodeAddr      =$0056C99D;
      pFunModifyHPAddr    =$00922E69;
      bOldHPCode:array[0..7] of Byte=($53,$57,$8d,$8e,$54,$01,$00,$00);
      bNewHPCode:array[0..7] of Byte=($E9,$C7,$64,$3B,$00,$90,$90,$90);
      bFunModifyHP:array[0..46] of Byte=($83,$FF,$07,            //cmp     edi, 7
    $75,$07,                //jnz     short 00922E75
    $BB,$00,$20,$00,$00,    //mov     ebx, 2000
    $EB,$16,                //jmp     short 00922E8B
    $83,$FF,$08,            //cmp     edi, 8
    $75,$07,                //jnz     short 00922E81
    $BB,$64,$00,$00,$00,    //mov     ebx, 64
    $EB,$0A,                //jmp     short 00922E8B
    $83,$FF,$09,            //cmp     edi, 9
    $75,$05,                //jnz     short 00922E8B
    $BB,$00,$02,$00,$00,    //mov     ebx, 200
    $53,                    //push    ebx
    $57,                    //push    edi
    $8D,$8E,$54,$01,$00,$00,//lea     ecx, dword ptr [esi+154]
    $E9,$0D,$9B,$C4,$FF     //jmp     0056C9A5
      

  6.   

    方法1:向前查找到最近一个类似 mov ecx,a的代码,把a改成1;这个不一定正确
    方法2:直接在本行前面mov ecx,1 ,然后后面所有的偏移地址递增.
      

  7.   

    用IDA反汇编慢慢啃。
    不过仙剑的exe似乎加密过。
      

  8.   

    修改游戏里面的东西,用CE是很方便的
    而且开源,代码使用Delphi编写,楼主可以去参考参考。