1. 程式人生 > 其它 >NX二次開發-C++使用IDA Pro反編譯dll,檢視裡面使用的API函式(三部曲1)

NX二次開發-C++使用IDA Pro反編譯dll,檢視裡面使用的API函式(三部曲1)

一年前我寫過一個C#反編譯dll檢視程式碼系列

NX二次開發-C#使用DllImport呼叫libufun.dll裡的UF函式(反編譯.net.dll)呼叫loop等UF函式(三部曲1)

NX二次開發-C#使用DllImport呼叫libufun.dll裡的UF函式學習方法及tag轉handle例子(三部曲2)

NX二次開發-C#使用DllImport呼叫libugui.dll裡的內部函式自動將NX標題設定為prt路徑例子(三部曲3)

今天寫一下C++反編譯dll檢視程式碼系列

也是準備的三部曲,這是三部曲1

NX二次開發-C++使用IDA Pro反編譯dll,檢視裡面使用的API函式(三部曲1)

  • 演示版本:

NX9+VS2012

  • 操作步驟

1.自己在VS裡用NX開發嚮導寫一份程式碼(簡單例子)

//NX9_NXOpenCPP_Wizard2

// Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h>

// Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx>

// Internal+External Includes
#include <NXOpen/Annotations.hxx> #include <NXOpen/Assemblies_Component.hxx> #include <NXOpen/Assemblies_ComponentAssembly.hxx> #include <NXOpen/Body.hxx> #include <NXOpen/BodyCollection.hxx> #include <NXOpen/Face.hxx> #include <NXOpen/Line.hxx> #include <NXOpen/NXException.hxx> #include
<NXOpen/NXObject.hxx> #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include <NXOpen/Session.hxx> #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> // Std C++ Includes #include <iostream> #include <sstream> using namespace NXOpen; using std::string; using std::exception; using std::stringstream; using std::endl; using std::cout; using std::cerr; //------------------------------------------------------------------------------ // NXOpen c++ test class //------------------------------------------------------------------------------ class MyClass { // class members public: static Session *theSession; static UI *theUI; MyClass(); ~MyClass(); void do_it(); void print(const NXString &); void print(const string &); void print(const char*); private: Part *workPart, *displayPart; NXMessageBox *mb; ListingWindow *lw; LogFile *lf; }; //------------------------------------------------------------------------------ // Initialize static variables //------------------------------------------------------------------------------ Session *(MyClass::theSession) = NULL; UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------ // Constructor //------------------------------------------------------------------------------ MyClass::MyClass() { // Initialize the NX Open C++ API environment MyClass::theSession = NXOpen::Session::GetSession(); MyClass::theUI = UI::GetUI(); mb = theUI->NXMessageBox(); lw = theSession->ListingWindow(); lf = theSession->LogFile(); workPart = theSession->Parts()->Work(); displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------ // Destructor //------------------------------------------------------------------------------ MyClass::~MyClass() { } //------------------------------------------------------------------------------ // Print string to listing window or stdout //------------------------------------------------------------------------------ void MyClass::print(const NXString &msg) { if(! lw->IsOpen() ) lw->Open(); lw->WriteLine(msg); } void MyClass::print(const string &msg) { if(! lw->IsOpen() ) lw->Open(); lw->WriteLine(msg); } void MyClass::print(const char * msg) { if(! lw->IsOpen() ) lw->Open(); lw->WriteLine(msg); } void MyTest() { UF_initialize(); //建立塊 UF_FEATURE_SIGN Sign = UF_NULLSIGN;//設定布林 double Corner_pt[3] = { 0.0, 0.0, 0.0 };//設定原點 char *Edge_Len[3] = { "100", "100", "100" };//設定長寬高 tag_t BlkTag = NULL_TAG; UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag); //特徵找體 tag_t body_tag = NULL_TAG; UF_MODL_ask_feat_body(BlkTag, &body_tag); //設定顏色 UF_OBJ_set_color(body_tag, 186); UF_terminate(); } //------------------------------------------------------------------------------ // Do something //------------------------------------------------------------------------------ void MyClass::do_it() { // TODO: add your code here MyTest(); } //------------------------------------------------------------------------------ // Entry point(s) for unmanaged internal NXOpen C/C++ programs //------------------------------------------------------------------------------ // Explicit Execution extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen ) { try { // Create NXOpen C++ class instance MyClass *theMyClass; theMyClass = new MyClass(); theMyClass->do_it(); delete theMyClass; } catch (const NXException& e1) { UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message()); } catch (const exception& e2) { UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what()); } catch (...) { UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception."); } } //------------------------------------------------------------------------------ // Unload Handler //------------------------------------------------------------------------------ extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; }

2.開啟IDA Pro,選擇上面程式碼編譯生成的C++ dll開始反編譯

開啟介面如下

點選Exports

我們可以檢視到ufusr這個入口函式

點選Import

我們可以檢視到當前這個dll裡所呼叫的所有UFUN函式和NXOPEN方法,以及這個UFUN函數出自哪個.dll裡

下面我們開始根據邏輯流程去反編譯程式碼

我們都知道nx二次開發的dll都是由ufusr這個入口函式開始載入的

我們先去函式視窗中找到ufusr_0這個函式,雙擊開啟它,右側彈出程式碼邏輯流程圖

下面開始解析介紹怎麼看流程

滑鼠縮小拖動找到最上面的塊,從ufusr開始看

然後順著箭頭往下找,我們找到了try 找到了new,在往下 我們就看到了MyClass::MyClass(void),是不是很熟悉,剛好這裡和我們寫的程式碼對應上了。

//------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
//  Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
    try
    {
        // Create NXOpen C++ class instance
        MyClass *theMyClass;
        theMyClass = new MyClass();
        theMyClass->do_it();
        delete theMyClass;
    }
    catch (const NXException& e1)
    {
        UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
    }
    catch (const exception& e2)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
    }
    catch (...)
    {
        UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
    }
}

看到這裡,我們在往下找,找到了do_it,我們知道一般用NX C++嚮導模板寫程式碼就是往do_it處寫的。

這裡我們直接雙擊點選do_it

看到這裡是不是就一目瞭然了,這就是我們平時最熟悉的ufun函數了,直接就可以看到自己寫的這個函式裡到底用了哪些API函數了。

然後在根據函式和for if對應的流程結構圖來推算功能的邏輯演算法,自己就可以重寫複製功能了。

我們在回到一開始的總流程圖裡,點ufusr_0,我們可以找到對應的NXOPEN的方法,所有的東西都在流程圖上,自己點選去慢慢看

  • 作為一名程式設計師開發者,追求的應該是不斷提升自己的開發技術,進大廠上班。

阿飛

2021年8月8日