能力值:
( LV2,RANK:10 )
2 楼
如果不指明DELPHI的话,我可以帮助你
能力值:
( LV2,RANK:10 )
3 楼
如果是其它语言也可以给我参考一下,谢谢!
能力值:
( LV2,RANK:10 )
4 楼
mov eax,offset pdazuf
mov edx,00586804h
sub eax,edx
sub eax,5
mov byte ptr [edx],0e9h
xchg [edx+1],eax
能力值:
( LV2,RANK:10 )
5 楼
纯汇编修改?
能给每一行给注释吗?
有的不懂
能力值:
( LV2,RANK:10 )
6 楼
为什么不可以?
前提是修改的地方有写的属性
能力值:
( LV2,RANK:10 )
7 楼
哦,谢谢你,上面汇编的代码能不能给每一行给个注释吗?因为我对汇编语言不太懂,谢谢你啦!
能力值:
( LV2,RANK:10 )
8 楼
慢慢领会和学习.
能力值:
( LV2,RANK:10 )
9 楼
mov eax,offset pdazuf // 你的函数地址传EAX
mov edx,00586804h // 要修改地址
sub eax,edx//目标地址也就是你的函数地址 减去 要修改地址
sub eax,5 // 再减去5
mov byte ptr [edx],0e9h
xchg [edx+1],eax //eax== XXXXXXXX
--------------------------------------------
00586804 e9 XXXXXXXX jmp pdazuf
能力值:
( LV2,RANK:10 )
10 楼
非常谢谢fixfix的帮忙,我去试试!
能力值:
( LV2,RANK:10 )
11 楼
http://www.unpack.cn/viewthread.php?tid=36022&extra=page%3D1
mov byte ptr [edx],0e9h
xchg [edx+1],eax //eax== XXXXXXXX
再这两句写前,一般先干掉写的保护
下面是汇编弄的,需要在DLL里写,要不handle 就不为-1
你不喜欢,可以用标准API来实现
example:
pushad
mov eax,20h;read
mov ebx,40h;wrie
mov ecx,5;size
mov edx,00586804h;address
call killmemoryprotect
or eax,eax
jne @F ; jmp wrong
mov eax,40100eh
mov byte ptr [eax],9
@@: popad
ret
killmemoryprotect proc
push ebp
push ebx
sub ebp,4
push ebp
mov dword ptr [ebp],eax
push ebx
sub ebp,4
push ebp
mov dword ptr [ebp],ecx
sub ebp,4
push ebp
mov dword ptr [ebp],edx
push -1
mov dword ptr [ebp-4],0cf8f8977h
or ebx,-1
@@: inc ebx
cmp ebx,4
jg @F
movzx eax,byte ptr [ebp+ebx]
mov edx,esp
int 2eh
or eax,eax
jne @B
@@: add esp,20
pop ebx
pop ebp
ret
killmemoryprotect endp
能力值:
( LV2,RANK:10 )
12 楼
TO FIXFIX
写入后一会还是出错!我把代码给你看看,请帮我看看代码里有没有错的地方!
procedure TForm1.Button22Click(Sender: TObject); //这个是写入代码的操作
Var
addr11 : DWORD;
dwOldProtect : DWORD;
begin
addr11 := $00586804;
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
VirtualProtectEx(ProcessHandle, Pointer(addr11), 5, PAGE_EXECUTE_READWRITE, @dwOldProtect);
asm
pushad
mov eax, offset pdazuf111 // 你的函数地址传EAX
mov edx, $00586804 // 要修改地址
sub eax, edx //目标地址也就是你的函数地址 减去 要修改地址
sub eax, 5 // 再减去5
mov byte ptr [edx], $E9
xchg [edx+1], eax //eax== XXXXXXXX
popad
end;
VirtualProtectEx(ProcessHandle, Pointer(addr11), 5, dwOldProtect, @dwOldProtect);
CloseHandle(ProcessHandle);
end;
procedure pdazuf111;stdcall;export; //以下都是自己DLL文件的代码
begin
asm
pushad
push ebx
mov ebx, dword ptr [$045560C8]
mov dword ptr [ebx], eax
pop ebx
call pdazuf222
popad
jmp [$00586809]
ret
end;
end;
procedure pdazuf222; stdcall ;
var
hpa, mpa, maxhpa, maxmpa : DWORD ;
begin
asm
pushad
mov ecx, dword ptr [$04554670]
mov hpa, ecx
mov ecx, dword ptr [$04554674]
mov mpa, ecx
mov ecx, dword ptr [$0455467C]
mov maxhpa, ecx
mov ecx, dword ptr [$04554680]
mov maxmpa, ecx
popad
end;
if ((hpa * 100) / maxhpa ) < 80 then pdazuf2;
if ((mpa * 100) / maxmpa ) < 50 then pdazuf1;
end;
procedure pdazuf1; stdcall ;
var
address:pointer;
begin
Address:=pointer(pcall);
asm
pushad
push 0
push 1
push 0
call Address
popad
end;
end;
procedure pdazuf2; stdcall ;
var
address:pointer;
begin
Address:=pointer(pcall);
asm
pushad
push 1
push 1
push 0
call Address
popad
end;
end;
能力值:
( LV2,RANK:10 )
13 楼
你这代码是放到EXE的,要先获取 pdazuf111 函数地址
GetModuleHandle,XX
GetProcAddress ,XX,XX
如果返回函数地址成功,那么这时候eax就是地址了
asm
pushad
这行就可以不要了 // mov eax, offset pdazuf111 // 你的函数地址传EAX
mov edx, $00586804 // 要修改地址
sub eax, edx //目标地址也就是你的函数地址 减去 要修改地址
sub eax, 5 // 再减去5
mov byte ptr [edx], $E9
xchg [edx+1], eax //eax== XXXXXXXX
popad
end;
如果你要把上面的代码放到DLL的话,就可以照搬原来的
能力值:
( LV2,RANK:10 )
14 楼
对,我看到原地址变成JMP XXXXXXXX ,XXXXXX表示跳转的地址,能写入去!
能力值:
( LV2,RANK:10 )
15 楼
不明白楼上意思了
能力值:
( LV2,RANK:10 )
16 楼
我的所有代码都是在DLL文件里,EXE只是有注入代码
能力值:
( LV2,RANK:10 )
17 楼
这也是放到DLL?
procedure TForm1.Button22Click(Sender: TObject); //这个是写入代码的操作
Var
addr11 : DWORD;
dwOldProtect : DWORD;
begin
addr11 := $00586804;
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
VirtualProtectEx(ProcessHandle, Pointer(addr11), 5, PAGE_EXECUTE_READWRITE, @dwOldProtect);
asm
pushad
mov eax, offset pdazuf111 // 你的函数地址传EAX
mov edx, $00586804 // 要修改地址
sub eax, edx //目标地址也就是你的函数地址 减去 要修改地址
sub eax, 5 // 再减去5
mov byte ptr [edx], $E9
xchg [edx+1], eax //eax== XXXXXXXX
popad
end;
VirtualProtectEx(ProcessHandle, Pointer(addr11), 5, dwOldProtect, @dwOldProtect);
CloseHandle(ProcessHandle);
end;
能力值:
( LV2,RANK:10 )
18 楼
对。。。。。。
能力值:
( LV2,RANK:10 )
19 楼
那你挂OD,调试下,是不是修改成了你想要的地址
能力值:
( LV2,RANK:10 )
20 楼
我刚用OD来修改,修改为JMP pdazuf111 ,但一会也出错,这样是不是pdazuf111里面的代码有问题?
procedure pdazuf111;stdcall;export; //测试游戏自动CALL吃红蓝代码
begin
asm
pushad
push ebx
mov ebx, dword ptr [$045560C8]
mov dword ptr [ebx], eax
pop ebx
popad
jmp [$00586809]
end;
end; 以下是原始汇编代码
:005867E3 8B561E mov edx, dword ptr [esi+1E]
:005867E6 891584465504 mov dword ptr [04554684], edx
:005867EC 8B15C8605504 mov edx, dword ptr [045560C8]
:005867F2 0FBF4622 movsx eax, word ptr [esi+22]
:005867F6 3BD0 cmp edx, eax
:005867F8 7D06 jge 00586800
:005867FA 50 push eax
:005867FB E8207C0000 call 0058E420
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005867F8(C)
|
:00586800 0FBF4622 movsx eax, word ptr [esi+22]
:00586804 A3C8605504 mov dword ptr [045560C8], eax 我是修改这一行跳转到我的代码
:00586809 5E pop esi 这行是从我的代码跳转回来的地址
:0058680A 5D pop ebp
:0058680B C20400 ret 0004
能力值:
( LV2,RANK:10 )
21 楼
begin
asm
pushad
push ebx
mov ebx, dword ptr [$045560C8] // 045560C8 这里面是什么,你这两行代码做什么功能 // 你要模拟
mov dword ptr [ebx], eax // mov dword ptr [045560C8], eax 这句?
pop ebx
popad
//kill jmp [$00586809] // 上次那个错误 jmp dword ptr [] 和 JMP XXX 的区别,这里修改为
push 00586809
ret 这两行相当 jmp 00586809 但是直接写 jmp 00586809 编译不了,所以变通下
end;
end;
能力值:
( LV2,RANK:10 )
22 楼
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005867F8(C)
|
:00586800 0FBF4622 movsx eax, word ptr [esi+22]
:00586804 A3C8605504 mov dword ptr [045560C8], eax 我是修改这一行跳转到我的代码
:00586809 5E pop esi 这行是从我的代码跳转回来的地址
:0058680A 5D pop ebp
:0058680B C20400 ret 0004 因为我在这行“mov dword ptr [045560C8], eax”修改为跳转代码,所以在我的代码中重新恢复它出来
能力值:
( LV2,RANK:10 )
23 楼
[QUOTE=fixfix;630397]begin
asm
pushad
push ebx
mov ebx, dword ptr [$045560C8] // 045560C8 这里面是什么,你这两行代码做什么功能 // 你要模拟
mov dword ptr [ebx], eax // mov ...[/QUOTE]
只要是想恢复这句“mov dword ptr [045560C8], eax”出来!
能力值:
( LV2,RANK:10 )
24 楼
问题多了
你恢复的代码也不对
再合适的地方,先备份到个数组上,才好恢复
你既然要恢复,前面写入的时候,为什么要恢复读的属性呢
跳转回去的代码也不对
//kill jmp [$00586809] // 上次那个错误 jmp dword ptr [] 和 JMP XXX 的区别,这里修改为
push 00586809h
ret 这两行相当 jmp 00586809 但是直接写 jmp 00586809 编译不了,所以变通下
end;
能力值:
( LV2,RANK:10 )
25 楼
如何备份到个数组上?