WIN32 逆向工程小记
- IDA F5 功能生成的 C 代码只能作参考之用, 对于复杂的逻辑, 直接拿来用会被它带进沟里;
- OllyDbg 应付应用层软件非常有效;
- C/S 软件通常会采用好几轮的手段对收发的数据进行加密 (最后一轮也是最关键的一轮, 可能会采用变异的标准加密算法)
如果仅仅是为了使用算法, 且算法比较复杂, 最省力的方法当属直接将算法相关函数的汇编代码提取出来:
- 加载 IDA 脚本: http://bbs.pediy.com/showthread.php?s=&threadid=23231
- 将算法及其相关函数提取出来
- 保存成 .asm 文件, 修改函数中使用的外部变量, 并创建 DLL 函数输出表 (.def)
- 使用 masm32 将 .asm 编译成 DLL, 导出加密算法函数
对于使用非 __cdecl 调用约定的算法函数 (比如 __thiscall / __fastcall / __stdcall), 情况稍微复杂些. 大部分非 C/C++ 编程语言使用 __cdecl 约定来调用动态链接库暴露的 C 函数.
一个解决方法是, 修改 .asm 汇编代码, 直接把调用约定改成 __cdecl.
另外一个方法是: 再用 C 代码对 .asm 编译出的 DLL 封装一层, 生成一个使用 __cdecl 约定的新的 DLL.
如果用 Visual C++ 6.0 编译封装 DLL, 并恰巧碰上 __thiscall, 情况又更复杂些. VC++ 6.0 默认只支持类成员函数用 __thiscall 方式传递 this 指针, 对于 extern “C” 函数使用 __thiscall 修饰将报错.
解决方法是: 改用 VC 7.0 以上 (不要指望 GCC/MinGW, 它们对 __thiscall 的含义有不同的解释). 另外一个解决方法是: 在 VC 6.0 中使用内联汇编调用 __thiscall 约定的函数:
// __thiscall 使用 ecx 寄存器, 而不是压栈方式传递第一个参数
__asm {
mov ecx, first_param;
call YOUR_THISCALL_FUNC;
}