No.1
- 回答日時:
> 暇があればそうしたいのですが、あっと言う間もない人生の終りに近づくと焦ってしまい、かえって逆効果のようですね・・・ハイ。
んじゃなかったけ? なぜ、そんな時間の無駄な勉強が必要なことがしたいの?
ちなみにexeファイルは、そのままではアドレス関係か未解決なのでローディング処理をしないと実行出来ません。
と言うことでコメントも定番で、exeファイルの構造とOSの仕組みを勉強してください。あとC/C++のスタートアップの仕組みの理解かな。それをすれば出来るようになります。機械語も分からないと出来ません。
一番にコメントを頂きながら返事が遅くなり申し訳ありません。
さて、貴殿にはプログラム開発での心構えをご教授頂き感謝しています。
楽をして目的を達成すると言う「ずるい」私ですが、皆様のお力でなんとか課題は解決しております。
これに懲りず今後もよろしくお願い申し上げます。
VC++片手にがんばっています、
>・・・
>ローディング処理
>・・・
相対アドレス生成はこのコンパイラで可能でしょうか?
No.3
- 回答日時:
>>通常は実行ファイルをクリックするとOSがDLL等をマシン語に展開して実行しますが、
これは、どこから仕入れた情報ですか?すべてがそうとはいえません。
No.1さんがちょっと書かれていますが、そういうことが理解できるようになるまで先は長いと思います。でも、それを得るために費やした時間・努力は無駄にならないと思います。
小学1年生が微分・積分、三角関数など難しい数学を理解したいとと思うことは立派だけど、それらを理解できるようになるまでに学ぶことは、それなりに多いのと同じ。
一部の素質ある方は一気に理解できるかもしれませんが、普通のかたは、それ相応の学習時間が必要です。
なお、そういうことをやりたい動機は、ライセンス認証回避、プロテクト解除などが多いと思います。そういう動機であっても、プログラム解析で学べることは多いです。
私も、昔、あるソフトの動作を追いかけて、インストール回数制限のあるソフトを無制限版に改造したことありますけど、そのときにマシン語を理解しました。
がんばってください。
回答ありがとうございます。
この質問は様々な課題がありそうです。
私は基礎勉強もせず皆様のお力を借りてなんとか短時間に解決しようとがんばっています。
EXEファイルの実行は今は無理でも、簡単な4則計算からでも始めたいと思います。
開発はVC++ですがデバグ画面ではアセンブラコードが生成されるようですが、このコードのみ抽出する設定はできるでしょうか?
また、分岐やコールは相対アドレスで生成できるでしょうか?
読み込むメモリ上では、
先頭に変数エリアを、以降プログラム本体を置き、実行するアドレスは変数エリアを飛び越えた位置にします。
アセンブラ歴20年以上です。
専門家からすると意味不明なことを書いているかも知れませんが助言よろしくお願いします。
No.4
- 回答日時:
exeやdllを実行可能なバイナリとしてロードしたいのなら少なくとも
http://msdn.microsoft.com/en-us/windows/hardware …
この辺は理解できるようにならないと。
そこからさらに実行するのはまた別の話になりますが。
回答ありがとうございます。
ご紹介のページは英語のようですが、私は英語が苦手です。
VC++のデバグ画面にはマシン語が生成されているようですが、コードのみ抽出できないでしょうか?
絶対アドレスが含まれていなければ、どこのメモリーでも実行可能でしょうか?
基礎的なことを教えてください。
No.5
- 回答日時:
>ご紹介のページは英語のようですが、私は英語が苦手です。
では辞書を引きながらがんばって読んでください。
>VC++のデバグ画面にはマシン語が生成されているようですが、コードのみ抽出できないでしょうか?
16進ダンプ表示させて抜き出せばいいだけじゃ?
>絶対アドレスが含まれていなければ、どこのメモリーでも実行可能でしょうか?
最近のCPUとOSだとどこでも実行可能とは限りません。
>私は基礎勉強もせず皆様のお力を借りてなんとか短時間に解決しようとがんばっています。
他力本願という言葉知ってますか?
基礎勉強をがんばってください。
再度の回答ありがとうございます。
>最近のCPUとOSだとどこでも実行可能とは限りません。
この点はロードされるアドレスを指定出来ないことでもあり、絶対アドレスがメモリー上で一致するかが問題のようです。
ビルドではビルドした環境での絶対アドレスが生成されるようで、他の回答者様も指摘されたようにVC++では不可能であることがわかりました。
SNS即他力本願を助長するツールではないでしょうか?
ちょっとしたヒントでは解決しない課題は基礎勉強しかないようです。
No.6
- 回答日時:
相対アドレスでexeファイルや機械語を出力するコンパイラは存じません。
アセンブラで全部書けば、相対アドレスの機械語は生成可能です。
と言うかアセンブラ歴長いなら分かるでしょう?
セクションとかも理解されずにアセンブラ組まれているんでしょうか?
>セクションとかも理解されずにアセンブラ組まれているんでしょうか
winmain()関数のなかで_asmのインラインアセンブラで記述しています。
今までに機械語のみでアプリケーションを組んだ経験はありません。
でもご指摘のセクションについては、ロードアドレスを指定出来る様で興味深い参考資料ありがとうございました。
No.7
- 回答日時:
ああ、もう一つ突っ込みどころ。
そもそも普通にコンパイルしたコードは実行時に絶対アドレスが埋め込まれるので、デバッガじゃなくても実行時のオンメモリから機械語として取り出したら特定のアドレスでしか動かないんですが理解されてます?
他にも変数メモリの実行権限も理解されているか怪しいですね。
この回答への補足
>じゃなくても実行時のオンメモリから機械語として取り出したら特定のアドレスでしか動かないんですが理解されてます?
皆様の回答で何となく理解することができました。
オールアセンブラで絶対アドレスを使わないようにするか、ロードアドレスを指定するようにします。
>他にも変数メモリの実行権限も理解されているか怪しいですね。
buf = (unsigned char*)VirtualAlloc( (LPVOID)NULL, (DWORD)size,
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE );
PAGE_EXECUTEこのフラグでアクセス出来ないでしょうか?
No.8
- 回答日時:
「動かないretcode」「動くretcode」共にi8086系CPUだと何もせず帰るだけのコードのはずですが
「動かないretcode」なぜ動かなくて、「動くretcode」はなぜ動くかわかりますか?(MSDOSの頃だとたぶん「動かないretcode」の方も動くと思いますが)
// 動かない
char retcode[] = {
0xc3 // RET
};
// 動く
//void retcode(void)
//{
//}
void (*foo)(void) = (void (*)(void))&retcode;
int main(int argc, char **argv)
{
foo();
return 0;
}
再度の回答ありがとうございます。
push popが発生してretコードを見失ったのだと思います。
このアプリケーションの機械語をみるとわかるのですが・・・
理由は別にあるのでしょうか?
この調子でご指導ください。
No.9
- 回答日時:
念の為、確認しておきたいと思います
「アセンブリ歴20年」とのことですが、どのCPUを使った、どのOS用ですか?
CPUが違えばアセンブリも違い、OSが違えば同じCPUでもコードが違うことはご理解しているかと思います。
もし、組込み用の8bit程度のマイコンを念頭に置いているのなら、CPU、OSともに規模が段違いですから、そのアセンブリの知識はほとんど役立ちません。
現在XP,7マシンのwin32アプリケーションでインラインアセンブラで記述しています。
オールアセンブラでアプリケーションを仕上げた事はありません。
No.10
- 回答日時:
>push popが発生してretコードを見失ったのだと思います。
「動かないretcode」のどこにpush popが発生する余地があるんですか・・・
VisualStudioから実行してみればわかりますがretを見失って等いません。
int main(int argc, char ** argv[])
{
001B1E80 55 push ebp
001B1E81 8B EC mov ebp,esp
001B1E83 81 EC C0 00 00 00 sub esp,0C0h
001B1E89 53 push ebx
001B1E8A 56 push esi
001B1E8B 57 push edi
001B1E8C 8D BD 40 FF FF FF lea edi,[ebp-0C0h]
001B1E92 B9 30 00 00 00 mov ecx,30h
001B1E97 B8 CC CC CC CC mov eax,0CCCCCCCCh
001B1E9C F3 AB rep stos dword ptr es:[edi]
foo();
001B1E9E 8B F4 mov esi,esp
001B1EA0 FF 15 30 80 1B 00 call dword ptr ds:[1B8030h]
001B1EA6 3B F4 cmp esi,esp
001B1EA8 E8 9D F2 FF FF call __RTC_CheckEsp (01B114Ah)
return 0;
001B1EAD 33 C0 xor eax,eax
}
001B1EAF 5F pop edi
001B1EB0 5E pop esi
001B1EB1 5B pop ebx
001B1EB2 81 C4 C0 00 00 00 add esp,0C0h
001B1EB8 3B EC cmp ebp,esp
001B1EBA E8 8B F2 FF FF call __RTC_CheckEsp (01B114Ah)
001B1EBF 8B E5 mov esp,ebp
001B1EC1 5D pop ebp
001B1EC2 C3 ret
// 動かないretcode
001B802C C3 ret
>理由は別にあるのでしょうか?
というわけで別にあります。
理由は他の回答者が既に話に出してますので省略。
>この点はロードされるアドレスを指定出来ないことでもあり、絶対アドレスがメモリー上で一致するかが問題のようです。
それだけの話じゃありません。
>この調子でご指導ください。
もうしわけありませんが辞退させていただきます。
自力学習する気のない方のために貴重な時間をさく気はございません。
勉強する気はあるのですが、全般的にはとても時間が無く、今回の解決のためのポイントだけでも教えて頂けたら幸いです。
動かないコードは
001B802C番地をCPUがアクセスしないのが原因だと思いますが間違いでしょうか?
RETコードの置かれた変数エリアを直接アクセスカウントする必要があるような気がします。
又いい加減な返事をしましたが、所詮私のスキルはこの程度です。
是非正解をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) エクセルの実行ファイルについての質問です。 1 2023/05/04 03:58
- WordPress(ワードプレス) [BuddyPress]試したいのですが! 3 2022/06/01 13:36
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) 【VBAファイル移動】2つのマクロを順に実行。1つ目のマクロが実行不可⇒2つ目が実行不可となる件 2 2022/07/29 12:17
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- その他(セキュリティ) exeファイルの個人情報について 3 2023/06/29 17:36
- C言語・C++・C# pythonで外部のファイルを読み込む際のエラー 2 2022/04/12 19:22
- Excel(エクセル) 【Excel】hyperlink関数を解除してもハイパーリンクが活きるようにできますか? 3 2023/05/22 11:22
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
VBS実行時にコマンドプロンプト...
-
[teraterm] waitコマンドで停止...
-
エクセル フォルダの画像を画...
-
exeファイルを実行するとコマン...
-
「読み取りと実行」と「読み取...
-
VScodeのエラー解決法 Pythonの...
-
バッチファイルの内容を表示さ...
-
Powershellとコマンドプロンプト
-
これってパソコンの最適化が完...
-
いきなり。
-
VBscriptが起動しない?
-
pythonスクリプトを管理者権限...
-
VB.NETでのDOSコマンドを実行に...
-
Excel VBA ステップインが途中...
-
Linux Makefile変数の値をプロ...
-
MATLABでssを実行すると、未定...
-
DLLの登録をVBで行いたい(VB20...
-
Excelの、マクロ終了時にExcel...
-
ADOの非同期 Stateについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
exeファイルを実行するとコマン...
-
「読み取りと実行」と「読み取...
-
VBscriptが起動しない?
-
バッチファイルの内容を表示さ...
-
Excel VBA ステップインが途中...
-
[teraterm] waitコマンドで停止...
-
エクセル フォルダの画像を画...
-
ネットワーク名が見つかりません
-
VB.NETでのDOSコマンドを実行に...
-
Excel(エクセル) VBA プロシー...
-
複数のbatファイルを自動実行し...
-
Excelのセルの内容をコマンドプ...
-
PDFファイルを開き、印刷し、閉...
-
Access の VBA 実行中に他の操...
-
これってパソコンの最適化が完...
-
バッチファイルが不正終了して...
-
VScodeのエラー解決法 Pythonの...
-
VBA 既に開いているBookに継続...
-
WSH.Run の処理内容をテキスト...
おすすめ情報