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

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

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

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

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

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

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

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

但無論再怎么羨慕人家,我們java程序員卻很難做到他們那種“成就”。不是因?yàn)樵勰懶∨率拢且驗(yàn)樵鄹愕膉ava這東西,似乎天生就不是干這些的料,再好的東西寫出來,不加上個(gè)jvm就無法運(yùn)行,也讓人有氣沒處撒,望class興嘆了。

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

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

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

假如以下這個(gè)類是第三方組件,已經(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");
}

}

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

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

但是,我這個(gè)人是變態(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");
}

跑個(gè)看看~

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

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

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

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

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

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

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

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

現(xiàn)在我們做個(gè)工具,對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ù)輸入流中讀取一個(gè)無符號的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");
}
}

呵呵,那個(gè)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元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月婷婷网站 | 欧美色综合| free性欧美极度另类超级大 | 国产日韩久久久精品影院首页 | 91中文字幕视频 | 另类婷婷 | 青青草免费视频在线播放 | 国产午夜免费视频 | 五月婷婷免费视频 | 99热久久这里只有精品 | 免费超级淫片日本高清视频 | 亚洲精品456| 精品福利在线视频 | 亚洲热线99精品视频 | 男女啪啪网站 | 一级女人18毛片免费 | 爱爱小视频免费 | 一级bbbbbbbbb毛片 | 狠狠色噜噜狠狠狠狠网站视频 | 亚州在线播放 | 日韩最新中文字幕 | 久久66热这里只会有精品 | 国产精品视频成人 | 性短视频在线观看免费不卡流畅 | 免费观看一级特黄欧美大片 | 国产成人综合自拍 | 一级日本强免费 | 欧美一级一毛片 | 国产精品视频在线播放 | 国产精彩视频在线 | 天天色狠狠干 | 狠狠色丁香婷婷久久综合不卡 | 欧美在线不卡 | 日韩久久久精品首页 | 特黄特黄一级高清免费大片 | 99视频全部免费 | 日本欧美高清视频 | 日本爱爱免费视频 | 亚洲精品国产一区二区三区在 | 久久免费精品视频 | 久久99热精品免费观看k影院 |