首页
社区
课程
招聘
[讨论]VC做在dll编译后多余代码,内有详细代码(第一次做)
发表于: 2009-8-11 12:49 4736

[讨论]VC做在dll编译后多余代码,内有详细代码(第一次做)

2009-8-11 12:49
4736
第一次做dll注入,目的是HOOK掉目标EXE中一个发包call,注入后调试总引起EXE崩溃,OD看代码发现dll中函数代码前面多了几行,dll中函数代码:
BYTE * __stdcall  MyFengBao::Getpack(void)
{
__asm
{
  push eax
  push edx
  mov eax, dword ptr [esp+0x10]
  mov edx, dword ptr [esp+0xC]
  pushad
  push eax
  push edx
  call m_Display
  popad
  pop edx
  pop eax
  push -1
  push 0x893908
  mov eax,0x5BD977             被HOOK掉的函数入口,跳回原函数
  jmp eax
}
return NULL;
}
现在已经成功HOOK掉EXE的发包函数,跳转到自己的Getpack,但是代码多出4行,引起EXE退出,OD里看具体代码:
0D411690    55              PUSH EBP                 从这行开始多出来
0D411691    8BEC            MOV EBP,ESP
0D411693    53              PUSH EBX
0D411694    56              PUSH ESI
0D411695    57              PUSH EDI                  到这行结束
0D411696    50              PUSH EAX             从这里开始是正常在代码
0D411697    52              PUSH EDX
0D411698    8B4424 10       MOV EAX,DWORD PTR SS:[ESP+10]
0D41169C    8B5424 0C       MOV EDX,DWORD PTR SS:[ESP+C]
0D4116A0    60              PUSHAD
0D4116A1    50              PUSH EAX
0D4116A2    52              PUSH EDX
0D4116A3    E8 08FEFFFF     CALL fengbao.0D4114B0
0D4116A8    61              POPAD
0D4116A9    5A              POP EDX
0D4116AA    58              POP EAX
0D4116AB    6A FF           PUSH -1
0D4116AD    68 08398900     PUSH 893908                              ; 入口地址
0D4116B2    B8 77D95B00     MOV EAX,5BD977
0D4116B7    FFE0            JMP EAX
0D4116B9    33C0            XOR EAX,EAX                    这后门4行也多出来在代码
0D4116BB    5F              POP EDI
0D4116BC    5E              POP ESI
0D4116BD    5B              POP EBX
0D4116BE    5D              POP EBP
0D4116BF    C3              RETN
正是多出来在这几行代码引起在问题,前面入栈后面出栈应该是VC编译系统自己加在,但是我在程序在0D4116B7    FFE0            JMP EAX就跳回原发包函数了,导致堆栈不平衡,请教高手指点
程序在XP SP2,VC2008编译,已经选了release模式,还是搞不定
先谢谢各位大大了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 462
活跃值: (53)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
2
用naked
2009-8-11 13:05
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
naked 没用过,有例子吗?
晚上回家搞下,先谢谢兄弟 了
2009-8-11 13:20
0
雪    币: 8209
活跃值: (4528)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
4
__declspec(naked)
2009-8-11 13:38
0
雪    币: 205
活跃值: (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
sub esp,4 ;开辟内存空间
2009-8-11 14:06
0
雪    币: 360
活跃值: (82)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
6
ccfer 正解
2009-8-11 14:37
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
从楼主的描述看不象是inline hook, 如果不是,就没必要嵌入汇编了,定义一个与原函数一样原型的Getpack,在Getpack中直接return 原函数(参数1,参数2)即可.
2009-8-11 14:46
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
太好了,确实去掉哪几行代码,回答完全正确,马上给kx

同时谢谢:7楼 半道出家,6楼 popeylj,5楼 echale,你们的热心是我学习的动力
2009-8-11 20:12
0
雪    币: 107
活跃值: (172)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
怎么解决的LZ分享一下啊
2009-8-11 21:30
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
正常情况下,我们用C语言写一个函数,编译器都要做一些优化,优化后的代码大量使用寄存器。

_declspec(naked)就是告诉编译器,不要优化这个函数,这样我们写的这个函数跟编译后反汇编的函数是一模一样的。

1.使用 naked 关键字需要自己构建 EBP 参数指针 (如果用到了 EBP 作为参数指针的话);
2.必须自己使用 RET 或 RET n 指令返回 (除非你不返回)。

_delcspec(naked)用在驱动编写,C语言内嵌汇编完成一些特定功能。
2009-8-12 02:27
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
早上起来看看自己的kx,发现9楼兄弟的问题,10楼已经回答了,讲还很详细,广海真好
2009-8-12 08:19
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
又学到新东西了。。
2009-8-22 02:52
0
游客
登录 | 注册 方可回帖
返回
//