能力值:
(RANK:350 )
|
-
-
2 楼
OD有个插件,直接将汇编代码提出。
你得注意处理堆栈平衡,如果这个CALL有参数,就得注意参数的传递。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不知道是哪个插件?
请再点拨一下
|
能力值:
( LV12,RANK:530 )
|
-
-
5 楼
学习了,收藏了
|
能力值:
( LV12,RANK:450 )
|
-
-
6 楼
除了堆栈平衡外,要看看那个call是内部函数还是外部函数(api),是内部函数,要一起搬到你的程序里,是外部的,如果你程序里没有类似的调用,要声明。还要注意有没有常量和变量的定义,如果有,要一起搬过去。
总之,凡是这段代码所涉及到的方方面面都要考虑。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
有用了,就顶下。
|
能力值:
( LV2,RANK:10 )
|
-
-
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
|
能力值:
( 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
这样如果想修改这段代码,怎么改都不会出错了。也就是说,这段代码真正变成你自己的了。
|