精易论坛

标题: 取子程序真实地址 [打印本页]

作者: aiksie    时间: 2017-12-9 20:14
标题: 取子程序真实地址
本帖最后由 aiksie 于 2017-12-9 21:50 编辑

我百度搜索了下,论坛搜索了下,发现我看到的这些取子程序真实地址   源码,基本上都是有BUG的,不完全适用各种参数的子程序
一个非常简单的方法就能取到 子程序的真实地址,还用啥 汇编、API。。。。。
取子程序地址(&子程序)  这种子程序指针取到的并不是子程序真实的地址。
为啥要取子程序真实地址?  比如我需要 HOOK 某个地址, 如果我用的不是子程序真实地址,堆栈平衡就不好搞了。


原理:
每个子程序开头都是
push ebp
mov ebp,esp
只要判断 前3个字节,就能取到子程序的真实地址,用OD看一下就知道了。




  
子程序名返回值类型公开备 注
取子程序指针整数型 
参数名类 型参考可空数组备 注
子程序指针子程序指针
变量名类 型静态数组备 注
子程序地址整数型 
子程序起始整数型 
偏移整数型 
现行子程序地址整数型 
子程序地址 = 取子程序地址 (子程序指针)
子程序起始 = 子程序地址
判断循环首 ()
如果 (指针到字节集 (子程序起始, 1){ 232 })
子程序起始 = 子程序起始 + 1
偏移 = 指针到整数 (子程序起始)
子程序起始 = 子程序起始 + 4
现行子程序地址 = 子程序起始 + 偏移
如果 (指针到字节集 (现行子程序地址, 3){ 85, 139, 236 })
跳出循环 ()
子程序起始 = 子程序起始 - 4
到循环尾 ()


子程序起始 = 子程序起始 + 1

判断循环尾 ()
返回 (现行子程序地址)


i支持库列表   支持库注释   
spec特殊功能支持库


另一种方法参考:http://bbs.eyuyan.com/read.php?tid=405188&displayMode=1#3226136
原理:没有文本型参数的,子程序真实地址一般是在第一个call,有一个文本型参数的,子程序真实地址是在第二个call,有两个文本型参数的,子程序真实地址是在第3个call,以此类推。
相比较我写的,这种汇编写的 代码就少了很多。。很多
为了方便大家,他的代码我也给贴一下
  
子程序名返回值类型公开备 注
取子程序真实地址整数型 
参数名类 型参考可空数组备 注
子程序子程序指针
文本参数数量整数型
置入代码 ({ 139, 77, 12, 131, 193, 1, 139, 69, 8, 64, 128, 56, 232, 117, 250, 226, 248, 3, 64, 1, 131, 192, 5, 201, 194, 12, 0 })
' mov ecx,[ebp+12]
' add ecx,1
' mov eax,[ebp+8]
' xx:
' inc eax
' cmp byte [eax],232
' jne xx
' loop xx
' add eax,[eax+1]
' add eax,5
' leave
' ret 12
返回 (0)


取子程序指针.e (5.26 KB, 下载次数: 59)







补充内容 (2018-10-29 19:05):
心冷、鱼儿: 取子程序真实地址ASM版
  
子程序名返回值类型公开备 注
_pGetSubAddress整数型 取子程序真实地址
参数名类 型参考可空数组备 注
ptr子程序指针
' _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 eax,ebx ;把指针复制给eax返回
' jmp exit ;跳出循环
' jmp do ;继续循环
' exit:
' pop ecx
' pop ebx
' leave
' ret 08h
' }end
返回 (-1)

作者: 内存辅助定制    时间: 2017-12-9 20:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: 凌哥    时间: 2017-12-9 20:25
适用于任何call?
作者: aiksie    时间: 2017-12-9 20:34
凌哥 发表于 2017-12-9 20:25
适用于任何call?

基本上适用各种子程序, 你大可用OD一观




作者: Dkite    时间: 2017-12-9 20:47
#在这里快速回复#子程序起始 = 子程序起始 - 4 到循环尾 ()
作者: aiksie    时间: 2017-12-9 20:54
子程序的地址 不一定是在第一个call 或 第二个call 所以才要判断这3个字节



作者: 汉族    时间: 2017-12-9 21:24
找  JMP 跳转地址?
作者: 呵呵仙    时间: 2017-12-9 21:40
本帖最后由 呵呵仙 于 2017-12-9 21:45 编辑

好像发多一贴了!!
作者: 呵呵仙    时间: 2017-12-9 21:41
  
子程序名返回值类型公开备 注
取子程序指针2整数型 
参数名类 型参考可空数组备 注
子程序指针子程序指针
变量名类 型静态数组备 注
子程序地址整数型 
子程序起始整数型 
偏移整数型 
现行子程序地址整数型 
子程序地址 = 到整数 (子程序指针)
子程序起始 = 子程序地址
判断循环首 ()
如果 (指针到字节集 (子程序起始, 1){ 232 })
子程序起始 = 子程序起始 + 1
写到内存 (指针到字节集 (子程序起始, 4), 取变量地址 (偏移), 4)
子程序起始 = 子程序起始 + 4
现行子程序地址 = 子程序起始 + 偏移
如果 (指针到字节集 (现行子程序地址, 3){ 85, 139, 236 })
跳出循环 ()
子程序起始 = 子程序起始 - 4
到循环尾 ()

子程序起始 = 子程序起始 + 1

判断循环尾 ()
返回 (现行子程序地址)


i支持库列表   支持库注释   
spec特殊功能支持库

'谢谢开源,改了一下,让它也能支持E5.11

作者: 猥琐小胖子    时间: 2017-12-9 22:09
支持库里面就有 取子程序实际地址()
作者: aiksie    时间: 2017-12-9 22:15
猥琐小胖子 发表于 2017-12-9 22:09
支持库里面就有 取子程序实际地址()

哪个支持库呢?
作者: 猥琐小胖子    时间: 2017-12-9 22:31
aiksie 发表于 2017-12-9 22:15
哪个支持库呢?

特殊命令支持库,但这个取文本类型的参数子程序会出问题。我都用作坊的
  
子程序名返回值类型公开备 注
取子程序指针整数型 
参数名类 型参考可空数组备 注
子程序指针子程序指针
置入代码 ({ 139, 69, 8, 129, 56, 86, 87, 83, 232, 117, 10, 3, 64, 4, 131, 192, 8, 201, 194, 4, 0 })
置入代码 ({ 81, 82, 139, 77, 8, 139, 209, 139, 1, 61, 86, 87, 83, 141, 117, 97, 65, 139, 1, 61, 91, 95, 94, 194, 117, 16, 129, 121, 251, 232, 0, 0, 0, 117, 5, 139, 81, 252, 3, 209, 235, 68, 61, 86, 81, 80, 232, 116, 247, 37, 255, 255, 255, 0, 61, 243, 165, 232, 0, 117, 10, 131, 193, 7, 139, 81, 252, 3, 209, 235, 225, 37, 255, 255, 0, 0, 61, 171, 232, 0, 0, 117, 5, 131, 193, 6, 235, 15, 37, 255, 0, 0, 0, 61, 232, 0, 0, 0, 117, 8, 131, 193, 5, 139, 81, 252, 3, 209, 235, 162, 137, 85, 8, 90, 89 })
返回 (到整数 (子程序指针))


作者: 猥琐小胖子    时间: 2017-12-9 22:31
aiksie 发表于 2017-12-9 22:15
哪个支持库呢?

特殊命令支持库,但这个取文本类型的参数子程序会出问题。
  
子程序名返回值类型公开备 注
取子程序指针整数型 
参数名类 型参考可空数组备 注
子程序指针子程序指针
置入代码 ({ 139, 69, 8, 129, 56, 86, 87, 83, 232, 117, 10, 3, 64, 4, 131, 192, 8, 201, 194, 4, 0 })
置入代码 ({ 81, 82, 139, 77, 8, 139, 209, 139, 1, 61, 86, 87, 83, 141, 117, 97, 65, 139, 1, 61, 91, 95, 94, 194, 117, 16, 129, 121, 251, 232, 0, 0, 0, 117, 5, 139, 81, 252, 3, 209, 235, 68, 61, 86, 81, 80, 232, 116, 247, 37, 255, 255, 255, 0, 61, 243, 165, 232, 0, 117, 10, 131, 193, 7, 139, 81, 252, 3, 209, 235, 225, 37, 255, 255, 0, 0, 61, 171, 232, 0, 0, 117, 5, 131, 193, 6, 235, 15, 37, 255, 0, 0, 0, 61, 232, 0, 0, 0, 117, 8, 131, 193, 5, 139, 81, 252, 3, 209, 235, 162, 137, 85, 8, 90, 89 })
返回 (到整数 (子程序指针))


作者: 凌哥    时间: 2017-12-10 08:59
aiksie 发表于 2017-12-9 20:34
基本上适用各种子程序, 你大可用OD一观

我的意思是,这个地址同样兼容调用某些api函数传递的子程序地址吗,用作回调的
作者: aimee400    时间: 2017-12-10 11:00
用到了,谢谢
作者: aikutv    时间: 2017-12-15 00:13
感谢分享学习学习
作者: 11116677    时间: 2017-12-15 08:21
        支持开源~!感谢分享
作者: 共舞    时间: 2017-12-15 15:34
感谢分享,论坛因你更精彩
作者: gaoqing    时间: 2017-12-19 13:29
谢谢支持开源
作者: 梁业    时间: 2019-6-9 07:32
能答到什么效果
作者: 二指缠    时间: 2019-7-11 16:03
谢谢,参考一下,可能用到。
子程序地址 = 取子程序地址 (子程序指针)
子程序起始 = 子程序地址
这两行,其实就是:子程序起始 =到整数(子程序指针)





欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4