首页
社区
课程
招聘
[旧帖] 如何跳过对函数的调用 0.00雪花
发表于: 2009-12-23 11:31 4277

[旧帖] 如何跳过对函数的调用 0.00雪花

2009-12-23 11:31
4277
如题。怎么跳过或者删除对某个函数的调用。
我试图用NOP替换Call指令,但是程序崩溃了。
请问如何修改,谢谢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你需要恢复stack~

push eax
push ebx
call    00401280

替换之后为:

push eax
push ebx
nop
nop
nop
nop
nop
pop eax
pop eax
2009-12-23 11:59
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
替换之后为:

push eax
push ebx
nop
nop
nop
nop
nop
pop eax
pop eax


你这两个出栈操作没地方放了
替换之后为:
1.可以这样
push eax
push ebx
nop
pop eax
pop eax


2.可以这样
nop
nop
nop
nop
nop
nop
nop
nop
nop

把参数也NOP掉
2009-12-23 12:04
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
楼上都回答的不全面

函数调用时参数传递考虑两个问题:
1、按什么顺序将参数入栈;
2、函数结束后,由谁来平衡堆栈;

围绕这两个问题,不同语言定了不同的调用约定,包括__cdcel(C规范)、PASCAL、stdcall及Fastcall四种方式
win32API采用stdcall方式,由被调用函数返回前平衡堆栈,故你在MessageBoxA函数后面看不到平衡堆栈的操作(在函数内部就完成堆栈平衡操作了)
sprintf函数采用的是__cdcel方式,需要调用者自己平衡堆栈,所以函数返回后有个 add esp,xx
http://www.rrgod.com/


详情请参考:http://bbs.pediy.com/showthread.php?t=103317
2009-12-23 12:15
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
LS我是回答2L的
你需要恢复stack~

push eax
push ebx
call 00401280

明显是自己平衡堆栈的
2009-12-23 12:29
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
以上全部答案就是我的答案,领分。
2009-12-23 12:47
0
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
哦哦~~~~,不够全面,学习~
2009-12-23 12:54
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
如果参数中引用了全局变量,或者CALL是间接CALL(如API调用),则可能有重定位问题,此时若全填NOP,则经过重定位后代码会发生想不到的变化,也会异常。若有这种情况,要用JMP避开重定位。
2009-12-23 13:10
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
为什么要用nop

直接在call内改成retn 看下函数的调用方式.
2009-12-23 13:53
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
1.可以这样
push eax
push ebx
nop
pop eax
pop eax


楼上几个人明显没实践过啊,这个中间肯定是3个NOP才是正好把空间填满呀.

怎么跳过或者删除对某个函数的调用。
我试图用NOP替换Call指令,但是程序崩溃了。

如果你想知道为什么程序崩溃,你必须清楚
对某个函数的调用
中函数里做了什么事,这个如同8楼所说要具体分析了.如果你确定函数里没有问题,那么
push eax
push ebx
nop
pop eax
pop eax
覆盖了堆栈里的2个值,但是原来的那个函数调用也有很大可能修改掉这2个堆栈的值,所以这样改严格来说不正确.
我的看法就是:如果你不知道这个调用的函数做什么(特别是输出了什么结果),那么你只能撞运气改了,总崩溃的话还是看下函数调用吧

PS:楼上的几个办法都主要是针对自效验和出现一个广告窗口这种情况的函数调用的修改办法.
再PS: BS楼下的,比楼上的几个办法更容易出错.
2009-12-23 20:08
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
在Call前的两条push指令直接改为无条件跳转指令JMP就行了。
2009-12-23 22:54
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
       汇编的 ....
2009-12-24 16:34
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个情况就多了

会不会是自校检?

自己试试嘛
2009-12-24 18:20
0
游客
登录 | 注册 方可回帖
返回
//