首页
社区
课程
招聘
复制一段注册代码到自己的汇编程序里,应注意些什么?
发表于: 2005-12-27 09:22 5377

复制一段注册代码到自己的汇编程序里,应注意些什么?

2005-12-27 09:22
5377
如果注册代码里有call,怎么办最方便快捷?

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 73723
活跃值: (22736)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
OD有个插件,直接将汇编代码提出。
你得注意处理堆栈平衡,如果这个CALL有参数,就得注意参数的传递。
2005-12-27 10:09
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sas
3
不知道是哪个插件?
请再点拨一下
2005-12-27 17:09
0
雪    币: 73723
活跃值: (22736)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
2005-12-27 17:16
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
5
学习了,收藏了
2005-12-27 19:09
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
6
除了堆栈平衡外,要看看那个call是内部函数还是外部函数(api),是内部函数,要一起搬到你的程序里,是外部的,如果你程序里没有类似的调用,要声明。还要注意有没有常量和变量的定义,如果有,要一起搬过去。
总之,凡是这段代码所涉及到的方方面面都要考虑。
2005-12-27 20:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有用了,就顶下。
2005-12-28 14:47
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sas
8
例如:  
mov eax,dword ptr ds:[ebx]
  push eax
  mov eax,dword ptr ss:[esp+40]
  push eax
  push 015
  push 0EB86D391
  mov eax,esi
  mov ecx,dword ptr ss:[ebp]
  mov edx,dword ptr ds:[edi]
  call aaaa.00EC379C

aaaa.00EC379C 是这样的:
  push ebp
  mov ebp,esp
  push ebx
  push esi
  push edi
  mov edi,ecx
  mov esi,edx
  mov ebx,eax
  mov ecx,dword ptr ss:[ebp+14]
  mov edx,edi
  mov eax,esi
  not ecx
  or eax,ecx
  xor eax,edx
  add eax,dword ptr ds:[ebx]
  add eax,dword ptr ss:[ebp+10]
  add eax,dword ptr ss:[ebp+8]
  mov dword ptr ds:[ebx],eax
  add dword ptr ds:[ebx],esi
  pop edi
  pop esi
  pop ebx
  pop ebp
  retn

能否把call的内容封装成我的call
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_aaaa        proc       

  push ebp
  mov ebp,esp
  push ebx
  push esi
  push edi
  mov edi,ecx
  mov esi,edx
  mov ebx,eax
  mov ecx,dword ptr ss:[ebp+14]
  mov edx,edi
  mov eax,esi
  not ecx
  or eax,ecx
  xor eax,edx
  add eax,dword ptr ds:[ebx]
  add eax,dword ptr ss:[ebp+10]
  add eax,dword ptr ss:[ebp+8]
  mov dword ptr ds:[ebx],eax
  add dword ptr ds:[ebx],esi
  pop edi
  pop esi
  pop ebx
  pop ebp
  retn

_aaaa          endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

然后这样调用:
  mov eax,dword ptr ds:[ebx]
  push eax
  mov eax,dword ptr ss:[esp+40]
  push eax
  push 015
  push 0EB86D391
  mov eax,esi
  mov ecx,dword ptr ss:[ebp]
  mov edx,dword ptr ds:[edi]
  invoke  _aaaa
2005-12-28 22:34
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
你的程序这样写不能说不可以,但不是好的方法,却是简单的方法。
最好将那些[ebp+xx],[esp+xx],[ebp],[esp]都转换成自己程序的局部变量,否则程序动一点,就完蛋。例如你想增加某些功能,在程序中加了自己的局部变量,这时,堆栈的结构发生了变换,那些[ebp][esp]...的具体位置就和原来的不同了,这样取回的结果就不是你想要的。
例如那个_aaaa中 将那三个[epb+xx],换成入口的参数,具体如下:
_aaaa  proc  uses ebx, esi, edi, Param8:DWORD, Param10:DWORD, Param14
  mov edi,ecx
  mov esi,edx
  mov ebx,eax
  mov ecx, Param14
  mov edx,edi
  mov eax,esi
  not ecx
  or eax,ecx
  xor eax,edx
  add eax,ds:[ebx]
  add eax, Param10
  add eax, Param8
  mov ds:[ebx],eax
  add ds:[ebx],esi
  ret                          ;这里不用使用 retn 直接使用ret,让编译器去处理
_aaaa    endp

另外你的这个程序怎么会少了一个 [ebp+0ch],就直接跳到[ebp+10h],如果是这样
那么原来的程序编译出来肯定要出问题,中间的那个[ebp+0c]就无法定位了。

调用时
  invoke _aaaa, Param8, Param10, Param14
这样如果想修改这段代码,怎么改都不会出错了。也就是说,这段代码真正变成你自己的了。
2006-1-4 17:58
0
游客
登录 | 注册 方可回帖
返回