00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "analy.h"
00022 #include "analy_alpha.h"
00023 #include "analy_names.h"
00024 #include "analy_register.h"
00025 #include "analy_java.h"
00026 #include "global.h"
00027 #include "class.h"
00028 #include "class_analy.h"
00029
00030 #include "htctrl.h"
00031 #include "htdebug.h"
00032 #include "htiobox.h"
00033 #include "htstring.h"
00034 #include "snprintf.h"
00035 #include "pestruct.h"
00036
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <string.h>
00040
00041
00042
00043
00044 void ClassAnalyser::init(ht_class_shared_data *Class_shared, ht_streamfile *File)
00045 {
00046 class_shared = Class_shared;
00047 file = File;
00048
00049 Analyser::init();
00050
00051 initialized->done();
00052 delete initialized;
00053 initialized = class_shared->initialized;
00055
00056 setLocationTreeOptimizeThreshold(100);
00057 setSymbolTreeOptimizeThreshold(100);
00058 }
00059
00060
00061
00062
00063
00064 int ClassAnalyser::load(ht_object_stream *f)
00065 {
00066 return Analyser::load(f);
00067 }
00068
00069
00070
00071
00072 void ClassAnalyser::done()
00073 {
00074 Analyser::done();
00075 }
00076
00077
00078
00079
00080 void ClassAnalyser::beginAnalysis()
00081 {
00082 char buffer[1024];
00083 char *b = buffer;
00084
00085 *(b++) = ';'; *(b++) = ' ';
00086 b = java_demangle_flags(b, class_shared->flags);
00087 b += ht_snprintf(b, 1024, "%s %s", (class_shared->flags & jACC_INTERFACE)?"interface":"class", class_shared->classinfo.thisclass);
00088 if (class_shared->classinfo.superclass) {
00089 b += ht_snprintf(b, 1024, " extends %s", class_shared->classinfo.superclass);
00090 }
00091 if (class_shared->classinfo.interfaces) {
00092 b += ht_snprintf(b, 1024, " implements");
00093 int count = class_shared->classinfo.interfaces->count();
00094 for (int i=0; i<count; i++) {
00095 b += ht_snprintf(b, 1024, " %y%c", class_shared->classinfo.interfaces->get(i), (i+1<count)?',':' ');
00096 }
00097 }
00098 b += ht_snprintf(b, 1024, " {");
00099
00100 Address *a = createAddress32(0);
00101 addComment(a, 0, "");
00102 addComment(a, 0, ";********************************************************");
00103 addComment(a, 0, buffer);
00104 addComment(a, 0, ";********************************************************");
00105 delete a;
00106 if (class_shared->methods) {
00107 ClassMethod *cm = NULL;
00108 Object *value;
00109 while ((cm = (ClassMethod*)class_shared->methods->enum_next(&value, cm))) {
00110 Address *a = createAddress32(cm->start);
00111 char buffer2[1024];
00112 java_demangle(buffer2, class_shared->classinfo.thisclass, cm->name, cm->type, cm->flags);
00113 ht_snprintf(buffer, 1024, "; %s", buffer2);
00114 addComment(a, 0, "");
00115 addComment(a, 0, ";----------------------------------------------");
00116 addComment(a, 0, buffer);
00117 addComment(a, 0, ";----------------------------------------------");
00118 addAddressSymbol(a, cm->name, label_func);
00119 pushAddress(a, a);
00120 delete a;
00121 }
00122 }
00123 setLocationTreeOptimizeThreshold(1000);
00124 setSymbolTreeOptimizeThreshold(1000);
00125
00126 Analyser::beginAnalysis();
00127 }
00128
00129
00130
00131
00132 OBJECT_ID ClassAnalyser::object_id() const
00133 {
00134 return ATOM_CLASS_ANALYSER;
00135 }
00136
00137
00138
00139
00140 UINT ClassAnalyser::bufPtr(Address *Addr, byte *buf, int size)
00141 {
00142 FILEOFS ofs = addressToFileofs(Addr);
00143 assert(ofs != INVALID_FILE_OFS);
00144 file->seek(ofs);
00145 return file->read(buf, size);
00146 }
00147
00148
00149
00150
00151 Address *ClassAnalyser::createAddress()
00152 {
00153 return new AddressFlat32(0);
00154 }
00155
00156
00157
00158
00159 Address *ClassAnalyser::createAddress32(ClassAddress addr)
00160 {
00161 return new AddressFlat32((dword)addr);
00162 }
00163
00164
00165
00166
00167 Assembler *ClassAnalyser::createAssembler()
00168 {
00169 return NULL;
00170 }
00171
00172
00173
00174
00175 FILEOFS ClassAnalyser::addressToFileofs(Address *Addr)
00176 {
00177 if (validAddress(Addr, scinitialized)) {
00178 return ((AddressFlat32*)Addr)->addr;
00179 } else {
00180 return INVALID_FILE_OFS;
00181 }
00182 }
00183
00184
00185
00186
00187 char *ClassAnalyser::getSegmentNameByAddress(Address *Addr)
00188 {
00189 static char sectionname[9];
00190 strcpy(sectionname, "test");
00191 return sectionname;
00192 }
00193
00194
00195
00196
00197 const char *ClassAnalyser::getName()
00198 {
00199 return file->get_desc();
00200 }
00201
00202
00203
00204
00205 const char *ClassAnalyser::getType()
00206 {
00207 return "Java-Class/Analyser";
00208 }
00209
00210
00211
00212
00213 void ClassAnalyser::initCodeAnalyser()
00214 {
00215 Analyser::initCodeAnalyser();
00216 }
00217
00218
00219 int class_token_func(char *result, int maxlen, dword token, void *context)
00220 {
00221 return token_translate(result, maxlen, token, (ht_class_shared_data *)context);
00222 }
00223
00224
00225
00226
00227 void ClassAnalyser::initUnasm()
00228 {
00229 DPRINTF("class_analy: ");
00230 analy_disasm = new AnalyJavaDisassembler();
00231 ((AnalyJavaDisassembler*)analy_disasm)->init(this, class_token_func, class_shared);
00232 }
00233
00234
00235
00236
00237 void ClassAnalyser::log(const char *msg)
00238 {
00239
00240
00241
00242
00243
00244
00245 }
00246
00247
00248
00249
00250 Address *ClassAnalyser::nextValid(Address *Addr)
00251 {
00252 return (Address *)class_shared->valid->findNext(Addr);
00253 }
00254
00255
00256
00257
00258 void ClassAnalyser::store(ht_object_stream *st)
00259 {
00260 Analyser::store(st);
00261 }
00262
00263
00264
00265
00266 int ClassAnalyser::queryConfig(int mode)
00267 {
00268 switch (mode) {
00269 case Q_DO_ANALYSIS:
00270 case Q_ENGAGE_CODE_ANALYSER:
00271 case Q_ENGAGE_DATA_ANALYSER:
00272 return true;
00273 default:
00274 return 0;
00275 }
00276 }
00277
00278
00279
00280
00281 Address *ClassAnalyser::fileofsToAddress(FILEOFS fileaddr)
00282 {
00283 Address *a = createAddress32(fileaddr);
00284 if (validAddress(a, scvalid)) {
00285 return a;
00286 } else {
00287 delete a;
00288 return NULL;
00289 }
00290 }
00291
00292
00293
00294
00295 bool ClassAnalyser::validAddress(Address *Addr, tsectype action)
00296 {
00297 if (!Addr->isValid() || !class_shared->valid->contains(Addr)) return false;
00298 switch (action) {
00299 case scinitialized:
00300 case sccode:
00301 return class_shared->initialized->contains(Addr);
00302 default:
00303
00304 return true;
00305 }
00306 }
00307
00308