All articles, tagged with “reverse engineering”

WIN32 逆向工程小记

  • IDA F5 功能生成的 C 代码只能作参考之用, 对于复杂的逻辑, 直接拿来用会被它带进沟里;
  • OllyDbg 应付应用层软件非常有效;
  • C/S 软件通常会采用好几轮的手段对收发的数据进行加密 (最后一轮也是最关键的一轮, 可能会采用变异的标准加密算法)

如果仅仅是为了使用算法, 且算法比较复杂, 最省力的方法当属直接将算法相关函数的汇编代码提取出来:

对于使用非 __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;
}
2010-03-28, Sunday 10:03 AM | 0 comments | 0 pingbacks | Tags:

关于 Yang Yubo

身处 IT 行业, 惯用 C/C++, 对 Python 情有独钟, 平时比较关注 QT / Django / Werkzeug 等. 了解更多 »