汇编语言代码重定位

远程线程的代码重定位:就是修正函数、变量的地址使它们能在新的进程(线程)中正常调用.常用方法是使用偏移量,使这些地址用[偏移量+变量名]的形式来表现。用函数时,参数要用到全局变量的时候,要先lea出地址来;

//--------取偏移量方法 ----------------------------------------------------

    call @vstart

  @vstart:

    pop ebx

    sub ebx,offset @vStart //把绝对地址和相对偏移相减就可以获得相对偏移与绝对地址的转换关系

    mov eax, [ebx+offset var] //offset 关键字好似可省写

ebx为编移量.

//一个实例.

.code
 
 
  mycode:
 
  lpmsg   dd  ?
  sztil   db  '密码为: ',0
  szstr   db 'password is '
  szpwd   db  70h dup (0)
  
 ; --------------------

  startcode:
 
  pushad
 
  call l1
  l1:
  pop ebx

  sub ebx,offset l1

  ;很经典的代码自定位技术,不陌生吧!

  lea edi, [ebx + offset szpwd]

  mov edx,[ebp - 8]

  add edi,edx

  mov byte ptr [edi],al

  inc edx

  mov eax,[ebp -4]

  cmp edx,eax

  jl ext1

-------------------------------------------------

关于远程线程中的自定位: 


      dwvar  dd    ?  ;全局变量dwvar
              call @F
       @@:
              pop ebx
              sub ebx,offset @B
              mov    eax,[ebx + offset dwvar]

@F 向下最近的@@标号的地址

@B 向上最近的@@标号的地址

call 所取得是 函数地址

$ 则是当前地址

这里的offset @B,是相对偏移地址,那么将程序的一部分(其中包含以上自定位代码)写到其它的进程中,以便在其它进程中产生远程线程
那么这时的offset @B的相对偏移地址怎么解释,哪位大虾帮讲解一下!!!

感觉offset @B应该是@@标号,相对于本地进程的偏移地址,但本地进程只是把其中的一部分代码写进了其它进程,那么相对于写进其它进程的这部分代码,它的offset @B应该不对呀?

offset @B是@@标号在源进程中的地址,是一个立即数,这段代码复制到其它进程后,这个数是不变的。“sub ebx,offset @B”,ebx是@@标号在当前进程(被注入的进程)中的地址,向减之后就是被注入的代码在当前进程与源进程中偏移量的差。

对于注入的代码,因为注入的地址与原本的地址不同,所有代码中不能使用绝对地址。通常情况下,只要不使用直接寻址(直接使用全局变量),不使用标号的偏移量(OFFSET伪指令),就不会有问题。当使用全局变量或者偏移量时,可以使用上面ebx+的方法来修正,如果在其它函数中也需要使用全局变量或者偏移量时,可以用同样的方法,也可以在调用函数的时候把ebx作为参数传递过去。

 

 

//--------------------------
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值