弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

error LNK2001: 外部シンボル "_lock" は未解決です。

ソースコードが存在しない.DLLファイルが1つあって、なぜソースコードを消さなければならなかったのかを考えていたのだけど、その理由がたぶんこれw。

1>HogeTuxedo.obj : error LNK2001: 外部シンボル "_lock" は未解決です。
1>HogeTuxedo.obj : error LNK2001: 外部シンボル "_unlock" は未解決です。
1>HogeTuxedo.obj : error LNK2001: 外部シンボル "flsall" は未解決です。
1>C:\Somewhere\HogeTuxedo\x64\Release\HogeTuxedo.dll : fatal error LNK1120: 3 件の未解決の外部参照

廃止された関数 _lock

.classファイルからjadでソースコードを復元するみたいに、 .DLLからソースコードを復元するにはHex-Raysを使う。v5.5/v6.1ウィルス付きw。 32ビットのリバースには32ビット版のHex-Raysを使う。

リバースしたソースコードを64ビットでコンパイル。 上手く動作するかはわからないw。なにしろソースコードを紛失しちゃってるのだからw。

  • Hex-RaysでC言語を生成。
  • Visual Studio 2015で空のプロジェクトを作成。
  • x64でビルド。
    error LNK2001: 外部シンボル "hoge" は未解決です。
    x86からx64のライブラリはリンクできない。
  • プロジェクトプロパティ、共通プロパティ、全般、構成の種類をダイナミックライブラリ(.dll)に設定。
    LNK1561 エントリー ポイントを定義しなければなりません。 HogeTuxedo
  • リンカーの入力、追加の依存ファイルに.libを追加。
  • プリプロセッサに_CRT_SECURE_NO_WARNINGSを追加。
  • 関数の定義をjavahが生成したものに変更。
    //signed int __stdcall Java_hoge_HogeTuxedo_hogeTrStart(LPCWSTR lpWideCharStr, int a2, int a3, int a4) //@@@
    JNIEXPORT jint JNICALL Java_hoge_HogeTuxedo_hogeTrStart(JNIEnv *lpWideCharStr, jclass a2, jstring a3, jstring a4)
    
  • インクルードファイルをいろいろ追加。
    #include 
    //#include 
    #include 	//@@@
    #include 	//@@@
    
  • Hex-Raysが生成したプロトタイプ宣言をコメントアウト。
    //int __stdcall Java_hoge_HogeTuxedo_hogeTrStart(LPCWSTR lpWideCharStr, int, int, int); // idb @@@
    
  • typedef追加。
    typedef unsigned char _BYTE;	//@@@
    typedef unsigned int _DWORD;	//@@@
    
  • new String(長さ)とdeleteのC++のロジックをmalloc/freeに書き換え。
  • flsall()を呼び出してるロジックなないみたいなのでコメントアウト。
  • sprintfのリバースコードがおかしい。
    char MultiByteStr; // [sp+28h] [bp-Ch]@2
    …
    sprintf(&MultiByteStr, "%s099", v13);
    
    これふつう落ちるだろ。
  • さて_lock()/_unlock()のとこをどうするか?

投稿されたコメント:

コメント
コメントは無効になっています。