首页
社区
课程
招聘
关于动态改变一个程序的汇编码的问题请教
2004-11-28 13:24 4447

关于动态改变一个程序的汇编码的问题请教

2004-11-28 13:24
4447
我在一个程序运行的时候 用钩子 把DLL加载到他的进程空间  我截获一个重要的函数 然后跳转到我的函数做处理 然后在跳回去
问题来了  我用vc做 vc编译器给我跳转的地方提我处理了一下汇编 也就是给我的代码前加了一段汇编 使我不能 正确跳转  但是delphi写的话就可以delphi没有给我的汇编码前做预处理

请以前做过的 指点小弟一二

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

收藏
免费 1
打赏
分享
最新回复 (13)
雪    币: 5
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
Dion_love 2004-11-28 13:25
2
0
RT
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-11-28 13:40
3
0
你希望拦截了他的 API,便跳到你的函数做处理吗  ? 为甚么你不能用直接的 call 去呼叫你的函数 ?  我不明白

我以前写拦截 API 的东西,就是当 dll 加载,便更新它的 IAT ,把我的函数位置写入去,当它呼叫 API 的时候,便会来到我的函数。我的函数格式跟原来的 API 设计成一样,在 C 原码里使用  “WINAPI” (等于 FAR PASCAL) 这个calling convention
eg : 拦截 MessageBoxA
我的函数宣告是
int WINAPI NewMessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT Type );
雪    币: 1593
活跃值: (761)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
luocong 9 2004-11-28 13:44
4
0
估计是VC生成的函数框架代码影响了你的代码,试试用naked:

void __declspec(naked) MyNakedFunction()
{
// Naked functions must provide their own prolog.
__asm
{
PUSH EBP
MOV ESP, EBP
SUB ESP, __LOCAL_SIZE
}

// Add your own code here...
// ......


// And we must provide epilog.
__asm
{
POP EBP
RET
}
}
雪    币: 257
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ViperDodge 1 2004-11-28 13:56
5
0
深有体会
void __declspec(naked)
确实减少了很多内嵌汇编的麻烦
雪    币: 5
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
Dion_love 2004-11-28 14:21
6
0
哦 受教  有没有在编译器上选择 选项 就可以把编译器加上的代码 去掉呢?
雪    币: 1593
活跃值: (761)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
luocong 9 2004-11-28 14:39
7
0
没有
雪    币: 5
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
Dion_love 2004-11-28 14:57
8
0
谢谢4楼5楼
雪    币: 5
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
Dion_love 2004-11-30 14:58
9
0
成功
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fredcc 2004-11-30 15:10
10
0
嗯 学习 void __declspec(naked) 是叫 编译器别自作聪明的加东西是吧 比如一些堆栈的保护。。
雪    币: 16
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
great1234 2004-11-30 15:31
11
0
收藏!
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-30 16:36
12
0
老罗最近可好?

哈,有时编译器就是自作聪明,我写了一个多线程读写同一个bLocked变量来同步的东东,线程1只写,线程2只读,在线程2中
...
while (bLocked);
dosomething();
...

结果它给我编译成了
mov al,bLocked
test al,al
jne label

call dosomething
...
ret

label:
jmp label

虽然我这样写有些不规范,但...
雪    币: 1593
活跃值: (761)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
luocong 9 2004-11-30 16:41
13
0
最初由 NoneName 发布
老罗最近可好?

哈,有时编译器就是自作聪明,我写了一个多线程读写同一个bLocked变量来同步的东东,线程1只写,线程2只读,在线程2中
...
while (bLocked);
........


呵呵,VC并没有编译错啊...
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-30 16:54
14
0
最初由 luocong 发布


呵呵,VC并没有编译错啊...


唉,都是我的错~~~~~
你的签名真有个性~:D
游客
登录 | 注册 方可回帖
返回