首页
社区
课程
招聘
[求助]关于修改汇编代码跳转到注入后DLL文件函数的问题!
发表于: 2009-5-24 22:47 9011

[求助]关于修改汇编代码跳转到注入后DLL文件函数的问题!

2009-5-24 22:47
9011
DLL文件是注入到进程的!

已知要修改的地址:$00586804
已知要跳转到注入后DLL文件的函数名:pdazuf (不知道这个函数名的地址)

要修改地址的汇编代码是:mov ebx, dword ptr [$045560C8]
现在就要修改上面这行代码为: jmp pdazuf(这个“pdazuf”如何得到真正的地址)

请高手们指教指教,到底如何用DELPHI写才能跳转到指定的函数地址,最好能给出源码,谢谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (31)
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果不指明DELPHI的话,我可以帮助你
2009-5-24 23:03
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如果是其它语言也可以给我参考一下,谢谢!
2009-5-24 23:13
0
雪    币: 419
活跃值: (10)
能力值: ( 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
2009-5-24 23:22
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
纯汇编修改?

能给每一行给注释吗?

有的不懂
2009-5-24 23:23
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
为什么不可以?

前提是修改的地方有写的属性
2009-5-24 23:25
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哦,谢谢你,上面汇编的代码能不能给每一行给个注释吗?因为我对汇编语言不太懂,谢谢你啦!
2009-5-24 23:33
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
慢慢领会和学习.
2009-5-24 23:38
0
雪    币: 419
活跃值: (10)
能力值: ( 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
2009-5-24 23:39
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
非常谢谢fixfix的帮忙,我去试试!
2009-5-24 23:43
0
雪    币: 419
活跃值: (10)
能力值: ( 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
2009-5-24 23:49
0
雪    币: 408
活跃值: (10)
能力值: ( 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;
2009-5-25 00:21
0
雪    币: 419
活跃值: (10)
能力值: ( 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的话,就可以照搬原来的
2009-5-25 00:53
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
对,我看到原地址变成JMP XXXXXXXX ,XXXXXX表示跳转的地址,能写入去!
2009-5-25 00:59
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不明白楼上意思了
2009-5-25 01:07
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我的所有代码都是在DLL文件里,EXE只是有注入代码
2009-5-25 01:20
0
雪    币: 419
活跃值: (10)
能力值: ( 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;
2009-5-25 01:26
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
对。。。。。。
2009-5-25 01:33
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
那你挂OD,调试下,是不是修改成了你想要的地址
2009-5-25 01:39
0
雪    币: 408
活跃值: (10)
能力值: ( 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
2009-5-25 01:47
0
雪    币: 419
活跃值: (10)
能力值: ( 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;
2009-5-25 01:54
0
雪    币: 408
活跃值: (10)
能力值: ( 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”修改为跳转代码,所以在我的代码中重新恢复它出来
2009-5-25 01:59
0
雪    币: 408
活跃值: (10)
能力值: ( 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”出来!
2009-5-25 02:03
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
问题多了

你恢复的代码也不对

再合适的地方,先备份到个数组上,才好恢复

你既然要恢复,前面写入的时候,为什么要恢复读的属性呢

跳转回去的代码也不对

   //kill  jmp [$00586809] // 上次那个错误 jmp dword ptr [] 和 JMP XXX 的区别,这里修改为
   push 00586809h
   ret  这两行相当 jmp 00586809  但是直接写  jmp 00586809 编译不了,所以变通下
  end;
2009-5-25 02:06
0
雪    币: 408
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
如何备份到个数组上?
2009-5-25 02:11
0
游客
登录 | 注册 方可回帖
返回
//