引言
有时候,可能因为硬盘损坏等等原因,自己曾经写的动态链接库源码丢失了,幸好对应的头文件得以保留了下来,这个动态链接库主要是某种算法的实现,并没有继承其他的一些类库,比如MFC之类的,而自己对算法的实现已经忘得差不多了,而突然又需要该算法的实现过程,那么有什么办法可以帮助我们呢?
一个很好的办法就是采用IDA进行反编译,如果dll只是C语言的导出,那么反编译代码应该比较好看懂!(不过有一个难题是结构体的识别)
假如dll是C++类的导出,那么问题就比较复杂了,C++类成员函数中有隐含的this指针,直接反编译的话对成员函数的操作非常难以识别,此时自然而然就想到了在头文件上做文章,而IDA只支持导入C语言格式的头文件,直接导入C++头文件会报错,无法识别C++语法,那么应该怎么利用C++的头文件呢?
经过在互联网上的一番搜索,竟然没搜到类似的问题及解决办法,只能自己进行思考和尝试了。
其实,C++的类class是在C语言的结构体struct基础上发展而来的,多了成员函数的概念以及权限的控制,而成员函数其根本就是在调用时传入this指针,那么能否把C++的类手动改成C语言的格式呢?答案是可行的。
解决方法
假设某个C++类的头文件如下所示:
AA.h
class CAA{
public:
CAA();
~CAA();
public:
int m_a;
float m_b;
double* m_c;
public:
void testA(int pa,short pb,double pc);
void testB();
void testC(float* x,float* y);
}
那么应该如何修改才能让IDA识别呢?
AA_C.h
struct CAA{
int m_a;
float m_b;
double* m_c;
};
CAA::CAA();
CAA::~CAA();
void CAA::testA(int pa,short pb,double pc);
void CAA::testB();
void CAA::testC(float* x,float* y);
修改成这种形式之后,即可正确导入,问题解决。
标签:反编译,头文件,void,float,库时,C++,CAA From: https://blog.csdn.net/m0_67194883/article/details/139349766