首页
社区
课程
招聘
初级问题
2007-3-17 20:29 3359

初级问题

2007-3-17 20:29
3359
::004012E5::  6A 00                    PUSH    0                              
::004012E7::  68 68274000              PUSH    402768                              \->: test2.exe
::004012EC::  68 60274000              PUSH    402760                              \->: Open
::004012F1::  6A 00                    PUSH    0                              
::004012F3::  FF15 B0224000            CALL    NEAR DWORD PTR [4022B0]             >>>: SHELL32.DLL:ShellExecuteA
::004012F9::  8B4C24 0C                MOV     ECX, DWORD PTR [ESP+C]         
::004012FD::  5F                       POP     EDI                             
::004012FE::  B8 01000000              MOV     EAX, 1                          
::00401303::  5E                       POP     ESI                             
::00401304::  64:890D 00000000         MOV     DWORD PTR FS:[0], ECX           
::0040130B::  83C4 10                  ADD     ESP, 10                        
::0040130E::  C3                       RETN                                    
::0040130F::  CC                       INT3                                    
::00401310::  64:A1 00000000           MOV     EAX, DWORD PTR FS:[0]           
::00401316::  6A FF                    PUSH    -1                          

我想去掉CALL这句函数调用,怎么修改?要用jmp吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (4)
雪    币: 38382
活跃值: (19385)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2007-3-17 20:54
2
0
::004012E5::  6A 00                    PUSH    0               //改成jmp  004012F9               
::004012E7::  68 68274000              PUSH    402768                              \->: test2.exe
::004012EC::  68 60274000              PUSH    402760                              \->: Open
::004012F1::  6A 00                    PUSH    0                              
::004012F3::  FF15 B0224000            CALL    NEAR DWORD PTR [4022B0]             >>>: SHELL32.DLL:ShellExecuteA
  004012F9::  8B4C24 0C                MOV     ECX, DWORD PTR [ESP+C]
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 6 2007-3-17 21:31
3
0
看雪老师亲自回答了...

对于很多像我这样的新手,
可能不太明白原理
我只是补充一下
高手莫笑

修改的原则,就是保持堆栈的平衡.
基础知识(给小菜看的)

在CALL之前,连续的压栈操作是将调用函数的参数压入堆栈,压入的数据都是临时数据,在函数返回后便没有用了,所以必须要进行清栈

如果函数的返回入的指令是 retn X 这样的形式,(比如函数需要3个参数,那么这里便是 retn 0C),在C语言中,意思就是这个函数是 _cdecl 属性的

而C语言中 _stdcall 在汇编层面表现就是函数以 retn 指令返回,而在call指令下面,有一条清栈的指令,一般为 add esp,X (如3个参数,X便为0C).(一般是紧接着的一条指令,但不一定,可能会因为改善代码密度等原因被编译器进行优化,推迟几条指令,或者几个CALL之后再批量清栈)

对于后种情况,直接将 CALL 指令 NOP 掉是最简单的修改方法
对于前种情况,可以像看雪老师给出的示例那样,在参数压栈之前便进行修改,便可以保持堆栈平衡,而如果要在CALL上做手脚的话,必须改为 add esp, X 的形式

当然只是为了说明原理,不同的方法都是正确的.
可以这样改:

::004012E5:: 6A 00 PUSH 0
::004012E7:: 68 68274000 PUSH 402768 \->: test2.exe
::004012EC:: 68 60274000 PUSH 402760 \->: Open
::004012F1:: 6A 00 PUSH 0
::004012F3:: FF15 B0224000 CALL NEAR DWORD PTR [4022B0] >>>: SHELL32.DLL:ShellExecuteA    // 这里改为 add esp,0x10
::004012F9
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seasoft 2007-3-17 22:01
4
0
为什么在push 0那里改,而不在push 5那里改?push 5是第一个参数啊.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seasoft 2007-3-17 23:16
5
0
谢谢!
不好意思!是我的代码没有贴完整!
游客
登录 | 注册 方可回帖
返回