我想用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
其中有一个值是这样 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
mov [reg32+imm32], reg32
mov [reg32+imm32], imm8/imm32
肯定不是同一个指令码,你前面说的改汇编不知道你是怎么改的
如果改完之后长度不长于原来的代码,那算你走运,填充无用代码总比长了好办你那段代码不实在是莫名其妙,我还想问你为什么觉得它会对呢?
Address是个没有使用的局部变量,编译器不会为它生成任何代码,你写不写它都不产生影响。你觉得进入asm之后ecx里应该是什么,[ecx+66]指向的内容是哪?你那句就相当于往一个野指针写数,直接出错了只能说你走运,能及时发现问题
510bed mov [ecx+66],eax 我用CE在里面直接修改。是绝对没问题的。所以我在想。如果用DELPHI写个程序开修改它。会是怎么样子。
因为以前没接触过汇编。所以不是太明白。在网上查了一些资料。
就照着写了。
楼上的大哥能说明一下。如果要改这段。应该如何去写。需要有哪些准备工作?
然后了解一下register(delphi中的默认调用约定)/stdcall/cdecl都是怎么传参数的
接着读《windows核心编程》中关于进程、虚拟内存的知识,再了解一下pe文件结构和映射
就差不多知道如果想自己实现的话应该怎么动手了
没用过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
方法2:直接在本行前面mov ecx,1 ,然后后面所有的偏移地址递增.
不过仙剑的exe似乎加密过。
而且开源,代码使用Delphi编写,楼主可以去参考参考。