亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Java編程中的流氓手段(1)——天下為公

系統(tǒng) 2929 0
程序員應(yīng)是創(chuàng)造者,創(chuàng)造0與1世界中萬物萬象。程序員也應(yīng)是毀滅者,毀滅0與1世界中一切令人厭惡的存在。——cping1982

——————————————————————————————

俗語云“流氓會武術(shù),誰都擋不住”。

在編程的世界中,這種情況依舊存在,而且比之現(xiàn)實世界還有過之而無不及。

不信你看病毒(含木馬)、外掛、流氓插件這許許多多優(yōu)秀程序員的“杰作”充斥互聯(lián)網(wǎng)上,而且愈演愈烈,大有燎原之勢,試問現(xiàn)實世界中,流氓有他們那么囂張嗎?即使那么囂張,發(fā)展能有這么快嗎?

且不但囂張,投身其中的“有志青年”還個個事業(yè)有成,雖然躋身富豪行列者還寥寥可數(shù),比之我等小程序員們,卻也可謂功成名就,家財頗豐了。

但無論再怎么羨慕人家,我們java程序員卻很難做到他們那種“成就”。不是因為咱膽小怕事,而是因為咱搞的java這東西,似乎天生就不是干這些的料,再好的東西寫出來,不加上個jvm就無法運行,也讓人有氣沒處撒,望class興嘆了。

但話說回來,我害不了不用java的,我還害不了用java的?(-_-|||)。即然不能針對沒有jvm的機器,我針對使用jvm的機器下手搞這些“流氓軟件”總可以吧?

于是我決定寫些東西,一步步破壞java常規(guī),總結(jié)些針對java的流氓手段上來“大義滅親”,不為害人,只為防身。
————————————————————————————————————————

今天,我們就先來談?wù)勗趺窗裫ava中討厭的修飾類型抹殺,實現(xiàn)“天下為公”好了。

假如以下這個類是第三方組件,已經(jīng)編譯為class文件,并且沒有公開源代。

package org.loon.virus.test;

public class test {

static public void go(){
System.out.println("0");
}

static private void go1(){
System.out.println("1");
}
static private void go2(){
System.out.println("2");
}

}

這時如果讓你去調(diào)用go函數(shù),不要說程序員,我相信只要你告訴他方法,這世界就沒有做不到的人。

執(zhí)行后,控制臺上會輸出“0”。

但是,我這個人是變態(tài)的,不會讓你去執(zhí)行g(shù)o函數(shù),而讓去執(zhí)行g(shù)o1?看清楚,是private的。可以做到嗎?

我們來試試看吧。(為了再下面的例子,本節(jié)統(tǒng)一用反射執(zhí)行。)

public static void callVoidMethod(Class clazz, String methodName) {
try {
Method method = clazz.getMethod(methodName, null);
method.invoke(clazz, null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public static void main(String[] args) {
callVoidMethod(test.class, "go1");
}

跑個看看~

Java編程中的流氓手段(1)——天下為公

哎,剛學(xué)java的小朋友都知道,私有函數(shù)是不可能在本類外執(zhí)行的。

但是,那是指正常情況而言的,現(xiàn)在我們正常嗎?不,我們已經(jīng)不正常了!

我是流氓我怕誰!私有了不起啊?我偏要執(zhí)行!

這時我們這群流氓就要想想,java的執(zhí)行原理是什么?

混合執(zhí)行,即同時兼具編譯執(zhí)行與解釋執(zhí)行兩者,先將java文件編譯成字節(jié)碼格式,再由Java解釋器解釋字節(jié)碼進(jìn)行執(zhí)行操作。

也就是說,只要class沒有載入虛擬機,我們就能隨心所欲的“收拾它”。

這時,就需要我們從字節(jié)碼上做作文章了。

現(xiàn)在我們做個工具,對class動些手腳,再看看這私有函數(shù)到底允不允許執(zhí)行吧~

package org.loon.virus.test;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

/**
* Copyright 2008
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* @project loonframework
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class Dispark {

static private Set FILELIST = null;

final static String USERHOME = System.getProperty("user.dir");

final static String THISNAME = Dispark.class.getSimpleName();

int _index = 8; // 開始索引

int _entrys = 1; // 大小

int _interfaces = 0; // 接口數(shù)

int _fields = 0; // 字段數(shù)

int _attributes = 0; // 屬性數(shù)

int _methods = 0; // 方法數(shù)

int _list_attributes = 0; // 對比的屬性列表

public Dispark() {
this("");
}

/**
* 加載指定路徑下文件列表
*
* @param path
*/
public void loadFileList(String path) {

File dir = new File(path);
File[] files = dir.listFiles();
if (files == null) {
return;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
loadFileList(files[i].getAbsolutePath());
} else {
FILELIST.add(files[i].getAbsolutePath());
}
}
}

public Dispark(String dir) {
// 獲得對象目錄
String objDir = USERHOME;
if (dir.length() > 0) {
objDir = dir;
}
FILELIST = new HashSet(99);
// 加載指定目錄及其子目錄下所有文件
loadFileList(objDir);
// 獲得指定目錄及其子目錄下所有文件的array
Object[] list = FILELIST.toArray();
// 遍歷目錄
for (int read = 0; read < list.length; read++) {
File entrypath = new File(list[read].toString());
String fileName = entrypath.getName();
// 限制變更條件,愿意擴(kuò)大打擊面就把條件改了,后果自負(fù)……
if ((entrypath.isFile()) && (entrypath.canWrite())
&& (fileName.endsWith("test.class"))
&& !(fileName.equals((THISNAME + ".class").intern()))) {
try {
// 尋找獵物(符合條件的文件)
RandomAccessFile quarry = new RandomAccessFile(entrypath,
"rw");
// 移動文件指針
quarry.seek(_index);
// 從當(dāng)前數(shù)據(jù)輸入流中讀取一個無符號的16位,以此數(shù)找尋標(biāo)識
_entrys = quarry.readUnsignedShort();
// 前進(jìn)索引,到達(dá)下一處字節(jié)位置
_index += 2;
// 根據(jù)目錄數(shù)處理
for (int i = 1; i < _entrys; i++) {
int tag = quarry.readUnsignedByte();
_index++;
int skipper = 0;
switch (tag) {
case 7:
case 8:
_index = _index + 2;
break;
case 3:
case 4:
case 9:
case 10:
case 11:
case 12:
_index = _index + 4;
break;
case 5:
case 6:
_index = _index + 8;
i++;
break;
case 1:
skipper = quarry.readUnsignedShort();
_index = _index + skipper + 2;
break;
}
quarry.seek(_index);
}
// 開始屠殺獵物……
quarry.writeShort(1);
// 索引移動
_index += 6;
quarry.seek(_index);
_interfaces = quarry.readUnsignedShort();
// 確定接口索引
_index = _index + 2 * (_interfaces) + 2;
quarry.seek(_index);
_fields = quarry.readUnsignedShort();
_index += 2;
quarry.seek(_index);
// 遍歷字段,修改
for (int j = 0; j < _fields; j++) {
int flag = quarry.readUnsignedShort();
quarry.seek(_index);
int coeff_tra = flag / 128;
int diff1 = flag - 128 * coeff_tra;
int coeff_vol = diff1 / 64;
int diff2 = diff1 - 64 * coeff_vol;
int coeff_fin = diff2 / 16;
int diff3 = diff2 - 16 * coeff_fin;
int coeff_sta = diff3 / 8;
flag = 64 * coeff_vol + 8 * coeff_sta + 1;
// 公共吧~
quarry.writeShort(flag);
// 再跳
_index += 6;
quarry.seek(_index);
_attributes = quarry.readUnsignedShort();
_index = _index + 8 * (_attributes) + 2;
quarry.seek(_index);
}
// 確定方法數(shù)
_methods = quarry.readUnsignedShort();
_index += 2;
// 逐一修改
for (int k = 0; k < _methods; k++) {
int flag = quarry.readUnsignedShort();
quarry.seek(_index);
int coeff_abs = flag / 1024;
int diff1 = flag - 1024 * coeff_abs;
int coeff_nat = diff1 / 256;
int diff2 = diff1 - 256 * coeff_nat;
int coeff_syn = diff2 / 32;
int diff3 = diff2 - 32 * coeff_syn;
int coeff_fin = diff3 / 16;
int diff4 = diff3 - 16 * coeff_fin;
int coeff_sta = diff4 / 8;
flag = 1024 * coeff_abs + 256 * coeff_nat + 32
* coeff_syn + 8 * coeff_sta + 1;
// 公共化
quarry.writeShort(flag);
// 跳
_index += 6;
quarry.seek(_index);
_list_attributes = quarry.readUnsignedShort();
_index += 2;
for (int m = 0; m < _list_attributes; m++) {
_index += 2;
quarry.seek(_index);
_index = _index + quarry.readInt() + 4;
quarry.seek(_index);
}
}
// 所有的都變了,大功告成
quarry.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

public static void callVoidMethod(Class clazz, String methodName) {
try {
Method method = clazz.getMethod(methodName, null);
method.invoke(clazz, null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public static void main(String[] args) {
Dispark ia = new Dispark();
callVoidMethod(test.class, "go1");
}
}

呵呵,那個private的go1沒了,控制臺再自然不過的打出了本來私有的“1”。

Java中似乎金科玉律的訪問限制,在我等流氓面前,已不復(fù)存在。


下載地址: http://download.csdn.net/source/486830

Java編程中的流氓手段(1)——天下為公


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99久久免费国产香蕉麻豆 | 黄色毛片视频网站 | 亚洲国产精品久久久久网站 | 四虎在线影视在线影库 | 日本三级中文字幕 | 久久成人国产精品二三区 | 黄色综合网站 | 欧美成人xxxx | 特级毛片全部免费播放a一级 | 久久国产精品久久精品国产 | 97影院午夜在线观看琪琪 | 久久一精品 | 成人欧美一区在线视频在线观看 | 日韩欧美视频免费观看 | 日本一区二区日本免费 | 亚洲精品中文字幕久久久久久 | 美日韩免费视频 | 青草视频在线观看免费资源 | 九九视频精品全部免费播放 | 在线观看一区二区精品视频 | 久久泄欲网| 亚洲天堂国产精品 | 免费在线一级毛片 | 国产综合精品 | 精品一区二区三区在线观看视频 | 亚洲 欧美 日韩在线综合福利 | 欧美成人性视频播放 | 国产福利视频奶水在线 | 香蕉国产在线 | 亚洲综合九九 | 青青久久久国产线免观 | 久热这里只有精品在线 | 久草手机视频在线 | 国产成人免费a在线视频色戒 | 羞羞网站免费观看 | 国产网站免费视频 | www.夜夜| 久久综合爱| 亚洲欧美在线中文字幕不卡 | 台湾一级毛片永久免费 | 日本不卡在线观看 |