EXE/DLLなどのリソースをTreeViewで表示する[iResEditor.js]
実行ファイルのリソースをTreeViewで表示する方法です。
使用するライブラリの入手
iResEditor
http://www.petitmonte.com/labo/iResEditor/
jQuery (1.2.6)
https://jquery.com
https://developers.google.com/speed/libraries/
※バージョンは"1.2.6"です。
jquery-treeview
https://github.com/jzaefferer/jquery-treeview
全てダウンロードしたらファイルの構成は次のようにします。
サンプルの実行結果
サンプルコード - Sample code
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="jquery.treeview.css">
<style>
a {
color:#4169e1;
text-decoration:none;
}
a:hover {
color:#6495ed;
text-decoration:underline;
}
</style>
<script src="jquery.min.js"></script>
<script src="jquery.treeview.js"></script>
<script src="zip.min.js"></script>
<script src="iResEditor.js"></script>
<script>
var ResEditor;
function onDragOver(event){
event.preventDefault();
}
function onDrop(event){
onAddFile(event);
event.preventDefault();
}
function htmlspecialchars(str){
return (str + '').replace(/&/g,'&')
.replace(/"/g,'"')
.replace(/'/g,''')
.replace(/</g,'<')
.replace(/>/g,'>');
}
// リソースストリームを取得する(RAW)
function getResStream(resType,resNameID,resLangID){
var Resource = ResEditor.PEAnalyst.Resource;
for(var i=0;i<Resource.Language.length;i++){
// 種類
var IntegerID;
if(Resource.Type.ResourceDirectoryEntries[Resource.Language[i].parent].ResourceNameFlg){
IntegerID = Resource.Type.ResourceDirectoryEntries[Resource.Language[i].parent].ResourceName;
}else{
IntegerID = Resource.Type.ResourceDirectoryEntries[Resource.Language[i].parent].IntegerID;
}
// 種類とIDが一致
if(IntegerID === resType && Resource.Language[i].resNameID === resNameID){
for(var j=0;j<Resource.Language[i].ResourceDirectoryEntries.length;j++){
// 言語IDが一致
if(Resource.Language[i].ResourceDirectoryEntries[j].IntegerID === resLangID){
// 該当リソースの取得
ResEditor._BIN.Pos = Resource.Language[i].ResourceDataEntry[j].DataRVA - ResEditor._ResourceRVA;
return ResEditor._BIN.Read(Resource.Language[i].ResourceDataEntry[j].Size);
}
}
}
}
return;
}
// リソースの表示
function ShowResource(resType,resNameID,resLangID){
// 指定されたコンパイル済みリソース(RAWデータ)をUint8Array型で取得する
var raw = getResStream(resType,resNameID,resLangID);
/*
コンパイル済みリソースは、以下のクラスで展開可能です。(iResEditor.js参照)
※Dialog,Menu,StringTableはResEditor.Editを使用する方法もあります。
TStringResDecode
TMessageResDecode
TDialogResDecode
TMenuResDecode
TIconResDecode
TCursorResDecode
TBitmapResDecode
上記外以外のリソースは各自でクラスを追加して展開して下さい。
*/
// ... ここに処理を追加する
// サンプル用
alert('resType = ' + resType + '\n' +
'resNameID = ' + resNameID + '\n' +
'resLangID = ' + resLangID + '\n' );
}
// ツリービューの生成
function CreateTreeView(){
var HTML;
var Resource = ResEditor.PEAnalyst.Resource;
HTML = '<ul id="TreeView" class="filetree">';
// Resource
if (Resource){
var type = Resource.Type;
var lang = Resource.Language;
HTML += '<li><span class="folder">Resource</span>';
HTML += '<ul>';
// リソースの種類毎
for(var i=0;i<type.ResourceDirectoryEntries.length;i++){
var directory = htmlspecialchars(type.ResourceDirectoryEntries[i].ResourceTypeName);
// リソースタイプ
var resType;
if(type.ResourceDirectoryEntries[i].ResourceNameFlg){
resType = "'" + htmlspecialchars(type.ResourceDirectoryEntries[i].ResourceTypeName) + "'";
}else{
resType = type.ResourceDirectoryEntries[i].IntegerID;
}
HTML += '<li class="closed"><span class="folder">' + directory + '</span>';
HTML += '<ul>';
for(var j=0;j<lang.length;j++){
// 同一リソース
if(lang[j].parent === i){
// リソースID
var resNameID;
if(typeof lang[j].resNameID === "string"){
resNameID = htmlspecialchars(lang[j].resNameID);
}else{
resNameID = lang[j].resNameID;
}
// 多言語未対応
var identifier;
if(lang[j].ResourceDirectoryEntries.length === 1){
// 言語ID
if (lang[j].ResourceDirectoryEntries[0].ResourceNameFlg){
identifier = lang[j].ResourceDirectoryEntries[0].ResourceName;
}else{
identifier = lang[j].ResourceDirectoryEntries[0].IntegerID;
}
HTML += '<li><span class="file">';
if(typeof lang[j].resNameID === "string"){
HTML += '<a href="#" onclick="ShowResource('+ resType +',\''+
resNameID+'\','+
identifier +');return false;">'+ resNameID + ' : ' + identifier +'</a>';
}else{
HTML += '<a href="#" onclick="ShowResource('+ resType +','+
resNameID+','+
identifier +');return false;">'+ resNameID + ' : ' + identifier +'</a>';
}
HTML += '</span></li>';
// 多言語対応
}else{
HTML += '<li class="closed"><span class="folder">'+ resNameID +'</span>';
HTML += '<ul>';
for(var k=0;k<lang[j].ResourceDirectoryEntries.length;k++){
// 言語ID
if (lang[j].ResourceDirectoryEntries[k].ResourceNameFlg){
identifier = lang[j].ResourceDirectoryEntries[k].ResourceName;
}else{
identifier = lang[j].ResourceDirectoryEntries[k].IntegerID;
}
HTML += '<li><span class="file">';
if(typeof lang[j].resNameID === "string"){
HTML += '<a href="#" onclick="ShowResource('+ resType +',\''+
resNameID+'\','+
identifier +');return false;">'+ identifier +'</a>';
}else{
HTML += '<a href="#" onclick="ShowResource('+ resType +','+
resNameID+','+
identifier +');return false;">'+ identifier +'</a>';
}
HTML += '</span></li>';
}
HTML += '</ul>';
HTML += '</li>';
}
}
}
HTML += '</ul>';
HTML += '</li>';
}
HTML += '</ul>';
HTML += '</li>';
}
HTML += '</ul>';
document.getElementById('TreeView_Area').innerHTML = HTML;
$("#TreeView").treeview();
}
function onAddFile(event) {
var files;
var reader = new FileReader();
var filename;
if(event.target.files){
files = event.target.files;
}else{
files = event.dataTransfer.files;
}
reader.onload = function (event) {
var stream = new Uint8Array(reader.result);
try{
// PEファイルの読み込み
ResEditor = new TResEditor(filename);
ResEditor.LoadFromStream(stream,true,true);
if(ResEditor.PEAnalyst.IsPacked){
alert('このファイルは圧縮されています。');
return;
}
if(!ResEditor.PEAnalyst.Resource){
alert('このファイルはリソースがありません。');
return;
}
// TreeViewの生成
CreateTreeView();
}catch(e){
alert('Error : ' + e);
}
};
if (files[0]){
filename = files[0].name;
reader.readAsArrayBuffer(files[0]);
document.getElementById("inputfile").value = '';
}
}
</script>
</head>
<body ondrop="onDrop(event);" ondragover="onDragOver(event);">
<div style="height:500px;width:500px;">
<input type="file" id="inputfile" onchange="onAddFile(event);" >
<p></p>
<div id="TreeView_Area"></div
</div>
</body>
</html>
iResEdtor関連記事
リソースの文字列を編集する
リソースをRCファイルへ変換する
リソースをRESファイルへ変換する
リソースをバイナリファイルで抽出する
コードセクションを抽出する
データセクションを抽出する
全てのセクションを抽出する
エキスポート情報をCSVに変換する
インポート情報をテキストに変換する
隠しコードを取得する
リソースをTreeViewで表示する
スポンサーリンク
関連記事
公開日:2016年07月21日 最終更新日:2016年08月13日
記事NO:02087
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









