精易论坛
标题:
取子程序真实地址ASM版
[打印本页]
作者:
心冷、鱼儿
时间:
2018-7-11 12:15
标题:
取子程序真实地址ASM版
自己写HOOK的时候,发现hook类一直有问题,遂跟了下,发现是易语言的包装函数会导致ecx的值清0
导致调用类方法的时候错误,就百度了下取子程序真实地址,发现很多有错误,还有有文本参数的取不出来
便根据
aiksie
开源的方法写了汇编的,效率没测试,里面有对比完全正确。
QQ截图20180711120746.jpg
(155.74 KB, 下载次数: 0)
下载附件
2018-7-11 12:13 上传
作者:
雨后风细微
时间:
2018-7-11 12:23
子程序名
返回值类型
公开
备 注
_取子程序真实地址
整数型
参数名
类 型
参考
可空
数组
备 注
子程序指针
子程序指针
置入代码
(
{
83, 81, 139, 69, 8, 64, 139, 8, 128, 249, 232, 117, 248, 139, 72, 1, 141, 92, 8, 5, 139, 11, 193, 225, 8, 129, 249, 0, 85, 139, 236, 141, 64, 4, 117, 225, 139, 195, 89, 91, 201, 194, 4, 0
}
)
.版本 2
.子程序 _取子程序真实地址, 整数型, 公开
.参数 子程序指针, 子程序指针
置入代码 ({ 83, 81, 139, 69, 8, 64, 139, 8, 128, 249, 232, 117, 248, 139, 72, 1, 141, 92, 8, 5, 139, 11, 193, 225, 8, 129, 249, 0, 85, 139, 236, 141, 64, 4, 117, 225, 139, 195, 89, 91, 201, 194, 4, 0 })
这是我自用的。。。
作者:
反客为主
时间:
2018-7-11 12:28
学习,,,,,,
作者:
花开一半
时间:
2018-7-11 13:29
谢谢分享啊
作者:
这就是用户名
时间:
2018-7-11 13:35
看看
作者:
搞事
时间:
2018-7-11 13:46
不错哟~~
作者:
Fate
时间:
2018-7-11 14:05
支持一下
作者:
cdk3344520
时间:
2018-7-11 14:46
感觉好厉害的样子
作者:
529512527
时间:
2018-7-11 21:47
先看看???
作者:
wo33201
时间:
2018-7-11 22:16
先看看???
作者:
aa304048020
时间:
2018-7-12 04:09
我是新手
作者:
wanzhenghe999
时间:
2018-7-12 13:52
不错,楼主给力.
作者:
Su·
时间:
2018-7-12 21:17
不错,楼主给力.
作者:
毛超
时间:
2018-7-13 10:00
加油 加油
作者:
LBrowser
时间:
2018-7-13 20:57
伸手拿了,顺便亲了你一下
作者:
腾龙跃然
时间:
2018-7-16 01:08
#在这里快速回复效果自看
作者:
89496414
时间:
2018-7-17 12:39
666666666666666
作者:
益脑三通
时间:
2018-7-31 13:13
汇编部分咋没 植入代码的
作者:
胖虎O
时间:
2022-4-8 23:58
看一下谢谢了
作者:
aadada
时间:
2022-5-28 21:57
看起来不错
作者:
猫神父
时间:
2023-4-12 18:30
兼容类内方法、DLL函数,特此引入局部变量,返回值时用局部变量,让编译器自己平衡堆栈
子程序名
返回值类型
公开
备 注
_pGetSubAddress
整数型
取子程序真实地址
参数名
类 型
参考
可空
数组
备 注
ptr
子程序指针
变量名
类 型
静态
数组
备 注
RealPtr
整数型
RealPtr = -1
' _asm
{
' push ebx ;保存寄存器以免错误
' push ecx
' mov eax,dword
[
ebp+08h
]
;获取到子程序地址
' do: ;循环标记
' inc eax ;指针+1
' cmp byte
[
eax
]
,232 ;判断是不是call
' jne do ;不是就继续判断是不是call
' inc eax
' mov ecx,dword
[
eax
]
;如果是call,获取到call的偏移地址
' add eax,04h
' lea ebx,dword
[
eax+ecx
]
;call的地址
' cmp byte
[
ebx
]
,85 ;判断是不是子程序开头
' jne do
' cmp byte
[
ebx+01h
]
,139
' jne do
' cmp byte
[
ebx+02h
]
,236
' jne do
' mov
[
ebp-4
]
,ebx ;把指针局部变量返回
' jmp exit ;跳出循环
' jmp do ;继续循环
' exit:
' pop ecx
' pop ebx
'
}
end
' 将leave和ret保留给编译器处理,以应对更多环境
返回
(
RealPtr
)
.版本 2
.子程序 _pGetSubAddress, 整数型, , 取子程序真实地址
.参数 ptr, 子程序指针
.局部变量 RealPtr, 整数型
RealPtr = -1
' _asm{
' push ebx ;保存寄存器以免错误
' push ecx
' mov eax,dword [ebp+08h] ;获取到子程序地址
' do: ;循环标记
' inc eax ;指针+1
' cmp byte [eax],232 ;判断是不是call
' jne do ;不是就继续判断是不是call
' inc eax
' mov ecx,dword [eax] ;如果是call,获取到call的偏移地址
' add eax,04h
' lea ebx,dword [eax+ecx] ;call的地址
' cmp byte [ebx],85 ;判断是不是子程序开头
' jne do
' cmp byte [ebx+01h],139
' jne do
' cmp byte [ebx+02h],236
' jne do
' mov [ebp-4],ebx ;把指针局部变量返回
' jmp exit ;跳出循环
' jmp do ;继续循环
' exit:
' pop ecx
' pop ebx
' }end
' 将leave和ret保留给编译器处理,以应对更多环境
返回 (RealPtr)
作者:
qq420345437
时间:
2024-8-20 05:11
谢谢大佬分享
作者:
Easy易人
时间:
2024-8-29 13:08
谢谢大佬分享
欢迎光临 精易论坛 (https://125.confly.eu.org/)
Powered by Discuz! X3.4