java - Reading .class file -
i'm trying learn how read java class file using c++. can me figure out why accessflag prints 0? lowest value can print 0x00001. think i'm reading constant pool table wrong i'm not sure wrong it. ideas? following: http://www.murrayc.com/learning/java/java_classfileformat.shtml
so far got:
#include <iostream> #include <fstream> #include <vector> template <typename t> t readpointer(char*& pointer) { t result = *(reinterpret_cast<t*>(pointer)); pointer += sizeof(t); return result; } struct constantpool { int type; std::string name; constantpool* arg1; constantpool* arg2; short index1, index2; std::string strvalue; int intvalue; std::int64_t longvalue; float floatvalue; double doublevalue; constantpool() {} constantpool(char* &pointer) {this->read(pointer);} void read(char* &pointer); }; void constantpool::read(char* &pointer) { switch(type = static_cast<int>(readpointer<std::uint8_t>(pointer))) { case 1: { name = "ascii"; int length = readpointer<short>(pointer); while (length > 0) { char c = readpointer<char>(pointer); strvalue += c; length--; } } break; case 2: { name = "unicode"; int length = readpointer<short>(pointer); while (length > 0) { char c = readpointer<char>(pointer); strvalue += c; length--; } } break; case 3: name = "int"; intvalue = readpointer<double>(pointer); break; case 4: name = "float"; floatvalue = readpointer<float>(pointer); break; case 5: name = "long"; longvalue = readpointer<long>(pointer); break; case 6: name = "double"; doublevalue = readpointer<double>(pointer); break; case 7: name = "class"; index1 = readpointer<short>(pointer); index2 = -1; break; case 8: name = "string"; index1 = readpointer<short>(pointer); index2 = -1; break; case 9: name = "field reference"; index1 = readpointer<short>(pointer); index2 = readpointer<short>(pointer); break; case 10: name = "method reference"; index1 = readpointer<short>(pointer); index2 = readpointer<short>(pointer); break; case 11: name = "interface reference"; index1 = readpointer<short>(pointer); index2 = readpointer<short>(pointer); break; case 12: name = "name , type"; index1 = readpointer<short>(pointer); index2 = readpointer<short>(pointer); break; } } typedef struct { int magicnumber; short minorversion; short majorversion; short constantpoolcount; } classfile; int main() { std::fstream file("animal.class", std::ios::in | std::ios::binary); if (file.is_open()) { file.seekg(0, std::ios::end); std::vector<std::uint8_t> data(file.tellg()); char* ptr = reinterpret_cast<char*>(&data[0]); file.seekg(0, std::ios::beg); file.read(ptr, data.size()); /**check magic number.**/ classfile baseinfo = readpointer<classfile>(ptr); if (baseinfo.magicnumber == 0xbebafeca) { std::cout << "magic number: " << baseinfo.magicnumber << "\n"; std::cout << "minor number: " << baseinfo.minorversion << "\n"; std::cout << "major number: " << baseinfo.majorversion << "\n"; std::cout << "const pool size: " << baseinfo.constantpoolcount << "\n"; std::vector<constantpool> constpool; (int = 0; < baseinfo.constantpoolcount - 1; ++i) { constpool.push_back(constantpool(ptr)); if (constpool.back().type == 5 || constpool.back().type == 6) ++i; } std::cout << "access flags: " << readpointer<short>(ptr); } file.close(); } }
one mistake
intvalue = readpointer<double>(pointer);
you're reading double instead of int, throw else off.
of course code has plenty of other issues too. example, you're ignoring alignment , struct padding issues.
Comments
Post a Comment