首页
社区
课程
招聘
[求助]IDA 如何将 call eax 寄存器形式的call和函数联系起来?
发表于: 2015-6-3 13:11 10985

[求助]IDA 如何将 call eax 寄存器形式的call和函数联系起来?

2015-6-3 13:11
10985
例如如下代码:

注意call esi这行,GetProcAddress不是我的注释,鼠标点上去可以看到函数原型的提示,IDA明确提示call esi相当于call GetProcAddress.

现在我遇到了一处这么一条指令:
call eax
通过动态调试得知eax调用的是CreateFileA
那么我怎么做到上图中的效果?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很显然,mov esi,ds:GetProcAddress,这表明esi存入了一个常量,ida会记录每个寄存器存入常量的值,然后
再分析call esi的时候,自然回加注释说明是call GetProcAddress;
而如果eax 是一个变量,那么call eax,IDA是分析不出来的,也不会加注释,而且,很显然,call eax也不是一个
调用固定的子程序的语句,随着eax的值不同,call eax可能调用多个不同的子程序,你又如何给call eax加静态注释呢?只能动态跟踪。
2015-6-3 13:49
0
雪    币: 2332
活跃值: (3799)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
我的意思是,通过截图可以知道,IDA本身在功能上肯定是支持将寄存器和一个API联系起来的.
所以我想,如果我在知道call一条语句时寄存器指向的API,那么我可不可以告诉IDA,让它进行联系,达到和截图中一样的效果?
2015-6-3 13:52
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你没看明白我的回答吗,2楼就已经给你回答了,对于变量eax,call eax是未知的,不可以告诉你api.因为无法知道是哪个api,仔细阅读并理解我2楼的回答吧。你这次知道call eax是CreateFileA,那下次再执行到这里也许不是CreateFileA,而是GetProcAddress,那你自己加一个固定注释 call eax;CreateFileA,下次如果不是CreateFileA,那不是误导吗,会造成错误。
2015-6-3 13:53
0
雪    币: 2332
活跃值: (3799)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
好吧,我换个问法:
可否强制让IDA认为在
call eax
之前有一条mov eax:ds:CreateFileA指令的存在?
先不要管程序逻辑,这个和逻辑没有关系.我只是想知道IDA能否实现我想要的这个功能.
2015-6-3 14:16
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
加注释可以啊。右键Enter Comment
2015-6-3 14:42
0
雪    币: 81
活跃值: (100)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你调试的时候碰到的是CreateFileA,并不代表每次都是
2015-6-3 15:13
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
图中之所以能识别是因为调用目标来自IAT。肯定存在调用目的无法静态分析出来的情况,所以IDA中有unexplored item。
2015-6-3 18:31
0
雪    币: 2332
活跃值: (3799)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
其实这么问是因为最近在看一个样本,里面有类似的情况.
如果IDA分析不出来call eax对应的是那个call的话,就不可以F5.
除了patch为nop然后人肉纠正F5中的对应地方,还有其他方法没?
2015-6-5 19:21
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
IDA可能分析不出CALL的目标,但识别出CALL EAX本身应该没问题。你可以动态调试来获取实际调用的函数,
到该地址按P定义为函数,F5就是了
2015-6-5 21:45
0
雪    币: 2332
活跃值: (3799)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
我的问题是,在F5 sub_xxxx得时候ida报错,错误为无法分析call eax这行,而不是无法F5 sub_yyyy

sub_xxxx
....
call eax ; eax = yyyy
end

sub_yyyy
....
end
2015-6-5 21:51
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个看起来和调用目标没什么关系,象F5插件自己出毛病了。这样试试:
在反汇编窗口中点击sub_xxxx,使其成为当前函数,然后选Edit|Other里的
reset decompile information, 选中重置当前函数信息。

最后再F5看看行不行。
2015-6-6 21:13
0
雪    币: 35
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
挖个坟。这么多年过去了,不知道楼主解决没有,遗憾的是回复的各位大佬似乎没看懂楼主想要表达的内容。
call eax   IDA当然猜不出来,通过动态调试得知此处为CreateFileA,问的是能否在反汇编窗口将其命名为CreateFileA来协助IDA自动分析。
如果楼主知道了希望回复分享下解决方案,感恩
2022-4-12 10:53
0
雪    币: 7
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
kikyoulin 挖个坟。这么多年过去了,不知道楼主解决没有,遗憾的是回复的各位大佬似乎没看懂楼主想要表达的内容。 call eax IDA当然猜不出来,通过动态调试得知此处为CreateFileA,问的是能否在 ...
我觉得那些大佬都看懂了,他们已经明确的告诉你了,不可以!
2022-4-12 12:29
0
雪    币: 35
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

已经解决了,直接patch对应寄存器的值就行了。例如call eax,直接在前面eax赋值的时候mov eax,XXXXXX 函数地址,注意指令长度可能会破坏其他指令。我用的7.7可以直接右键反汇编(可能是插件),非常方便。

图片仅为举例,修改寄存器的数值后重新F5,看到的是正确的函数调用。

2022-4-12 15:03
0
游客
登录 | 注册 方可回帖
返回
//