Yang Yubo's Life @ Refactoring

WIN32 逆向工程纪要

written on Sunday, March 28, 2010

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

对于使用非 __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;
}

This entry was tagged Crack

blog comments powered by Disqus