论黑产黑阔如何安全地转移赃款/洗钱?

xiaolan · 2014/06/26 12:27

0x00 背景


相信曾经与黑色产业打过交道的同鞋们对这个话题并不陌生。赃款转移,是黑色产业链中最重要的一环,因为这一环直接与黑阔们的收入息息相关。赃款转移地太过安全,容易产生巨额手续费/汇率而导致收入减少。赃款转移不够安全,容易导致水表被查,也就是那句:有命赚钱没命花钱。

下面将会在此文章中谈谈我曾经见过的黑钱转移手段以及自己的分析。各位看官娱乐娱乐即可,请不要将黑产的魔掌伸向普通老百姓,也请各位黑产黑阔们在洗别人银行卡的时候分析下对方的家境,毕竟“盗亦有道”。

0x01 细节


下面我们来从经济方面分析(即不考虑网监对黑阔进行技术侦查或黑阔完全隐蔽了自己的身份):

首先,我朝的黑阔收黑钱主要是两种渠道:支付宝以及银行黑卡

现在注册支付宝以及银行开户都要有本人的身份证,手机绑定等。既然有了身份证以及手机绑定,当局有实权部门即可轻易定位到有关人员,并上门查水表。所以黑产黑阔们首先要做的,就是买一个非自己身份开户的支付宝/银行卡

这些收款账户如何来呢?笔者尝试在谷歌上搜索“出售支付宝”并限定时间为2014-01-01 - 今天

共有389,000 除去骗子至少应该还有几千家店铺在出售支付宝账户。很多黑产黑阔直接就去购买了,可这样就会留下一个安全隐患

大概流程图如下:

当然如果警察这样追查的话也很容易就抓获黑阔(如果黑阔在ip方面,后门软件方面,社交关系方面均无任何弱点)

这类售号商家一般都是真实ip 或者 直接就是到偏远地区收购身份证的方法。 警方只需对售号商家进行调查,即可通过转账记录查到黑阔,流程如下:

所以在购买黑卡/黑支付宝的时候要经过一个特殊的步骤:将白钱洗为黑钱

首先需要注册一个虚拟货币平台账户,如比特币平台,Ripple,WebMoney,Perfect Money

然后通过境外的货币兑换网络将白钱兑换为黑钱

在这样的条件下,只要货币兑换中心的服务器未被拿下,在货币兑换之后即属无人监管状态。如果仍然不放心,可以多次进行步骤重复,但是要注意汇率。

在购买支付宝的时候,直接将虚拟货币通过另一个兑换平台打到卖家卡中

这样购买获得的黑支付宝帐号即属于无任何关联性,即使警方将黑卡商家带走调查,也完全无法查出黑产黑阔的真实身份

而目前,支付宝很大一部分都需要手机绑定,但是其支持海外手机号绑定:

而海外手机号虚拟号多如牛毛,因此手机号绑定问题可以完全忽略不计。

如何将赃款/黑钱洗为白钱?

首先,将支付宝中的黑钱转换到兑换商(目前支持支付宝的兑换商很多,谷歌一下能出不少结果)

然后通过兑换商将黑钱转到虚拟货币平台中

再利用虚拟货币平台内部账户转移

通过另一个兑换商(可以为海外兑换商)走银行电汇或西联等方式转移到你的名下。

具体流程如下:

这样的话,警方通过黑钱去向追查,也只能查到你在虚拟货币平台帐号为A的用户,无法追查到你在该平台B的账户,如果将黑钱分段转移,更能增加警方对侦破此类案件的难度。至此,白->黑,黑->白的流程就实现了。

但是,目前仍然有许多要解决的问题:

1.支付宝商家的可信度。 
2.兑换商的汇率坑。 
3.IP地址/后门软件/社会关系的身份隐蔽。 
4.兑换商的信息安全是否到位 
复制代码

谢谢阅读!

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 图书管理系统 { public partial class Register : Form { public static List enders = new List(); public static ListmangerEnders = new List(); public Register() { InitializeComponent(); enders.Add(new Ender { admin = “asdasd”, codes = “123123” }); mangerEnders.Add(new MangerEnder { Mangeradmin = “asdqwe”, Mangercodes = “111111”}); } private void button1_Click(object sender, EventArgs e) { bool flage=false; for (int i = 0; i <mangerEnders.Count; i++) { if ((textBox1.Text == mangerEnders[i].Mangeradmin && textBox2.Text == mangerEnders[i].Mangercodes) || (textBox1.Text == enders[i].admin && textBox2.Text == enders[i].codes)) { new Form1().Show(); this.Close(); flage=false; } } if (flage!=false) { MessageBox.Show("账号或者密码错误,请重新输入", "登录", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void button2_Click(object sender, EventArgs e) { new Login().Show(); } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _04Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string userName = "全款5"; string passWord = "999999"; string nickName = "赃款"; string insertSQL = $"insert into Table_1 values('{userName}','{passWord}','{nickName}')"; int count = EditData(insertSQL); if (count > 0) { Console.WriteLine("新增成功"); } else if (count <= 0) { Console.WriteLine("新增失败"); } string selectSQL = "select * from Table_1"; DataTable aa = SelectData(selectSQL); foreach (DataRow item in aa.Rows) { Console.WriteLine($" {item["UserName"]} ---- {item["PassWord"]} --- {item["NickName"]}"); } } public static int EditData(string sql) //增 删的方法 { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Server=localhost\\SQLEXPRESS;Database=Text2;Trusted_Connection=true"; conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); int count = 0; try { count = cmd.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("----------------------" + ex); count = 0; } conn.Close(); return count; } public static DataTable SelectData(string sql) { SqlConnection conn = new SqlConnection(); //通过指定属性的方式直接赋值 //SQLEXPRESS //要连接的数据 要操作的数据库文件 采用window账号 密码的方式 conn.ConnectionString = "Server=localhost\\SQLEXPRESS;Database=Text2;Trusted_Connection=true"; //最后一个参数表示默认的连接方式 conn.Open(); //打开数据库 //写执行的命令 SqlCommand cmd = new SqlCommand(sql, conn); //指定一下是由哪个数据库执行的哪个命令 //把语句提交之后,得到一个返回的结果 SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = cmd; //表格 DataSet dataSet = new DataSet(); adapter.Fill(dataSet); DataTable table = dataSet.Tables[0]; //搞个变量接收一下最终的返回信息 conn.Close(); //关闭数据库 return table; } } } 将数据库带入到登录代码
最新发布
09-05
你的代码目前有两个类:`Register`(登录窗口)和`Form1`(主界面)。其中`Form1`实现了数据库的连接、数据插入和查询功能,但`Register`类中并没有使用数据库进行验证,而是硬编码了用户名和密码。 下面我将帮助你将数据库功能整合到登录逻辑中,使其能够从数据库中读取用户名和密码进行验证。 --- ### ✅ **修改目标** 1. 使用数据库验证登录信息。 2. 将登录逻辑从硬编码改为从数据库中查询。 --- ### ✅ **1. 数据库结构** 假设你有一个数据库`Text2`,其中有一张用户表`Users`,结构如下: ```sql CREATE TABLE Users ( ID INT PRIMARY KEY IDENTITY(1,1), UserName NVARCHAR(50), PassWord NVARCHAR(50), UserType NVARCHAR(20) -- 可以是 "Admin" 或 "User" ); ``` --- ### ✅ **2. 修改登录逻辑(Register.cs)** 我们将使用数据库查询来判断用户名和密码是否正确: ```csharp using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace 图书管理系统 { public partial class Register : Form { public Register() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string username = textBox1.Text; string password = textBox2.Text; string sql = $"SELECT COUNT(*) FROM Users WHERE UserName='{username}' AND PassWord='{password}'"; int count = DBHelper.GetScalar(sql); if (count > 0) { MessageBox.Show("登录成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); new Form1().Show(); this.Hide(); } else { MessageBox.Show("账号或者密码错误,请重新输入", "登录", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void button2_Click(object sender, EventArgs e) { new Login().Show(); this.Hide(); } } } ``` --- ### ✅ **3. 数据库帮助类(DBHelper.cs)** 创建一个数据库帮助类来简化数据库操作: ```csharp using System.Data; using System.Data.SqlClient; public class DBHelper { private static string connectionString = "Server=localhost\\SQLEXPRESS;Database=Text2;Trusted_Connection=true"; public static DataTable Query(string sql) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } public static int GetScalar(string sql) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); return Convert.ToInt32(cmd.ExecuteScalar()); } } public static int ExecuteNonQuery(string sql) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); return cmd.ExecuteNonQuery(); } } } ``` --- ### ✅ **4. 登录页面 Login.cs(可选)** 如果你还有一个注册页面(`Login.cs`),也可以使用类似的逻辑来插入用户信息到数据库中: ```csharp private void button1_Click(object sender, EventArgs e) { string username = textBox1.Text; string password = textBox2.Text; string userType = "User"; // 默认为普通用户 string insertSQL = $"INSERT INTO Users (UserName, PassWord, UserType) VALUES ('{username}', '{password}', '{userType}')"; int count = DBHelper.ExecuteNonQuery(insertSQL); if (count > 0) { MessageBox.Show("注册成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); new Register().Show(); this.Close(); } else { MessageBox.Show("注册失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` --- ### ✅ **解释说明** - `DBHelper` 是一个数据库操作帮助类,封装了常用的数据库操作,如查询、插入、删除等。 - 登录逻辑不再使用硬编码,而是从数据库中查询。 - 使用参数化查询可以避免 SQL 注入攻击(本例未使用参数化查询是为了保持代码清晰,建议在实际项目中使用)。 --- ### ✅ **完整流程图** ``` 登录页面(Register.cs) ↓ 输入用户名和密码 ↓ 使用 DBHelper 查询数据库 ↓ 验证成功 → 显示主界面(Form1.cs) 验证失败 → 弹出错误提示 ``` --- ### ✅ **相关问题**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值