反編譯obj
Ⅰ 混淆的class文件怎麼進行反編譯
一般情況下java應用的開發者為了保護代碼不被別人抄襲,在生成class文件的時候都java文件進行了混淆,這種class文件用反編譯工具得到的結果很難看懂,並且不能進行編譯。
從研究的角度,淺析如何讀懂這種反編譯過來的文件。
例子一:賦值
反編譯過來的代碼如下:
Node node;
Node node1 = _$3.getChildNodes().item(0);
node1;
node1;
JVM INSTR swap ;
node;
getChildNodes();
0;
item();
getChildNodes();
0;
item();
getNodeValue();
String s;
s;
原始語句:
Node node;
Node node1 = currDocument.getChildNodes().item(0);
node = node1;
String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
註解:
JVM INSTR swap ; //賦值語句
練習:
String s1;
String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
s8;
s8;
JVM INSTR swap ;
s1;
10;
Integer.parseInt();
int i;
i;
例子二:不帶參數創建對象
反編譯過來的代碼如下:
JVM INSTR new #244 ;
JVM INSTR p ;
JVM INSTR swap ;
CrossTable();
CrossTable crosstable;
crosstable;
原始語句:
CrossTable crosstable = new CrossTable();
註解:
練習:
JVM INSTR new #246 ;
JVM INSTR p ;
JVM INSTR swap ;
Database();
Object obj;
obj;
例子三:帶參數創建對象
反編譯過來的代碼如下:
JVM INSTR new #262 ;
JVM INSTR p ;
JVM INSTR swap ;
String.valueOf(s2);
StringBuffer();
s.substring(j, i);
append();
s6;
append();
toString();
s2;
原始語句:
s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString();
註解:
此語句實際上是:s2 += s.substring(j, i) + s6;
練習:
例子四:for循環
反編譯過來的代碼如下:
int k = 0;
goto _L4
_L8:
...
k++;
_L4:
if(k < as.length) goto _L8; else goto _L7
原始語句:
for(int k=0;k < as.length;k++)
{
...
}
註解:
例子五:while循環
反編譯過來的代碼如下:
String s1 = "";
goto _L1
_L3:
JVM INSTR new #262 ;
JVM INSTR p ;
JVM INSTR swap ;
String.valueOf(s1);
StringBuffer();
_$2(resultset, s, l);
append();
toString();
s1;
_L1:
if(resultset.next()) goto _L3; else goto _L2
原始語句:
String s1 = "";
while(resultset.next())
{
s1 = s1 + resultSetToString(resultset, s, l);
}
Ⅱ 已知一個程序是C++編寫的,有沒有辦法把她恢復成C++源代碼
C/C++程序(.c/.cpp),首先會進行預編譯,編譯後還是C/C++程序(.i)。這個結果會再進行編譯,結果會是匯編代碼文件(.s)。匯編代碼文件再進行匯編,結果會是可重定位的目標文件(.obj)。可重定位的目標文件再進行鏈接。結果就會產生可執行的目標文件,也就是通常win32平台上的.exe文件。
對於.exe或者.obj文件,我們可以通過反編譯工具(如Unix下的objmp)把它們還原成匯編代碼文件。但是再要往上一步,從編譯原理的角度來說,就很困難了。目前這樣的工具我還沒聽說過。
Ⅲ java強制類型轉換:int i = (int)obj轉換過程是怎樣的
因為有Integer這個包裝類,
如圖是使用javap -c xx.class命令查看的反編譯代碼,Obj 1 = 1;其實是Obj 1 = Integer.valueOf(1);obj轉int其實是obj轉Integer再調用intvalue()方法轉換成int類型