首页
社区
课程
招聘
[求助]关于动态加载的dll找函数参数问题
发表于: 2014-9-28 23:13 5675

[求助]关于动态加载的dll找函数参数问题

2014-9-28 23:13
5675
这两天碰到一个奇怪的dll
其中一个函数CallTax通过ida直接反汇编查看,可以看出只有两个函数,ida,F5结果:
int __stdcall CallTax(char *src, int a2)
{
  int result; // eax@2

  if ( handle )
    result = sub_404194(handle, src, a2);
  else
    result = 900;
  return result;
}


然后动态追踪了一下,看了一下函数体的代码部也是两个参数

06EE3DAC   push        ebp
06EE3DAD   mov         ebp,esp
06EE3DAF   mov         eax,[06F02874]
06EE3DB4   test        eax,eax
06EE3DB6   jz          CallTax+0x1F (06EE3DCB)
06EE3DB8   mov         edx,[ebp+0xC]
06EE3DBB   push        edx
06EE3DBC   mov         ecx,[ebp+0x8]
06EE3DBF   push        ecx
06EE3DC0   push        eax
06EE3DC1   call        sub_098D4194 (06EE4194)
06EE3DC6   add         esp,0xC
06EE3DC9   jmp         CallTax+0x24 (06EE3DD0)

06EE3DCB   mov         eax,0x384
06EE3DD0   pop         ebp
06EE3DD1   ret         0x8 //return 0x8应该是两个参数


所以我尝试写一个方法去调用,但是缺发生了内存拒绝访问的问题[access violation]。

一般调用dll内存访问拒绝是什么问题呢?
参数数量不对,或者是参数类型不对?
按说应该不会是参数本身传入的问题,如果参数本身传入不正确,dll程序应该会处理然后返回值才对。

首先,我觉的可以排除参数数量的问题,现在就集中在了参数类型问题上。
第一个参数是char*这点可以确认,第二个参数通过ida的F5为int型,但是通过动态调试,发现这个参数入栈的时候是一个固定的地址。
下面是调用部分的代码:


005498E7   mov         byte ptr [0060EF84],1
005498EE   lea         eax,[ebp-0x18]
005498F1   mov         edx,0x549ADC        ; "20"
005498F6   call        sub_00404984 (00404984)
005498FB   lea         eax,[ebp-0x18]
005498FE   push        eax
00549903   dec         dword ptr [ecx+0x438DF845]
00549909   add         al,0xE8
0054990B   ???
00549911   add         al,0xBA
00549913   add         [edx],al
00549915   add         [eax],al
00549917   call        sub_00404F38 (00404F38)
0054991C   lea         eax,[ebx+0x4]
0054991F   push        eax
00549920   call        sub_005296A8 (005296A8)
00549925   mov         [0060EF7C],eax
0054992A   mov         ebx,[0060EF7C]
00549930   push        ebx     //这个地方传入了一个地址   [0060EF7C]  也就是eax原先的值
00549931   mov         eax,[ebp-0x8]
00549934   push        eax    //这个地方传入的是一个字符串
00549935   call        dword ptr [CallTax]


求各位大神给点思路。怀疑前面的几个call会给eax赋值,但是始终搞不清楚这个第二参数是什么值。
跪求

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
先看函数指针是否正确赋值
2014-9-28 23:17
0
雪    币: 64
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
//函数类型定义
type
CallTax = function(src: PChar; hwnd: Integer):Integer;stdcall;


src := PChar('20');
  try
  Tp:=GetProcAddress(Th,PChar('CallTax')); //这个地方拿到的地址是2ED3DAC,但是在exeScope里查看的地址不是这个,这个两个地址应该是一致的吗?还是dll被load以后,对应的地址也是变化的?如何去确认地址是否正确呢?
    if Tp<>nil then begin
      Tf:=CallTax(Tp);
      rtn := Tf(src, 0);
      if rtn = 0 then
        ShowMessage('Call ok')
      else
        ShowMessage('Call failed');

    end
    else
      ShowMessage('CallTax函数没有找到');
  finally
    //FreeLibrary(Th); {释放DLL}
  end

2014-9-28 23:26
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
传过去的第二个参数也许是一个内存地址~
2014-9-29 00:05
0
雪    币: 64
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我现在怀疑可能是一个指针。但是不知道怎么去还原指针的类型,求大神们给点思路
2014-9-29 00:12
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
在这个call内部不是还往别处传递了一次吗!看更深一层是怎么用这个参数的
2014-9-29 09:04
0
雪    币: 64
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
再深入一层好像是使用一个文件,system32下的一个JsImportCtrL.log。
他使用log后缀来伪装,但是文件一直没有增长,我试着用二进制文本去读,但是也不是PE文件。

麻烦有大神能给看看这个文件是什么类型的么?

上午又看了一下,这个Log文件应该是一个加密后的dll,程序通过这个Log文件来生成了我们前面所调用的dll,现在问题又回到了原点。奶奶的。
现在已经有了这个dll。
还是调用时候的问题。

求大神给点dll反汇编,找参数,以及参数类型的资料~感谢~~~
上传的附件:
2014-9-29 12:26
0
游客
登录 | 注册 方可回帖
返回
//