好友
阅读权限 25
听众
最后登录 1970-1-1
本帖最后由 gmg2719 于 2023-3-3 00:01 编辑
需要解决的问题: 通常软件的一些重要的功能会分散的放到dll中,如果运行exe主程序的话,又很难达到条件去触发调用相应的dll,而且参数也不好控制。很难盲猜出dll的输入输出参数大致是什么样子的,会完成什么样的功能。虽然大部分破解 工具例如OllyDbg , 给出了LoadDll的方式,但是也只是加载的功能。没有提供对于里面各个导出函数的调用。
本工具的目的就是对于dll的各个导出函数进行参数盲猜,支持用户对于各个函数的功能进行自主调试,以期从宏观上把握某个dll是包含什么样的功能。
LoadDll_expert_dist.zip
(975.97 KB, 下载次数: 411)
v0.1----初始测试版本,支持win32 dll, 支持最多20个参数,支持对于dll调用结果导出,支持查看各个入参的地址,支持对于特定开始地址的内存查看,支持最多20个内存内容的提前设定,相当于支持传值调用和传地址调用
工具附件密码:52pojie (里面附有工具和一个demo的dll,目前仅支持win32 的dll , x64版本的还在开发调试中)
分别演示了传值调用和传地址调用等。 如果想对dll的执行细节进行调试,可以勾选采用debugger打开 LoadDll.exe, 勾选 Pause Before Loading DLL, 这样会在调用入口前插入INT3中断指令,这样就可以在调用dll之前就启动调试,可以追踪到更多细节。
提示:工具给出的调用约定和参数个数等信息只是根据反汇编指令推算的一个大致结果,不代表一定是正确的,使用者需要根据自己对于dll的反汇编分析结果进行更多微调。以便于获取正确的调用手段。
如下是采用本工具加载一个待测试的dll的运行截图。
如下是test.dll的函数定义
DWORD __declspec(dllexport) __fastcall ShowInfoFastCall( LPCSTR lpszText, LPCSTR lpszTitle, DWORD dwInfo )
{
return MessageBoxA( 0, lpszText, lpszTitle, dwInfo );
}
DWORD __declspec(dllexport) __cdecl ShowInfoCdecl( LPCSTR lpszText, LPCSTR lpszTitle, DWORD dwInfo )
{
return MessageBoxA( 0, lpszText, lpszTitle, dwInfo );
}
DWORD __declspec(dllexport) __cdecl add6_cdecl(DWORD i1, DWORD i2, DWORD i3, DWORD i4, DWORD i5, DWORD i6)
{
return (i1+i2+i3+i4+i5+i6);
}
DWORD __declspec(dllexport) __stdcall add6_stdcall(int i1, int i2, int i3, int i4, int i5, int i6)
{
return (i1 + i2 + i3 + i4 + i5 + i6);
}
DWORD __declspec(dllexport) __fastcall add6_fastcall(int i1, int i2, int i3, int i4, int i5, int i6)
{
return (i1 + i2 + i3 + i4 + i5 + i6);
}
DWORD __declspec(dllexport) __cdecl add7_cdecl(DWORD i1, DWORD i2, DWORD i3, DWORD i4, DWORD i5, DWORD i6, int i7)
{
return (i1 + i2 + i3 + i4 + i5 + i6+i7);
}
DWORD __declspec(dllexport) __stdcall add7_stdcall(int i1, int i2, int i3, int i4, int i5, int i6,int i7)
{
return (i1 + i2 + i3 + i4 + i5 + i6+i7);
}
DWORD __declspec(dllexport) __fastcall add7_fastcall(int i1, int i2, int i3, int i4, int i5, int i6, int i7)
{
return (i1 + i2 + i3 + i4 + i5 + i6+ i7);
}
DWORD __declspec(dllexport) __cdecl add8_cdecl(DWORD i1, DWORD i2, DWORD i3, DWORD i4, DWORD i5, DWORD i6, int i7, int i8)
{
return (i1 + i2 + i3 + i4 + i5 + i6 + i7+i8);
}
DWORD __declspec(dllexport) __stdcall add8_stdcall(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8)
{
return (i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8);
}
DWORD __declspec(dllexport) __fastcall add8_fastcall(int i1, int i2, int i3, int i4, int i5, int i6 , int i7 ,int i8)
{
return (i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8);
}
DWORD __declspec(dllexport) __cdecl add2_by_ref(DWORD *i1, DWORD *i2)
{
return (*i1 + *i2);
}
DWORD __declspec(dllexport) __cdecl add_array_by_ref(DWORD *i1, DWORD n)
{
DWORD result = 0;
for (int i = 0; i < n; i++)
{
result+=i1;
}
return result;
}
PBYTE __declspec(dllexport) __cdecl add_array_by_ref_return_address(DWORD *i1, DWORD n)
{
DWORD result = 0;
PBYTE presult = 0;
for (int i = 0; i < n; i++)
{
result += i1;
}
presult = (PBYTE)&result;
wchar_t addr[0x10];
wsprintf(addr, L"0x%08x ", presult);
MessageBox(0, addr, L"result",0);
return presult ;
}
免费评分
查看全部评分